再探Apache Storm(3)---各种Grouping

在前面的文章再探Apache Storm(2)—Topology拓扑里,提到了数据流动的复杂方向,那么如何满足各种复杂的需求呢?

Apache Storm中,系统使用Stream Grouping来决定数据是如何流动的。

Shuffe Grouping

Shuffle Grouping应该是最常用的grouping策略了,各个bolt之间没有差异,tuple交给谁处理都行,例如在word count程序中,一个句子可以让任意一个bolt来分割,不影响最终的结果。

Shuffle Grouping的策略就是随机的从下游bolt中选择一个来处理这个tuple。

Fields Grouping

有的情况下,例如我们需要统计每一个单词出现的次数,并且最后一环的bolt数目不止一个,那么我们就需要保证同一个单词会被同一个bolt处理,这种情况下,就需要Fields GroupingFields Grouping在选择bolt的时候会先根据用户定义的字段来进行哈希操作,然后根据结果来选定一个bolt,哈希的结果保证了该字段一致的tuple一定会被同一个bolt所处理。

1
2
builder.setSpout("1", new TweetSpout());
builder.setBolt("2", new TweetCounter()).fieldsGrouping("1", new Fields("username"))

All Grouping

与其他Grouping方式不同,All Grouping不仅仅是选择一个bolt,而是把消息复制然后分发给所有的bolt一起处理,这种grouping方式可以用于广播一些命令,如告知下游的bolt将当前的统计结果更新到数据库中。简而言之,All Grouping是一个广播。

1
2
3
builder.setSpout("1", new TweetSpout());
builder.setSpout("signals", new SignalSpout());
builder.setBolt("2", new TweetCounter()).fieldsGrouping("1", new Fields("username")).allGrouping("signals");

Custom Grouping

如果期待的grouping较为复杂,很难用已有的简单grouping方式实现的话,就可以自己实现一个grouping策略,例如要根据多个字段进行复杂的组合操作。

Direct Grouping

由上游bolt决定发送到哪一个bolt,一般情况下这是因为只有该bolt具有处理这个tuple的资源和能力。

Global Grouping

所有tuple都交由同一个下游bolt处理。这个初看上去是一个多余的grouping,因为完全可以通过设置一个并发度为1的bolt来做到,但是一个bolt可能会处理多种流,而其中只有一种流会需要reduce操作。

1
2
3
4
5
6
7
builder.setSpout("a", new SpoutA());
builder.setSpout("b", new SpoutB());
builder.setBolt("c", new BoltC());
builder.setBolt("e", new BoltE());
builder.setBolt("d", new BoltD())
.globalGrouping("c")
.shuffleGrouping("e");

apache storm global-grouping

总结

Apache Storm 通过这几个基本的Grouping策略,实现了复杂的数据流动控制。

参考

Getting Started with Storm

Learning Storm