Spark Streaming的本质是在Spark的RDD的基础之上加上了Timer,Timer不断的运行触发周而复始的接受数据,产生Job处理数据。
因为时间是流动的,所以加上了时间维度的话,RDD也是流动的,所谓RDD的流动,就是每隔时间间隔,都会有新的RDD实例产生,这个实例来自于DStream,RDD之间的依赖关系的模板DAG也是DStream之间的依赖关系的模板,也就是所谓的DStreamGraph。
DStream是RDD的模板,DStreamGraph是RDD DAG的模板,DStream和DStreamGraph只是这个时间间隔Batch Duration中,整个RDD产生的一部分,或者说功能的一部分而已。
Spark Streaming推出这个DStream和DStreamGraph,只是在时间维度下,方便我们管理整个RDD的生命周期的方方面面。
为什么会出现有partition,但是partition没数据的情况呢?
默认的并行度是遗传的,并行度数量和partition数量是一样的,如果partition里没数据,但是partition还是存在的。
例如:父RDD有100个并行度,子RDD就剩下一条数据,但是并行度还是100个,还是100个partition,所以只有一个paritition有数据,其他都为空,没数据,这样的情况怎么处理呢?可以压缩处理,也就是coalesce处理。
DAG是静态的,RDD生成的时候,只知道元数据,RDD里面有没有数据,在计算的时候才知道,所以RDD肯定会生成的。
Spark Streaming中为什么不管有没有数据,都会产生RDD呢?
原因是:如果没有了RDD,就无法生成Job,提交作业的时候有action,action是作用于RDD的,但是没有了RDD,action就无法运行了,这个时候应用程序的执行直接失败;
RecurringTimer.scala
Spark Streaming是一直不断的循环,不管有没有数据,有没有任务,也不关心时间间隔,会一直循环,整个引擎是无时无刻不在执行,不管有用没用,不管,一直执行,也就是死循环。
本文借鉴了同学的博客,大家喜欢的话也可以关注。