一、Spark Streaming 的实现思路
Spark Streaming 与 Spark Core 的关系可以用下面的经典部件图来表述
![e19a4fb76a90d4515d3984b16801aafb.png](https://i-blog.csdnimg.cn/blog_migrate/412a69aca0be630f03b0d027a8a4f30a.jpeg)
Spark Streaming运行核心:**Spark RDD加上TimeLine,无论是从概念还是数据接收、数据处理,Time是驱动力,不断的循环事件、消息,时间的确定、数据、RDD接着就转到Spark Core上**
![4def73d306dc80c6d77170d5da732504.png](https://i-blog.csdnimg.cn/blog_migrate/e8be243991139678f6cea24490bd2164.jpeg)
1. 假设我们有一小块数据,那么通过 RDD API,我们能够构造出一个进行数据处理的 RDD DAG(如下图所示)
![884caa90abf5f83622cca239ea901c7e.png](https://i-blog.csdnimg.cn/blog_migrate/1a10e70471ac7556b7c270b49c24a9b5.jpeg)
2. 第二步,我们对连续的 streaming data 进行切片处理 —— 比如将最近 200ms 时间的 event 积攒一下--每个切片就是一个 batch,然后使用第一步中的 RDD DAG 对这个 batch 的数据进行处理
所以,针对连续不断的 streaming data 进行多次切片,就会形成多个 batch,也就对应出来多个 RDD DAG(每个 RDD DAG 针对一个 batch 的数据)。如此一来,这多个 RDD DAG 之间相互同构,却又是不同的实例
![c495eca4436984aefdf77c17e20bb421.png](https://i-blog.csdnimg.cn/blog_migrate/28bbf6468cabd4720f997c8624efeda7.jpeg)
整个过程需要四个步骤:
(1) 一个静态的 RDD DAG 的模板,来表示处理逻辑;
一个静态的 RDD DAG 的模板,来表示处理逻辑;
(2)一个动态的工作控制器,将连续的 streaming data 切分数据片段,并按照模板复制出新的RDD DAG的实例,对数据片段进行处理;
(3)Receiver进行原始数据的产生和导入;Receiver将接收到的数据合并为数据块并存到内存或硬盘中,供后续batch RDD进行消费;
(4)对长时运行任务的保障,包括输入数据的失效后的重构,处理任务的失败后的重调。
二、Spark Streaming的源码解析
- 我们从官网的Quick Example入手:
import org.apache.spark._
import org.apache.spark.streaming._
// 首先配置一下本 quick example 将跑在本机,app name 是 NetworkWordCount
val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
// batchDuration 设置为 1 秒,然后创建一个 streaming 入口
val ssc = new StreamingContext(conf, Seconds(1))
// ssc.socketTextStream() 将创建一个 SocketInputDStream;这个 InputDStream 的 SocketReceiver 将监听本机 9999 端口
val lines = ssc.socketTextStream("localhost