MapReduce和Storm框架进行单词统计时的区别:
1)MapReduce是典型的批处理系统,Storm是流计算系统
在数据的采集阶段,流计算将数据暂存至消息队列中,批处理将消息采集进分布式文件系统中,在该环节并没有多大区别,然而数据的计算阶段,流数据采用在数据进入流计算系统时对数据进行运算,批处理将会攒一波数据,然后导入到计算系统中,就会有延时的区别。
(2)在数据的计算阶段,Storm的时延低是因为(1)Storm是常驻的,有(2)数据就可以进行实施的处理;MapReduce是攒一批数据以后启动系统任务(2)Storm计算每个单元之间数据的之间通过网络直接传输;MapReduce计算任务的结果要写入HDFS,是通过网络拖过去运算,相对来说是多了磁盘读写,比较慢。MapReduce由MR过程组成,有些的map是没有意义的。
(3)在数据的结果展示方面,Storm是将运算的结果直接反馈到结果集中,MapReduce一般是运算结束后将结果批量导入到结果集中。
Strom框架中的单词统计Topology定义如下,其中定义了两个Bolt,试述两个Bolt各自完成的功能,以及中间结果如何在两个Bolt之间传输
TopologyBuilder builder = new TopologyBuilder();
Builder.setSpout(“sentences”,new RandomSentenceSpout(),5);
builder.setBolt(“split”,new SolitSentence(),8)
.shuffleGrouping(“sentences”);
builder.setBolt(“cout”,new WordCount(),12)
.fieldsGrouping(“split”,new Fields(“word”));
Builder.setSpout()方法对数据源进行定义,第一个参数表示Stream的名称,第二个参数表示处理的具体函数,第三个参数表示的是并发数。Bolt中的builder.setBolt()与上面的Builder.setSpout()类似,同时每个Bolt使用了Groupings()系列方法定义了Tuple的发送方式。
在此问题中,第一个Bolt用于单词的分割,该Bolt中的任务随机接受Spout发送的句子,并从接受的句子中提取出单词;第二个Bolt接受第一个Bolt发送的Tuple并进行处理(Bolt是通过订阅Tuple的名称来进行接受相应的数据的,第一个Bolt声明其输出Stream的名称是“split”,而第二个Bolt声明其订阅的Stream为“split”,因此第二个可以接受到第一个的Tuple),即分割以后单词出现的次数。