Spark Streaming

Spark Streaming 是一个批处理的流式计算框架。它的核心是Spark,适合处理实时数据与历史数据混合处理的场景,并保证容错性。

Spark Streaming是构建在Spark上的实时计算框架,扩展了Spark流式大数据处理能力。它将数据流以时间片单位进行分割形成RDD,使用RDD操作处理每一块数据,每块数据(RDD)都会生成一个Spark Job进行处理,最终的表现形式就是以批处理的方式处理每个时间片的数据。

Spark Streaming 的处理流程

宏观处理过程如下图所示:

Spark Streaming

Spark Streaming编程接口和Spark相似:

  1. 在Spark中,通过在RDD上用Transformation(map,filter等)和Action(count,collect等)算子进行运算。
  2. 在Spark Streaming中,通过在DStream(表示数据量的RDD序列)上进行算子的运算。

1.Spark Streaming 将程序中多DStream的操作转换为DStream有向无环图(DAG)
2.对每个时间片,DStream DAG 会产生一个RDD DAG
3.在RDD中通过Action算子触发一个Job,Spark Streaming会将Job提交给Job Manager
4.Job Manager会将Job插入维护的Job队列,然后Job Manager会将队列中的Job逐个提交给Spark DAG Scheduler
5.Spark 会调度Job并将Task分发到各个节点的Executor上执行。

Spark Streaming的优点:

1.多范式数据分析管道

能和Spark生态系统其他组件融合,实现交互式查询和机器学习等多种范式组合处理

2.扩展性

可以运行在100个以上的集群汇,延迟控制在秒级

3.容错性

使用Spark 的Lineage以及内存维护两份数据进行备份达到容错。RDD通过Lineage记录下之前的操作,如果节点在运行是出现故障,则可以通过冗余备份数据在其他节点重新计算得到

容错过程如下图所示:

图中的每个圆角矩形表示一个RDD,其中的圆表示一个Partition,图中每一列的多个RDD表示一个DStream,t=1和t=2代表不同的时间分片下不同RDD DAG。

Spark Streaming

图中的每一个RDD都是通过Lineage相连接形成DAG的,由于Spark Streaming 输入数据可以来自磁盘(HDFS等)也可以来自网络(Spark Streaming会将网络输入数据的每一个数据流复制两份到其他的机器)都能通过Lineage和重算机制保证容错性

4.吞吐量大

将数据转换为RDD,基于批处理的方式,提高数据处理的吞吐量

5.实时性

能够满足除对实时性要求非常高之外的所有流式准实时计算场景(Spark最小Batch Size在0.5-2s,Storm在0.1s左右)

Spark Streaming 架构

下图是Spark Streaming的架构图 对比Spark 的架构图:http://blog.csdn.net/Wee_Mita/article/details/70336530
Spark Streaming

图中组件介绍:
Network Input Tracker : 通过接收器接收流数据,并将柳树映射为输入DStream
Job Scheduler : 周期性地查询DStream图,通过输入的流数据生成Spark Job,将Spark Job提交给Job Manager进行执行【处理流程的第3步和第4步】
Job Manager : 维护一个Job队列,将队列中的Job提交到Spark进行执行【处理流程的第5步】

Spark Streaming 原理深入解析

1.初始化与数据接收

通过分布在各个节点上的接收器,缓存接收到的流数据,并将数据包装成Spark能够处理的RDD格式,输入到Spark Streaming,之后有Spark Streaming 将作业提交到Spark集群进行执行

1.调度器的初始化:调度器调度Spark Streaming 的运行,用户可以通过配置相关参数进行调优
2.将输入流的接收器转化为RDD在集群进行分布式分配,然后启动接收器集合中的每个接收器(不同的数据源,提供不同的接收器,分布在各个节点上的每个接收器可以认为是一个特定的进程,接受一部分数据作为输入)

Spark Streaming

2.数据接收和转化

receiver集合转换为RDD,主要流程如下:
1.数据缓冲:在receiver的receive函数中接收流数据,将接收到的数据源源不断地放入BlockGennrator.urrentBuffer
2. 缓冲数据转化为数据块:在BlockGenerator中有一个定时器(RecurringTimer),将当前缓冲区中的数据以用户定义的时间间隔封装为一个Block,放到BlockGenerator的blocksForPush队列中
3.数据库转化为Spark数据块:在BlockGenerator中有一个BlockPushingThread线程,不断地将blocksForPush队列中的块传递给BlockManager,让BlockManager将数据存储为块。BlockManager负责Spark中的块的管理
4.元数据存储:在pushArrayBuffer方法中还会将已经由BlockManager存储的元数据信息(Block的id号等)传递给ReceiverTracker,ReceiverTracker会将存储的blockId放在对应StreamId的队列中

Spark Streaming

图中组件介绍:
KeepPushingBlocks:调用此方法持续写入和保持数据块
pushArrayBuffer:调用此方法将数据块存储到BlockBuffer中
reportPushedBlock:存储完成后汇报数据块信息到主节点
receivedBlockInfo(META-DATA):已经接收到的数据块元数据记录
streamId:数据流id
BlockInfo:数据块元数据信息
BlockManager.put:数据块存储器写入备份数据块到其他节点
Receiver:数据块接收器,接受数据块
BlockGenerator:数据块生成器,将数据缓存生成Spark能处理的数据块
BlockGenerator.currentBuffer:缓存网络接收的数据记录,等待之后转换为Spark的数据块
BlockGenerator.blocksForPushing:将一块连续数据记录暂存为数据块,带后续转换为Spark能够存处理的BlockManager中的数据块
BlockGenerator.blockPushingThread:守护线程负责将数据块转换为BlockManager中数据块
ReceiveTracker:输入数据块的元数据管理器,负责管理和记录数据块
RecurringTimer:时间触发器,每隔一定时间进行缓存数据的转换

3.生成RDD与提交Spark Job
Spark Streaming 根据时间段,将数据切分为RDD,任何触发RDD的Action提交Job,Job被提交到JobManager中的Job Queue中,由Job Scheduler调度,之后Job Scheduler将Job提交到Spark的Job调度器,然后将Job转换为大量的任务分发给Spark集群执行。
Spark Streaming