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