- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Chapter厦门大学林子雨大数据技术原理与应用第八章流计算
8.4.3 Storm设计思想 Bolts:Storm将Streams的状态转换过程抽象为Bolts。Bolts即可以处理Tuple,也可以将处理后的Tuple作为新的Streams发送给其他Bolts。对Tuple的处理逻辑都被封装在Bolts中,可执行过滤、聚合、查询等操作 8.4.3 Storm设计思想 Topology:Storm将Spouts和Bolts组成的网络抽象成Topology,它可以被提交到Storm集群执行。Topology可视为流转换图,图中节点是一个Spout或Bolt,边则表示Bolt订阅了哪个Stream。当Spout或者Bolt发送元组时,它会把元组发送到每个订阅了该Stream的Bolt上进行处理 8.4.3 Storm设计思想 Stream Groupings:Storm中的Stream Groupings用于告知Topology如何在两个组件间(如Spout和Bolt之间,或者不同的Bolt之间)进行Tuple的传送。每一个Spout和Bolt都可以有多个分布式任务,一个任务在什么时候、以什么方式发送Tuple就是由Stream Groupings来决定的 8.4.3 Storm设计思想 Stream Groupings示意图:箭头表示Tuple的流向,而圆圈则表示任务 8.4.3 Storm设计思想 目前,Storm中的Stream Groupings有如下几种方式: Shuffle Grouping:随机分组,随机分发Tuple Fields Grouping:按字段分组,具有相同值的Tuple会被分发到对应的Bolt All Grouping:广播分发,每个Tuple都会被分发到所有Bolt中 Global Grouping:全局分组,Tuple只会分发给一个Bolt Non Grouping:不分组,与随机分组效果类似 Direct Grouping:直接分组,由Tuple的生产者来定义接收者 8.4.4 Storm框架设计 Storm运行任务的方式与Hadoop类似:Hadoop运行的是MapReduce作业,而Storm运行的是“Topology” 但两者的任务大不相同,主要的不同是:MapReduce作业最终会完成计算并结束运行,而Topology将持续处理消息(直到人为终止) Storm集群采用“Master—Worker”的节点方式: Master节点运行名为“Nimbus”的后台程序(类似Hadoop中的“JobTracker”),负责在集群范围内分发代码、为Worker分配任务和监测故障 Worker节点运行名为“Supervisor”的后台程序,负责监听分配给它所在机器的工作,即根据Nimbus分配的任务来决定启动或停止Worker进程 Storm使用Zookeeper来作为分布式协调组件,负责Nimbus和多个Supervisor之间的所有协调工作。借助于Zookeeper,若Nimbus进程或Supervisor进程意外终止,重启时也能读取、恢复之前的状态并继续工作,使得Storm极其稳定 8.4.4 Storm框架设计 Storm集群架构示意图 8.4.4 Storm框架设计 基于这样的架构设计,Storm的工作流程如下图所示: Storm工作流程示意图 8.4.5 Storm实例 我们以单词统计的实例来加深对Storm的认识 Storm的编程模型非常简单,如下代码即定义了整个单词统计Topology的整体逻辑 8.4.5 Storm实例 Topology中仅定义了整体的计算逻辑,还需要定义具体的处理函数。具体的处理函数可以使用任一编程语言来定义,甚至也可以结合多种编程语言来实现 如SplitSentence()方法虽然是通过Java语言定义的,但具体的操作可通过Python脚本来完成 8.4.5 Storm实例 Python脚本splitsentence.py定义了一个简单的单词分割方法,即通过空格来分割单词。分割后的单词通过emit()方法以Tuple的形式发送给订阅了该Stream的Bolt进行接收和处理 8.4.5 Storm实例 单词统计的具体逻辑:首先判断单词是否统计过,若未统计过,需先将count值置为0。若单词已统计过,则每出现一次该单词,count值就加1 8.4.5 Storm实例 基于Storm的单词统计在形式上与基于MapReduce的单词统计是类似的,MapReduce使用的是Map和Reduce的抽象,而Storm使用的是Soput和Bolt的抽象 总结一下Storm进行单词统计的整个流程: 从Spout中发送Stream(每个英文句子为一个Tuple) 用于分割单词的Bolt将接收的句子分解为独立的单词,将单词作为Tuple
文档评论(0)