本文介绍了在Apache Storm中数据是如何在节点间流动的
在前面的文章再探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 Grouping
。Fields Grouping
在选择bolt的时候会先根据用户定义的字段来进行哈希操作,然后根据结果来选定一个bolt,哈希的结果保证了该字段一致的tuple一定会被同一个bolt所处理。
1 | builder.setSpout("1", new TweetSpout()); |
All Grouping
与其他Grouping方式不同,All Grouping
不仅仅是选择一个bolt,而是把消息复制然后分发给所有的bolt一起处理,这种grouping方式可以用于广播一些命令,如告知下游的bolt将当前的统计结果更新到数据库中。简而言之,All Grouping
是一个广播。
1 | builder.setSpout("1", new TweetSpout()); |
Custom Grouping
如果期待的grouping较为复杂,很难用已有的简单grouping方式实现的话,就可以自己实现一个grouping策略,例如要根据多个字段进行复杂的组合操作。
Direct Grouping
由上游bolt决定发送到哪一个bolt,一般情况下这是因为只有该bolt具有处理这个tuple的资源和能力。
Global Grouping
所有tuple都交由同一个下游bolt处理。这个初看上去是一个多余的grouping,因为完全可以通过设置一个并发度为1的bolt来做到,但是一个bolt可能会处理多种流,而其中只有一种流会需要reduce操作。
1 | builder.setSpout("a", new SpoutA()); |
总结
Apache Storm 通过这几个基本的Grouping策略,实现了复杂的数据流动控制。