导图社区 流计算以及Storm
主要介绍流计算以及流计算框架Storm的基本情况。
编辑于2020-03-25 15:00:27十一章——流计算
概述
静态数据和流数据
静态
数据仓库中的历史数据就是静态数据
利用数据挖掘和OLAP(On-Line Analytical Processing)从静态数据中分析
流数据
形式
数据以
大量
快速
时变
的流形式到达
例子
PM2.5检测
网站用户点击流
特征
数据快速持续到达
大小也许是无穷无尽的
数据来源众多
格式复杂
不注重存储
处理完
丢弃
或
归档存储
注重数据整体价值
不注重个别数据
数据到达的顺序无法预测
数据可能不完整
批量计算和实时计算
批量处理
对象
如静态仓库中的数据
时间充裕
延迟可以高
框架
Hadoop
实时处理
对象
流数据
延迟必须低
秒级/毫秒级
流计算概念
定义
实时获取来自不同数据源的海量数据
经过实时分析处理
获得有用的信息
基本理念
数据的价值随着时间的流逝而降低
流计算框架要求
高性能
海量式
实时性
分布式
易用性
可靠性
流计算与Hadoop
Hadoop设计初衷
面向大规模数据的批处理
流计算框架
商业级
IBM InfoSphere Streams
IBM StreamBase
开源框架
Twitter Storm
Yahoo! S4
公司自己开发
Facebook Puma
Dstream(百度)
银河流数据处理平台(淘宝)
流计算处理流程
传统的数据处理流程
先采集数据并存储在关系型数据库等中
用户通过查询操作和数据管理系统进行交互
特点
数据是旧的
需要用户主动发出查询来获取结果
流计算处理流程
数据实时采集
过程
需要采集多个数据源的数据
需要保证
实时性
低延迟
如每秒数百MB的数据采集和传输
稳定可靠
采集系统
实例
Facebook的Scribe
LinkedIn的Kafka
淘宝的Time Tunnel
基于Hadoop的Chukwa和Flume
基本架构
Agent
主动采集数据
把数据推送到Collector中
采集器
Collector
接收来自Agent的数据
有序
可靠
高性能地
转发
中转站
Store
存储Collector发来的数据
(对于流计算不存储数据)
储存器
数据实时计算
工作
对采集的数据进行实时分析计算
并反馈实时结果
处理后
可视情况存储
以便后面再分析
在时效性要求较高的系统中
可以直接丢弃
实时查询服务
作用
计算出的结果供用户实时查询
或者为用户实时推送最新结果
与传统分析的区别
传统的批处理分析出来的结果是过去某一段时间的结果
流计算的结果是实时结果
两者还是有很大区别的
流计算应用
适用场景
需要处理持续到达的流数据
对数据处理有较高实时性要求
应用
实时分析
例子
“量子恒道”开发的实时流计算框架Super Mario
可以实现从用户发出请求到数据展示只需2-3秒
实时交通
导航路线考虑实时交通状况
根据交通状况制定线路、更新线路
开源框架Storm
Storm简介
Twitter开发的
定义
免费
开源
分布式
实时计算系统
对于实时计算的意义重大
应用领域
实时分析
在线机器学习
持续计算
远程RPC
RPC含义
从一台机器上
通过参数传递的方式调用
另一台机器上的函数或方法(统称为服务)
数据提取加载转换
Storm特点
整合性
简易的API
可扩展性
可靠的消息处理
支持各种编程语言
快速部署
免费开源
Storm设计思想
Streams
指代流数据
形式是无限的Tuple序列
每个tuple是一堆值
每个值有一个名字
即(key,value)
每个值可以是任何类型
故tuple是一个value-list
每个字段的名称都是事先定义的
只需要按序填入即可
Spouts
指代stream的源头
作用
从外部数据源读取数据
主动进行
封装成Tuple
这里应该是调用nextTuple函数
发送到Stream中
Bolts
指代状态转换过程
作用
处理Tuple
将处理后的Tuple作为新的Streams发送给其他Bolt
执行
过滤
函数操作
join
操作数据库等
被动进行
接收到消息后
调用execute(Tuple input)函数
执行用户的处理逻辑
Topology
指代Spouts和Bolts组成的网络
可以被提交到Storm集群执行
细节
网络里面的每个组件都是并行运行的
可以指定每个组件的并行度
具体实现
Storm中的Topology定义仅仅是一些Thrift结构体(二进制高性能通信中间件)
支持各种编程语言进行定义
Stream Groupings
管理Tuple的传输
作用
告知Topology如何在两个组件间进行Tuple传送
spout与Bolt之间
Bolt与Bolt之间
每一个spout或Bolt都可以有多个分布式任务
决定一个任务在什么时候、以什么方式发送Tuple
方式
ShuffleGrouping 随机分组
随机分发Tuple
保证每个Bolt的Task接收Tuple的数量大致一致
FieldsGrouping 按字段分组
保证相同字段的Tuple分配到同一个Task中
AllGrouping 广播发送
每一个Task都会收到所有的Tuple
GlobalGrouping 全局分组
所有的Tuple都发送到同一个Task中
两者是相反的
NonGrouping 不分组
当前Task的执行会和它的被订阅者在同一个线程中执行
DirectGrouping 直接分组
直接指定由某个Task来执行Tuple的处理
Storm框架设计
与Hadoop的对比
Hadoop运行的任务是MapReduce任务
任务终会执行完
Storm运行的任务是Topology任务
任务可以无限执行下去
设计思路
Master节点(一个)
名称为:Nimbus
类似于Hadoop中的JobTracker
作用
负责集群范围内分发代码
为Worker分配任务和监测故障
Worker节点(多个)
名称为:Supervisor
类似于Hadoop中的TaskTracker
作用
负责监听分配给它所在机器的工作
即根据Nimbus分配的任务来决定启动或停止Worker进程
一个Worker节点上同时运行若干个Worker进程
与Zookeeper协作
Zookeeper作为分布式协调组件
负责协调Nimbus和多个Supervisor
Zookeeper保存节点的状态信息
当Nimbus或Supervisor出现故障的时候
通过Zookeeper也能重启恢复之前的状态
概念间的关系
概念解析
Worker节点/Supervisor
即一台机器
worker
Worker机器上运行的一个个进程
Executor
worker内部的线程
Task
Topology组件(Spout或Bolt)中的数据处理任务
关系
一台supervisor机器上有多个worker进程
每一个worker进程都属于一个特定的Topology
worker中有多个executor线程
worker通过executor来运行Topology中的组件的task任务
框架运行流程
通过storm客户端提交Topology任务
Nimbus收到之后
将Topology分片为一个个的task
并将这些task分配给相应的supervisor
这里的分配只是写好一份文件
上面标注好谁要干哪个任务
然后将task和supervisor相关信息提交给Zookeeper
supervisor到Zookeeper集群上认领自己的task
通知自己的worker进程处理task
Spark Steaming
设计
输入与输出
Spark Stream可以整合多种输入数据源
kafka
Flume
HDFS
TCP socket
处理后可输出到
HDFS
Databases
Dash boards
基本原理
将实时输入数据以时间片(秒级)为单位进行拆分
用Spark引擎以类似批处理的方式进行处理
概念
Dstream
Disctetized Stream 离散化数据流
内部实现
每一段DStream转换为Spark中的RDD
对DStream的操作都最终转变为对相应的RDD操作
区别
Spark Stream是秒级的
Storm是毫秒级的
特点
构建在Spark上
可以利用Spark的低延迟执行引擎(100ms+)进行实时计算
相比于Storm
RDD数据集更容易做高效的容错处理
应用场景
兼顾实时与批处理
可使用在需要历史数据和实时数据联合分析的特定场合
Samza
基本概念
作业(Job)
对一组输入流处理转化为输出的程序
图示
分区
数据形式
一条条的信息
每个流被分割成多个分区
分区内是有序的消息序列
后续的消息按照一定的规则加入分区中
图示
任务(Task)
与作业、分区的关系
一个作业中有多个分区、多个任务
每个任务处理一个分区
分区之间没有顺序
所以task可以分布式独立执行
执行方法
YARN调度器把任务分配到各个机器上
分布式执行
图示
数据流图
含义
多个作业串联起来形成一个数据流图
解释
图的节点是包含数据的流
数据的流?表示数据处理的节点吗?
图的边实数据传输方向
运行
不同的任务可以独立运行
因为采用异步的消息订阅分发机制
这是什么???
图示
系统架构
流数据层(Kafka)
可插拔
执行层(YARN)
可插拔
处理层(Samza API)
系统运行流程
Samza客户端提交作业给YARN的ResourceManager
ResourceManager与NodeManager沟通为作业分配容器(CPU、内存等)运行Samza ApplicationMaster
在这一步只是商量,还没分配
Samza ApplicationMaster进一步向RM申请运行任务的容器
拿到容器后,Samza AM与容器所在的NodeManager沟通
启动容器并运行Samza Task Runner
Samza Task Runner负责执行任务
与MapReduce的对比
应用场景
Storm
编程灵活
支持各种语言编写Topology
因为使用Apache Thrift
提供毫秒级的流计算
Spark Stream
是Spark上的一个组件
决定了它可以与其他Spark组件结合
提供更多的服务
但无法提供毫秒级的流计算
Spark可以提供
流计算
图计算
机器学习
SQL查询分析等
Samza
可以提供毫秒级的流计算
适用于数据规模很大的场景
如每个分区都有数十亿个元组
Storm编程实践
安装流程
基本过程
安装Java
安装Zookeeper
安装Storm
参考网站
http://dblab.xmu.edu.cn/blog/767/
词频统计程序示例
思路
从Spout中发送Stream(每个句子为一个Tuple)
定义两种Bolt
分割单词的
输入是句子
输出是单词
计数的
输入是单词
输出是单词加次数
图示
程序编写
main函数
创建一个Topology builder
TopologyBuilder builder = new TopologyBuilder();
定义Spout数据源
builder.setSpout("sentences", new RadomSentenceSpout(), 5);
定义分割单词的Bolt
builder.setBolt("split", new SplitSentence(), 8).shuffleGrouping("sentences");
定义统计词频的Bolt
builder.setBolt("count", new WordCount(), 12).fieldsGrouping("split", new Fields("word));
函数的参数解释
第一个"sentences"等
应该是名称
第二个RandomSentenceSpout等
自定义的处理函数
第三个数字
不懂!
Grouping系列方法
定义了Tuple的发送方式
参数
第一个
应该是名字
第二个
field名称
具体的处理类
RandomSentenceSpout
SplitSentence
SplitSentence.py
WordCount
运行程序
运行的本质
提交Topology任务
运行过程
把所有代码以及依赖的jar打进一个jar包
执行命令
storm jar all-your-code.jar
storm jar负责连接到nimbus并上传jar文件
backtype.storm.MyTopology arg1 arg2
运行程序