复习总结05:Storm

来源:互联网 发布:php如何防止sql注入 编辑:程序博客网 时间:2024/06/07 04:53
一、流式计算概述:

流式计算:数据实时产生、数据实时传输、数据实时计算、实时展示。也是区别于离线计算的特点。

代表技术:Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(MySQL)

将源源不断产生的数据实时收集并实时计算,尽可能快的得到计算结果


二、Storm概述:

实时处理大数据框架,具有低延迟、高可用、分布式、可扩展、数据不丢失的特点。

Storm:实时计算,处理的数据保存在内存中,数据通过网络传输。

Hadoop:离线计算,处理的数据保存在hdfs上,数据保存在磁盘中。

                        

                             Storm集群图解                                                                           Storm编程框架

        

 
 三、编程框架
open -->>Spout-->>nextTuple—>—prepare-->>Bolt-->>execute——prepare…………
由统计单词计数想到的:对于计数,多一个Bolt来处理(word,1),简便了计数的逻辑复杂性。

①Spout:继承BaseRichSpout
open():确定输出集合;    SpoutOutputCollector的对象
nextTuple():确定发射内容;
declareOutputFields():声明输出类型

②Bolt:继承BaseRichBolt
prepare():确定输出集合对象;    OutputCollector的对象
execute():把接收到的数据处理;
declareOutputFields():声明输出类型

备注:declareOutputFields()如果不是处理的终点,一定要声明输出的字段。
因为下一级读取可能会对某字段进行分组--Fields Grouping(按字段分组)
③TopologyMain:
config.setNumWorkers(2); 设置用来执行topology程序的进程数,
在builder.setSpout()/setBolt()方法中是设置各个组件的线程

四、关于Bolt的取数据的分组
①Shuffle Grouping: 随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。
Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts的task。
②All Grouping:广播发送,对于每一个tuple,所有的bolts都会收到。
③Global Grouping:全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
④Non Grouping:不分组,这stream grouping个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
⑤Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。

⑥Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。


五、编程图解

 
六、Storm提交任务
在TopologyMain中设置了进程与线程: 进程Worker Processes线程Threads。一个进程包含一个或多个线程;一个线程包括一个或多个任务。
并行度==Task==Threads  
 
七、Storm集群模式
maven 当用maven install生成最终的构件包project.jar后,WEB-INF/lib会包含被标注为scope=compile的构件的jar包,而不包含被标注为scope=provided的构件的jar包。避免此类构件当部署到目标容器后产生包依赖冲突。
所以集群模式时,用的是Linux上的storm包,此时要加上scope=provided,不将该包添加进去。
提交后,执行 storm jar test.jar cn.itcast.storm.wordcount.topologyMain
在storm的UI上观测各个组件的线程数量,以及运行的机器,及其端口号