Storm - 同一台机器的字段分组?

Storm - fields grouping for same machine?

  1. 我用fields grouping和storm。
  2. 问题是,因为我有多台机器和多个螺栓(很明显),所以 tuple 在机器之间移动,我怀疑这会大大降低我的性能。
  3. 是否可以将特定字段分组结果特定于特定机器?
  4. 或在字段分组的更多细节中 account1 对所有螺栓保持粘性 machine1 对于 account2 machine3 对于 account3 对所有螺栓保持粘性到 machine1 等等,每个 account 的所有螺栓 运行 都在特定的一台机器上?
  5. 请注意,一旦第一个 bolt 处理了事件,它就会在其输出元组中发出 accountid 从那一点开始的所有进一步 boltsaccountid 意味着我会想从那一点开始 field grouping 并在 accountid 上做 topology 中的进一步 bolts。 (在看到第一个答案后添加澄清)

假设您有 3 个生产者 P1、P2、P3 和三个消费者 C1、C2、C3 和 3 台机器,每台机器都托管一个生产者-消费者对,即 P1-C1。此外,假设您有 3 个不同的键值 a,b,c。此外,假设 C1 处理所有具有键 a.

的元组

通常,所有三个生产者都可以发出键为 a 的元组。此外,P1 也可以发出带有键 bc 的元组。因此,您不能使用字段分组将数据传输限制到本地机器,您需要重新分区所有数据。

分机

如果您有额外的螺栓 B1 到 B3,它们使用从 C1 到 C3 的数据,并且这些螺栓使用与 C1 到 C3 相同的字段分组键(即,Bx 可以利用 Cx 中已经给定的分区),您将需要确保 B1 到 B3 与 C1 到 C3 位于同一台机器上并避免重新分区。可以通过向 Storm 提供自定义调度程序来实现协同定位。示例见此处:https://xumingming.sinaapp.com/885/twitter-storm-how-to-develop-a-pluggable-scheduler/

但是,您不能使用字段分组来连接 B1->C1 等,因为字段分组对于运算符共置和已经给定的分区数据是不可知的(它只会再次重新分区该数据)。相反,您需要使用直接分组或自定义分组来确保将来自 B1 的所有数据发送到 C1 等。

localOrShuffleGrouping 有帮助吗? https://github.com/apache/storm/blob/a4f9f8bc5b4ca85de487a0a868e519ddcb94e852/storm-core/src/jvm/org/apache/storm/topology/TopologyBuilder.java#L360