本期内容:
1、解密Spark Streaming运行机制
2、解密Spark Streaming架构
上期回顾:
1、技术界的寻龙点穴,每个领域都有自己的龙脉,Spark就是大数据界的龙脉,Spark Streaming就是Spark的龙血;
2、采用了降维(把时间Batch Interval放大)的方式,进行案例演示实战,得到的结论是:特定的时间内是RDD在执行具体的Job;
一、解密Spark Streaming运行机制和架构
运行机制概念:
Spark Streaming运行时与其说是Spark Core上的一个流式处理框架,不如说是Spark Core上的一个最复杂的应用程序。如果掌握了Spark streaming这个复杂的应用程序,那么理解其他的spark应用程序都不是问题了,为什么这样说呢?我们看Spark官方网站对Spark Streaming的介绍:
Spark早期的时候只有Spark Core,上面的子框架是一步一步开发出来的,通过上面框架的使用可以洞察出Spark的内部机制,Spark Sql由于涉及了太多的Sql语法细节的解析或优化,不适合作为一个具体的子框架来彻底研究Spark,而Spark R由于功能有限和不成熟,也排除掉,Spark Graphx最近发行的几个版本基本上没有改进,意味着Graphx基本上发展到尽头了,另外图计算有 很多数学计算算法,而Spark ML再封装了Vector(向量)、Matrix(矩阵)以及结合RDD构建了众多的库,ML也有很多的数学知识, 所以最佳的入手点是Spark Streaming.
结合内部运行原理图分析:
上一讲我们说过Spark Core处理的每一步都是基于RDD的,RDD之间有依赖关系。上图中的RDD的DAG显示的是有3个Action,会触发3个job,RDD自下向上依赖,RDD产生job就会具体的执行。
从DSrteam Graph中可以看到,DStream的逻辑与RDD基本一致,DStream就是在RDD的基础上加上了时间维度。而RDD的DAG依赖又可以叫空间维度,所以说整个Spark Streaming就是时空维度。
从这个角度来讲,可以将Spark Streaming放在坐标系中。其中Y轴就是对RDD的操作,RDD的依赖关系构成了整个job的逻辑,而X轴就是时间。随着时间的流逝,固定的时间间隔(Batch Interval)就会生成一个job实例,进而在集群中运行。
在Spark Streaming中,会不断的有数据流进来,它会不断的把数据积攒起来,积攒的依据是以Batch Interval来积攒的,内部会形成一系列固定不变的数据集或event集合(假如说数据来自flume或者kafka)。我们就能感受Event的存在,Event就是数据,构成了数据的集合,而RDD处理的时候是基于固定不变的数据集合,事实上,DStream基于固定的时间间隔形成的RDD Graph正是基于某一个batch的数据集的。
Spark Streaming重要概念总结:
DStream(离散流):是整个Spark Streaming编程的基本单位或者基本对象,所有Spark Streaming都是基于DStream的;
DStream是RDD的模板;DStream的依赖关系构成了DStream Graph,是RDD DAG的模板,DAG对应的是SDtream Graph,RDD对应的是DStream;
DStream随着时间的流逝生成一系列的RDD;
DSTream是逻辑级别的;想象中的不是实际存在的;
RDD是物理级别的;
DSTream中关键代码说明:// DStream.scala line 83 // RDDs generated, marked as private[streaming] so that testsuites can access it @transient private[streaming] var generatedRDDs = new HashMap[Time, RDD[T]] () 这里的HashMap,以时间为key,以RDD为value,DStream随着时间的流逝,不断的生成RDD,基于RDD不但的产生依赖关系的job,并通过jobScheduler在集群上运行。再次验证了DStream就是RDD的模版。
终极总结:
DStream就是对RDD操作封装的集合,对DStream操作的transform的操作就会作用于内部封装的集合的每一个RDD,所以对RDD的操作就产生了RDD之间的依赖关系就构成了DAG的依赖关系,
为什么会对RDD进行操作?这个是对DStream操作的业务逻辑,也就是空间维度决定的,这空间维度作用于DStream这样一个集合,随着时间的流逝每个Batch Interval形成了具体的数据集产生了RDD,
对RDD进行transform操作,进而形成了RDD的依赖关系RDD DAG,形成job。然后jobScheduler根据时间调度,基于RDD的依赖关系,把作业发布到Spark Cluster上去运行,不断的产生Spark作业。
特别感谢王家林老师的独具一格的讲解:
王家林老师名片:
中国Spark第一人
新浪微博:http://weibo.com/ilovepains
微信公众号:DT_Spark
博客:http://blog.sina.com.cn/ilovepains
QQ:1740415547
YY课堂:每天20:00现场授课频道68917580