赞
踩
静态数据和流数据
流数据特征
针对这两类数据的分析计算
流计算的概念
实时获取来自不同数据源的海量数据,经过实时分析处理,获得有价值的信息
流计算的基本理念
数据的价值随着时间的流逝而降低,如用户点击流
因此,当时间出现时就应该立即进行处理,而不是缓存起来进行批量处理
需要一个低延迟、高可靠、可扩展的处理引擎帮我们去完成流数据的实时处理
流计算系统要求
Hadoop是否适合做流式处理?
Hadoop的设计初衷是面向大规模数据的批量处理
MapReduce是专门面向静态数据的批量处理的,内部各种机制都为批处理做了高度优化,不适合用户处理持续到达的动态数据
通过降低批处理时间延迟的方式完成流式数据的处理?
采用变通的方式对MapReduce进行相关的改造
MapReduce的批量数据转换为很多的小量的数据,一大批数据将其切割成很多小批
每隔一个周期去启动一次MapReduce作业,变相地完成一个流式数据的处理
问题:
- 切分成小片段,可以降低延迟,但是也增加了附加开销,还要处理片段之间依赖关系
- 需要改造MapReduce以支持流式处理(结果不能写入磁盘,IO消耗大,应该写入内存)
因此,Hadoop擅长批处理,不适合流计算
当前业界诞生了许多专门的流数据实时计算系统来满足各自需求
商业级:IBM InfoSphere Streams、IBM StreamBase
开源流计算框架:
公司为支持自身业务开发的流计算框架
传统的数据处理流程
流计算的处理流程
数据实时采集过程
数据采集系统的基本架构
数据实时计算
实时查询服务
流处理系统和传统的数据处理系统的区别
传统的应用分析已经不适合现在的很多应用场景
流式处理可以实现实时性的要求
流计算可应用于实时交通
流计算的发展
以前只有政府机构和金融机构才会去做流计算,为了解决实时数据处理需求
开发产品都是基于对传统数据库处理的流式化,最终开发的都是实时数据库产品,很少有企业研究流计算框架
流计算框架在流式数据处理方面比MapReduce更有优势
Storm
三大分布式处理系统
Storm的优点:
以Twitter公司为例
Storm的特点
Storm主要术语
Stream:将流数据Stream描述成一个无限的Tuple序列,这些Tuple序列会以分布式的方式并行的创建和处理
- 每个tuple是一堆值,每个值有一个名字,并且每个值可以是任何类型
- Tuple本来应该是一个Key-Value的Map,由于各个组件间传递的tuple的字段名称已经事先定义好了,所以Tuple只需要按需填入各个Value,所以是一个Value Lisy(值列表)
Spout
Storm认为每个Stream都有一个源头,并把这个源头抽象位Spout
通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,发送到Stream中
Spout是一个主动的角色,在接口内部有一个nextTuple函数,Storm框架会不停的调用该函数
Bolt
Storm将Streams的状态转化过程抽象为Bolt
Bolt即可以处理Tuple,也可以将处理后的Tuple作为新的Streams发送给其他Bolt
Bolt可以执行过滤、函数操作、Join、操作数据库等任何操作
注意:Bolt是一个被动的角色,其接口中有一个execute(Tuple input)方法,在接收到消息之后会调用次函数,用户可以在此方法中执行自己的处理逻辑
Topology:相当于应用程序中的Job,流计算任务是以Topology的形式提交
Topology中每一个组件(Bolt或者Spout)之间都是并行运行的
其中每个Bolt里面是可以包含多个Task任务的
Stream Groupings
通过设置StreamGrouping可以设置将Spout分发给Bolt中的哪一个Task来执行
Storm运行任务的方式与Hadoop类似
Storm和Hadoop架构组织功能对应关系
MapReduce作业最终会完成计算并结束运行
而Topology将持续处理消息(直到人为终止)
Storm集群采用“Master-Worker”的节点方式
Storm集群架构示意图
Storm使用Zookeeper来作为分布式协调组件,负责Nimbus和多个Supervisor之间的所有协调工作
Worker进程
每个worker进程都属于一个特定的Topology,每个Supervisor节点的worker可以有多个,每个worker对Topology的每个组件(Spout或Bolt)运行一个或者多个executor线程来提供Task的运行服务
Executor:excutor是产生于worker进程内部的线程,会执行同一个组件的一个或者多个Task
一般Topology生命周期中每个组件对应的Task数量是不变的,但是Executora的数量是变化的
一般Executor的数量是小于Task的
实际的数据处理都是由Task完成的
Storm工作流程
Spark Streaming
Spark Streaming 可整合多种输入数据源,如Kafka、Flume、HDFS,甚至是普通的TCP套接字,经处理后的数据可存储至文件系统、数据库,或显示在仪表盘中
Spark Streaming执行流程
其基本原理:将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引擎以类似批处理的方式处理每个时间片数据
DStream操作示意图
Spark Streaming最主要的抽象是DStream (Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒) 分成一段一段的DStream,每一段数据转换为Spark中的RDD,并且对Dstream的操作都最终转变为对相应的RDD的操作
Spark Streaming和Storm的对比
Samza
基本概念
作业:一个作业(Job)是对一组输入流进行处理转换成输出流的程序
分区:既不是元组Tuple,也不是Stream,而是一条条的消息;每个流会被分成一个或者多个分区
它将数据流划分为分区,每个分区都是一个有趣的消息队列
任务
数据流图
是通过多个作业串联起来,构成这么一个完整的数据流图才可以完成一个完整的流数据处理流程
Samza系统架构
MapReduce批处理架构和Samza流处理架构的类比
Samza处理分析过程
Storm Spark Streaming和Samaza应用场景
程序任务:单词统计
Storm进行单词统计整个流程
一个句子经Storm的单词统计得出的结果
整个单词统计Topology的整体逻辑
main函数中的处理逻辑
各个类的作用
RandomSentenceSpout类
SplitSentence类
splitisentence.py脚本
WordCount类
Twiteer也是使用了Storm框架实现了实时热门话题
Storm的具体运行环境
Storm单机模式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。