本期内容:
1 解密Spark Streaming运行机制
2 解密Spark Streaming架构
1 解密Spark Streaming运行机制
本期内容:
我们看看上节课仍没有停下来的Spark Streaming程序运行留下的信息。
这个程序仍然在不断地循环运行。即使没有接收到新数据,日志中也不断循环显示着JobScheduler、BlockManager、MapPartitionsRDD、ShuffledRDD等等信息。这些都是Spark Core相关的信息。其循环的依据,也就是时间这个维度。
RDD之间的具体依赖,构成了空间维度。DStream就是在RDD的基础上增加了时间维度。所以整个Spark Streaming就是时空维度。
继续拿上节课的程序例图进行说明。
我们知道Spark Core处理的每一步都是基于RDD的,RDD之间有依赖关系。上图的例子中,RDD的DAG显示的是有3个Action,会触发3个Job,RDD自下向上依赖,RDD产生Job就会具体的执行。从DSteam Graph中可以看到,DStream的逻辑与RDD基本一致,它就是在RDD的基础上加上了时间的依赖。RDD的DAG又可以叫空间维度,也就是说整个Spark Streaming多了一个时间维度,也就构成了时空维度。
从这个角度来讲,可以将Spark Streaming放在坐标系中。其中Y轴就是对RDD的操作,RDD的依赖关系构成了整个Job的逻辑,而X轴就是时间。随着时间的流逝,固定的时间间隔(Batch Interval)就会生成一个Job实例,进而在集群中运行。
对于Spark Streaming来说,当不同的数据来源的数据流进来的时候,基于固定的时间间隔,会形成一系列固定不变的数据集或event集合(例如来自flume和kafka)。而这正好与RDD基于固定的数据集不谋而合,事实上,由DStream基于固定的时间间隔形成的RDD Graph正是基于某一个batch的数据集的。
从上图中可以看出,在每一个batch上,空间维度的RDD依赖关系都是一样的,不同的是这个五个batch流入的数据规模和内容不一样,所以说生成的是不同的RDD依赖关系的实例。RDD的Graph脱胎于DStream的Graph,也就是说DStream就是RDD的模版。在不同的时间间隔,会生成不同的RDD Graph实例。
2 解密Spark Streaming架构
Spark Streaming架构中有以下几个要点:
1. 需要RDD DAG的生成模版:DStream Graph
2. 需要基于Timeline的Job控制器
3. 需要InputStreamings和OutputStreaming,代表数据的输入和输出
4. 具体的Job运行在Spark Cluster之上,此时系统容错就至关重要。
Spark Streaming在流量过大时能限流,能动态的调整CPU、内存等资源。
5. 事务处理,我们希望流进来的数据一定会被处理,而且只处理一次。在处理出现崩溃的情况下如何保证Exactly once的事务语意。
看源码来剖析一下。先看DStream。
从这里可以看出,DStream就是Spark Streaming的核心,就像RDD是Spark Core的核心,它也有dependencies和compute。更为关键的是下面的代码:
这是一个HashMap,以时间为key,以RDD为value。DStream就是RDD的模版。
DStream有很多子类。
DStream间的转换操作就是子类的转换。也实际上是RDD的转换,然后产生依赖关系的Job,并通过JobScheduler在集群上运行。
DStream可以说是逻辑级别的,RDD就是物理级别的,DStream所表达的最终都是转换成RDD去实现。前者是更高级别的抽象,后者是底层的实现。DStream实际上就是在时间维度上对RDD集合的封装, DStream与RDD的关系就是随着时间流逝不断的产生RDD, 对DStream的操作就是在固定时间上操作RDD。
总结:
在空间维度上的业务逻辑作用于DStream,随着时间的流逝,每个Batch Interval形成了具体的数据集,产生了RDD,对RDD进行transform操作,进而形成了RDD的依赖关系RDD DAG,形成Job。然后JobScheduler根据时间调度,基于RDD的依赖关系,把作业发布到Spark集群上去运行,不断的产生Spark作业。
备注:
更多私密内容,请关注微信公众号:DT_Spark
如果您对大数据Spark感兴趣,可以免费听由王家林老师每天晚上20:00开设的Spark永久免费公开课,地址YY房间号:68917580