这是一个关于风暴的最大喷口如何工作的问题。我目前有一个读取文件的spout并为文件中的每一行发出一个元组(我知道storm不是处理文件的最佳解决方案,但我没有选择这个问题)。我将max spout pending设置为50k,以限制要处理的拓扑中有多少元组。但是,我看到这个数字在拓扑中没有任何影响。我看到每次都会发出文件中的所有记录。我猜这可能是因为我在nextTuple方法中有一个循环,它发出文件中的所有记录。所以我的问题是风暴刚刚达到max spout pending时停止调用spout任务的下一个元组?这是否意味着我每次调用nextTuple时都应该只发出一个元组?
答案 0 :(得分:18)
完全!风暴只能用下一个命令来限制你的喷口,所以如果你在接下来的第一个命令时传输了所有东西,那么风暴就无法控制你的喷口。
Storm开发人员建议使用单个next命令发出单个元组。然后,Storm框架将根据需要限制您的喷口,以满足“最大喷口待定”要求。如果你发出大量的元组,你可以将你的排放量最多批量计入最大喷口的十分之一,以给予Storm一定的节流机会。
答案 1 :(得分:16)
Storm拓扑具有最大spout挂起参数。最大 可以通过以下命令配置拓扑的spout挂起值 拓扑中的“topology.max.spout.pending”设置 配置yaml文件。该值限制了多少 元组可以在飞行中,即尚未被激活或失败,在一个 任何时间点的风暴拓扑。需要这个参数 来自Storm使用ZeroMQ进行调度的事实 从一个任务到另一个任务的元组。如果消费者方面 ZeroMQ无法跟上元组率,然后是 ZeroMQ队列开始建立。最终元组超时 喷出并重放到拓扑结构,从而增加了压力 在队列上。为了避免这种病态失败的情况,风暴 允许用户限制其中的元组数量 在拓扑中飞行。 此限制对每个喷口任务生效 基础,而不是拓扑级别。(source)对于鲸鱼喷水的情况 这是不可靠的,即它们不会在元组中发出消息ID 价值没有影响。 Storm用户不断面临的一个问题是 为这个最大喷口待定提供正确的值 参数。一个非常小的值很容易使拓扑结构变得饥饿 足够大的值可能会使拓扑过载 导致失败和重放的元组数量。 用户必须经历多次拓扑迭代 具有不同最大spout挂起值的部署以查找 最适合他们的价值。
答案 2 :(得分:0)
一种解决方案是在nextTuple方法之外构建输入队列,而nextTuple中唯一要做的就是轮询队列并发出。如果您正在处理多个文件,则nextTuple方法还应检查轮询队列的结果是否为空,如果是,则自动重置填充队列的源文件。