Storm的Grouping有哪些
Storm的Grouping有哪些
这篇文章主要介绍“Storm的Grouping有哪些”,在日常操作中,相信很多人在Storm的Grouping有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Storm的Grouping有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
##Storm Grouping
shuffleGrouping
将流分组定义为混排。这种混排分组意味着来自Spout的输入将混排,或随机分发给此Bolt中的任务。shuffle grouping对各个task的tuple分配的比较均匀。
fieldsGrouping
这种grouping机制保证相同field值的tuple会去同一个task,这对于WordCount来说非常关键,如果同一个单词不去同一个task,那么统计出来的单词次数就不对了。
All grouping
广播发送, 对于每一个tuple将会复制到每一个bolt中处理。
Global grouping
Stream中的所有的tuple都会发送给同一个bolt任务处理,所有的tuple将会发送给拥有最小task_id的bolt任务处理。
None grouping
不关注并行处理负载均衡策略时使用该方式,目前等同于shuffle grouping,另外storm将会把bolt任务和他的上游提供数据的任务安排在同一个线程下。
Direct grouping
由tuple的发射单元直接决定tuple将发射给那个bolt,一般情况下是由接收tuple的bolt决定接收哪个bolt发射的Tuple。这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)
##fieldsGrouping
如果你了解Storm,我想你能明白其中的大多数Grouping。这里的Grouping策略我想着重介绍一下fieldsGrouping,也最难理解的。
fieldsGrouping是按照数据中字段Field的值分组的。下面是我的测试代码:
TopologyBuilderbuilder=newTopologyBuilder();builder.setSpout("words",newTestWordSpout(),2);builder.setBolt("exclaim2",newDefaultStringBolt(),5).fieldsGrouping("words",newFields("word"));
测试的例子Spout是Storm自带的例子,Blot代码如下:
publicvoidexecute(Tupletuple){log.info("revamessage:"+tuple.getString(0));collector.emit(tuple,newValues(tuple.getString(0)+"!!!"));collector.ack(tuple);}publicvoiddeclareOutputFields(OutputFieldsDeclarerdeclarer){declarer.declare(newFields("word"));}
Storm自带的例子Spout能随机的返回<code>new String[] {"nathan", "mike", "jackson", "golda", "bertels"};</code>列表中的几个字符串。这也是测试FieldGroup的好例子。
按照我最早做Storm开始前的理解,既然是按照Field分组,那么是所有相同的Field值得数据都会到达一个Blot的。我测试很多次,其结果并不是这样,一个Blot会收到多个不同的值。我没有仔细探究Storm这样分组有什么特别的地方,以至于自己对Storm的学习停滞了很长时间。
Storm能保证所有相同Field值的数据到达的是相同的Blot,但是不保证一个Blot只处理一个值域。
也就是说,所有值是nathan能到达到一个Blot,但是到达同一个Blot的值可能有多个,如"nathan", "mike"的数据都到达。
理解到这点上,fieldsGrouping就算是理解了。
下面是测试日志:
9144[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:bertels9234[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:mike9245[Thread-33-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:nathan9335[Thread-26-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:golda9346[Thread-26-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:golda9437[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:jackson9447[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:mike9537[Thread-26-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:golda9548[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:jackson9639[Thread-33-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:nathan9649[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:jackson9740[Thread-33-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:nathan9749[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:jackson9841[Thread-35-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:bertels9850[Thread-26-exclaim2]INFOcn.pointways.dstorm.bolt.DefaultStringBolt-revamessage:golda
由上面的日志可以看出,golda这个值的数据,的确归并到一个Blot处理的。线程编号:Thread-26-exclaim2。 其它值也都是相同值都是在一个线程内被处理的。
到此,关于“Storm的Grouping有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!
推荐阅读
-
storm实时排序TopN怎么使用
-
Storm怎么写一个爬虫
Storm怎么写一个爬虫这篇文章主要讲解了“Storm怎么写一个爬...
-
怎么用Storm IPResolutionBolt写爬虫
怎么用StormIPResolutionBolt写爬虫本篇内容介...
-
Storm RandomURLSpout怎么使用
StormRandomURLSpout怎么使用本篇内容介绍了“S...
-
如何用Storm来写一个Crawler的工具
-
Storm开发细节是什么
-
Storm的Acker机制是什么
Storm的Acker机制是什么这篇文章主要讲解了“Storm的A...
-
storm drpc怎么定义
stormdrpc怎么定义本篇内容介绍了“stormdrpc怎...
-
storm使用要注意哪些点
storm使用要注意哪些点这篇文章主要讲解了“storm使用要注意...
-
storm topology优化思路是什么
stormtopology优化思路是什么本篇内容主要讲解“sto...