本讲内容:
a. 在线动态计算分类最热门商品案例回顾与演示
b. 基于案例贯通Spark Streaming的运行源码
注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解。
上节课主要从事务视角为大家探索Spark Streaming架构机制;Spark Streaming程序分成而部分,一部分是Driver,另外一部分是Executor。通过对Driver和Executor解析,洞察怎么才能完成完整的语义、事务一致性,并保证数据的零丢失,Exactly Once的事务处理。
而直接通过kafka direct api直接消费数据,所有的Executors通过kafka api直接消费数据,直接管理offset,所以不会重复消费数据;从而实现事务!!!
设置spark.task.maxFailures次数为1、spark.speculation为关闭状态、auto.offset.reset为“largest”的方式来解决Spark Streaming数据输出多次重写的问题
最后可以通过transform和foreachRDD基于业务逻辑代码进行逻辑控制来实现数据不重复消费和输出不重复!这二个方法类似于spark的后门,可以做任意想象的控制操作!
本讲,主要是从事例代码开始,并通过Spark源代码给大家贯通Spark Streaming流计算框架的运行。
下面让我们开始神奇的探秘之旅吧?!
首先,本讲我们从Spark Streaming+Spark SQL来实现分类最热门商品的在线动态计算的事例代码演示开始,如下图:
事例源码
开启源码神奇之旅
从实例化SteamingContext入手,进入StreamingContext源码
在实例化spark Streaming的时候,从一下源码中我们可以清晰明白SparkStreaming 是SparkCore的一个应用程序
进入到createNewSparkContext的源码中
(SteamingContext.scala,886行代码)
由以上源码我们可以确SparkStreaming 就是是SparkCore的一个应用程序
下面我们看看分案例的数据流是怎么创建的?
由以上代码看到是socketTextStream方法开启了一个数据流入端口,进入到socketTextStream源码中
可看到代码最后面调用socketStream,实际上生成SocketInputDStream,进入到SocketInputDStream源码
SocketInputDStream继承ReceiverInputDStream,进入到ReceiverInputDStream源码中
ReceiverInputDStream继承InputDStream,进入到InputDStream中
由以上代码可以总结出SocketInputDStream的继承关系如下:
SocketInputDStream -> ReceiverInputDStream -> InputDStream -> DStream
最终我们又回到了DStream中,进入到DStream源码中
看到以上源码信息,我们不得不重新思考一个问题了,就是DStream和RDD是什么关系呢?
由之前的几讲我们知道Spark Streaming是基于DStream编程。DStream是逻辑级别的,而RDD是物理级别的。DStream是随着时间的流动内部将集合封装RDD。对DStream的操作,归根结底还是对其RDD进行的操作。
DStream是生成RDD的,将生成的RDD放在HashMap中
我们通过具体切分Spark Streaming 的整体模块来分析源码
下图来自(上海-丁立清)
备注:
1、DT大数据梦工厂微信公众号DT_Spark
2、Spark大神级专家:王家林
3、新浪微博: http://www.weibo.com/ilovepains