当前位置:
文档之家› 分布式实时计算系统Storm
分布式实时计算系统Storm
U e STC
3/17
1956
Storm简介
Storm主要特点
– – – – – 编程模型简单。Storm降低了进行实时处理的复杂度 可扩展。计算是在多个线程、进程和服务器之间并行进行的 高可靠性。可保证每个消息至少能得到一次完整处理 高容错性。Storm会管理工作进程和节点的故障 支持多种编程语言。默认支持 Clojure 、 Java 、 Ruby 和 Python 。其它语言秩序实现一个简单的Storm通信协议即可 – 支持本地模式。可在处理过程中完全模拟Storm集群 – 高效。系统的设计保证了消息能得到快速处理
Storm简单应用—统计单词出现频率
具体实现
– 设计RaceSentenceSpout类
• Storm的Spout一般均实现了IRichSpout接口。其中open方法主要功能是 拓扑开始时的启动工作,nextTuple方法声明了Spout发送到下一级Bolt
的输出数据
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { _collector = collector; ……
Storm主要适用场景
– 信息流处理
• 可用来实时处理源源不断流进来的数据,处理后将结果写入存储中。
如互联网的数据实时监控、微博热门话题发送到浏览器中等
– 分布式RPC
• 由于 Storm的处理组件是分布式的,而且处理延迟极低,所以可作为 一个通用的分布式 rpc框架来使用。当然,其实我们的搜索引擎本身 也是一个分布式rpc系统。
U e STC
14/17
1956
Storm简单应用—统计单词出现频率
提交运行
– 将设计的拓扑打包,并提交到Storm集群上运行,下图是在本 机上模拟集群的试跑拓扑图和结果
U e STC
15/17
1956
• Storm的Bolt一般均实现了IBasicBolt或IRichBolt接口。其中execute方法 实现具体的逻辑功能,declaredOutputFields方法声明了Bolt输出元祖
的架构
public void execute(Tuple tuple,BasicOutputCollector collector){ String sentence = tuple.getString(0); for(String word:sentence.split(“ ”)){ //通过空格来划分单词 collector.emit(new Values(word)); } } public void declaredOutputFields(OutputFieldsDeclarer declarer){ declarer.declare(new Fields(“word”)); //给输出的word变量命名 }
U e STC
4/17
1956
Storm简介
Topology图
– 上 图 由 水 龙 头 和 闪 电 组 成 的 拓 扑 图 即 为 一 个 Storm 应 用 (Topology),拓扑提交到集群执行。
• Spout 代表输入的数据源,这个数据源可以是任意的 ,如 kafaka 、 MetaQ、DB等。Storm从这个数据源中不断地读取数据,然后发送到 下游的Bolt中进行处理。 • Bolt代表处理逻辑, Bolt收到消息后,执行用户的业务逻辑。处理完 以后,既可以将处理后的消息继续发送到下游的Bolt ,也可直接结束
目录
Storm简介 Storm主要构成
Storm简单应用—统计单词出现频率
U e STC
1/17
1956
Storm简介
产生背景
– 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀 ,人们获取信息的途径也更加多样、更加便捷,同时对于信 息的时效性要求也越来越高。
实时计算
– 实时计算一般针对海量数据进行,要求是秒级。主要应用场 景有两种:
} public void nextTuple() { …… _collector.emit(new Values(sentence)); //Values类是一个链式存储结构 }
U e STC
12/17
1956
Storm简单应用—统计单词出现频率
具体实现
– 设计SplitSentenceBolt类
[“jumped”] [“the cow jumped over the moon”]
[“jumped”,1]
[“over”]
[“over”,1]
[“the”]
[“the”,2]
[“moon”]
[“moon”,1]
Topology内部数据流图
U e STC
10/17
1956
Storm简单应用—统计单词出现频率
。
U e STC
5/17
1956
Storm主要构成
Storm基本体系结构
SuperVisor Worker
Nimbus
ZooKeeper
SuperVisor Worker SuperVisor
Storm基本体系结构图
U e STC
6/17
1956
Storm主要构成
Storm基本组件
– Storm集群由一个主节点和多个工作节点组成。主节点运行一 个 Nimbus 的守护进程,工作节点运行一个 SuperVisor 的守护 进程。Nimbus和SuperVisor的协调工作由Zookeeper完成。 – Nimbus 负 责 资 源 分 配 和 任 务 调 度 , SuperVisor 负 责 接 受 Nimbus 分配的任务,启动和停止自己管理的 Worker 进程 ( 即 一个VM进程)。 – 每一个 Worker工作进程执行一个 Topology的一个子集,一个 运行的Topology由运行在不同机器上的多个Worker完成。 – Executor 是 1 个被 Executor 进程启动的单独物理线程 。每个 Executor只会运行1个Topology的1个Task – 一个Task是Spout或Bolt的1个实例
• 数据源是实时、不间断的,要求对用户的响应时间也是实时的。主要
用于互联网流式数据处理。 • 数据量大且无法或没必要预算,但要求对用户的响应时间是实时的。 主要用于特定场合下的数据分析处理。
U e STC
2/17
1956
Storm简介
Storm概念
– Storm是由Twitter开源的、分布式的、容错的实时计算系统, 使用Clojure语言实现,可以使开发者可靠地处理无界持续的 流数据,进行实时计算。
Executor线程
Task
Task
Task
Task
Worker进程
Task
Task
U e STC
8/17
1956
Storm简单应用—统计单词出现频率
设计Topology
– 可以将 Topology 分成三部分,一是数据源 RaceSentenceSpout ,负责发送语句;二是数据处理者 SplitSentenceSpout ,负责 切分语句;三是数据再处理者WordCountBolt,负责累加单词 出现频率
U e STC
7/17
1956
Storm主要构成
Worker、Task和Executor关系
– Storm 集群的一个物理工作节点启动一个或多个 Worker 进程 ,集群Topology由这些Worker进程完成 – Worker进程运行一个或多个Executor线程,每个Executor线程 只运行一个 Topology 的一个组件 (Spout/Bolt) 的相关 Task 任务 。Task是数据处理的实体单元。 – 同一个 Worker 只执行同一个 Topology 相关的 Task ,同一个 Executor中可执行多个同类型的Task。
• 上述代码定义了整个Topology,并设置了相应的数据流。 • setSpout用于插入Spout ,setBolt用于插入Bolt。setSpout和setBolt的第 一个参数代表该Spout/Bolt的Id,最后一个参数代表并行量,即同时有
多少个线程并行执行。
U e STC
11/17
1956
具体实现
– 定义Topology
TopologyBuilder builder = new TopologyBuilder(); builder,setSpout(“spout",new RaceSentenceSpout (),10); builder.setBolt(“split",new SplitSentenceBolt(),10). shuffleGrouping("spout"); builder.setBolt(“count",new WordCountBolt,20). fieldsGrouping("split",new Fields("word");
RaceSentence Spout
[“sent ence”]
SplitSentence Bolt
[“wor d”]
WordCountBolt
[“word”, ”count”]
U e STC
9/17
1956
Storm简单应用—统计单பைடு நூலகம்出现频率
设计数据流
[“the”] [“the”,1] [“cow”] [“cow”,1]
U e STC
13/17
1956
Storm简单应用—统计单词出现频率