大数据@IT·大数据大数据,机器学习,人工智能

7.Spark Streaming

2019-06-04  本文已影响60人  山间浓雾有路灯

Spark Streaming是Spark核心api的一个拓展,可以实现高吞吐量/具备容错机制的实时流数据的处理
Spark Streaming 与 Spark Core 的关系可以用下面的经典部件图来表述:

images

基于Spark做Spark Streaming的思路

第一步

第二步

注意:这里使用的是batch概念,确实200ms在其他同类系统中通常叫做mini-batch,不过既然Spark Streaming官方的叫法就是batch,我们这里就用batch表达mini-batch的意思了

第三步

第四步

总结

Streaming data的特点决定了,如果我们想基于Spark Core进行Streaming data的处理,还需要在Spark Core的框架上解决刚才列出的1.2.3.4.的问题


images

Spark Streaming的整体模块划分

images

模块1:DAG静态定义

1.铺垫
2.DStream
 全限定名:org.apache.spark.streaming.dstream.DStream
images
3.DStreamGraph
全限定名:org.apache.spark.streaming.DStreamGraph

模块2:Job动态生成

全限定名
- JobScheduler 的全限定名是:org.apache.spark.streaming.scheduler.JobScheduler
- JobGenerator 的全限定名是:org.apache.spark.streaming.scheduler.JobGenerator
- ReceiverTracker 的全限定名是:org.apache.spark.streaming.scheduler.ReceiverTracker
JobGenerator

JobGenerator维护了一个定时器,周期就是我们刚刚提到的batchDuration,定时为每个batch生成RDD DAG的实例。具体的,每次RDD DAG实际生成包含5个步骤
1.要求ReceiverTracker将目前已收到的数据进行一次allocate,即将上次batch切分后的数据切分到本次新的batch里
2.要求DStreamGraph复制出一套新的RDD DAG的实例,具体过程是:DStreamGraph将要求图例的尾DStream节点生成具体的RDD实例,并递归的调用尾DStream的上游DStream节点。以此遍历整个DStreamGraph,遍历结束也就正好生成了RDD DAG的实例
3.获取第1步ReceiverTracker分配到本batch的源头数据的meta信息
4.将第2步生成的本batch的RDD DAG,和第3步获取到的meta信息,一同提交给JobScheduler异步执行
5.只要提交结束(不管是否已经开始异步执行),就马上对整个系统的当前运行状态做一个checkpoint
调用关系如图

images

模块3:数据产生和导入

DStream有一个重要而特殊的子类ReceiverInputDStream:它除了需要像其他DStream那样在某个batch实例化RDD以外,还需要额外的Receiver为这个RDD生产数据

流程

1.由Receiver的总指挥ReceiverTracker分布多个job(每个job有1个task),到多个executor上分别启动ReceiverSupervisor实例
2.每个ReceiverSupervisor启动后将马上生成一个用户提供的Receiver实现的实例,该Receiver实现可以持续产生或者持续接收系统外数据,比如TwitterReceiver可以实时爬取Twitter数据,并在Receiver实例生成后调用Receiver.onStart()
1,2步骤的流程图如下,这时Receiver启动工作已经运行完毕,接下来ReceiverSupervisor将在executor端作为主要角色


images
ReceiverSupervisor 的全限定名是:org.apache.spark.streaming.receiver.ReceiverSupervisor
Receiver           的全限定名是:org.apache.spark.streaming.receiver.Receiver

3.Receiver在onStart()启动后,就将持续不断的接收外界数据,并持续交给ReceiverSupervisor进行数据转储
4.ReceiverSupervisor持续不断的接收到Receiver传来的数据:

5.每次成块在executor存储完毕后,ReceiverSupervisor就会及时上报块数据的meta信息给driver端的ReceiverTracker

这里的meta信息包括数据的标识id,数据的位置,数据的条数,数据的大小等信息

6.ReceiverTracker再将收到的块数据meta信息直接转给自己的成员ReceivedBlockTracker,由ReceivedBlockTracker专门管理收到的块数据meta信息
3,4,5,6的调用图如下,3,4,5,6的过程是一直持续不断的发生的


images

后续在driver端,就由ReceiverInputDStream在每个batch去检查ReceiverTracker收到的块meta信息,界定哪些新数据需要在本batch内处理,然后生成相应的RDD实例去处理这些块数据,这个过程在模块 1:DAG 静态定义 模块2:Job 动态生成 里描述过了

模块4:长时容错

Spark Streaming的长时容错特性,能够提供不重,不丢,exactly-once的处理语义

executor端
driver端

注意到这里采用的是完整checkpoint的方式,和之前的WAL的方式都不一样。checkpoint通常也是落地到可靠存储如HDFS。checkpoint发起的间隔默认的是和batchDuration一致;即每次batch发起,提交了需要运行的job后就做checkpoint,另外在job完成了更新任务状态的时候再次做一下checkpoint
这样一来,在driver失效并恢复后,可以读取最近一次的checkpoint来恢复作业的DStreamGraph和job的运行及完成状态

总结

images

架构简析

组成

作业提交

窗口操作

Spark提供了一组窗口操作,通过滑动窗口技术对大规模数据的增量更新进行统计分析

WAL容错

工作原理和恢复看图加上注释应该比较好理解

工作原理

images

恢复

images

基于Spark Streaming有上述蛮多内容的理解,部分内容是学习借鉴腾讯广告团队分享的内容。有理解错误的地方,欢迎大家积极指正。下面这个链接是腾讯广告团队的分享,大家可以学习学习。

https://github.com/lw-lin/CoolplaySpark/blob/master/Spark%20Streaming%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E7%B3%BB%E5%88%97/0.1%20Spark%20Streaming%20%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF%E4%B8%8E%E6%A8%A1%E5%9D%97%E6%A6%82%E8%BF%B0.md

上一篇下一篇

猜你喜欢

热点阅读