咱們知道Spark Core處理的每一步都是基於RDD的,RDD之間有依賴關係。上圖中的RDD的DAG顯示的是有3個Action,會觸發3個job,RDD自下向上依賴,RDD產生job就會具體的執行。從DSteam Graph中能夠看到,DStream的邏輯與RDD基本一致,它就是在RDD的基礎上加上了時間的依賴。RDD的DAG又能夠叫空間維度,也就是說整個Spark Streaming多了一個時間維度,也能夠成爲時空維度。ide
從這個角度來說,能夠將Spark Streaming放在座標系中。其中Y軸就是對RDD的操做,RDD的依賴關係構成了整個job的邏輯,而X軸就是時間。隨着時間的流逝,固定的時間間隔(Batch Interval)就會生成一個job實例,進而在集羣中運行。ui
對於Spark Streaming來講,當不一樣的數據來源的數據流進來的時候,基於固定的時間間隔,會造成一系列固定不變的數據集或event集合(例如來自flume和kafka)。而這正好與RDD基於固定的數據集不謀而合,事實上,由DStream基於固定的時間間隔造成的RDD Graph正是基於某一個batch的數據集的。this
從上圖中能夠看出,在每個batch上,空間維度的RDD依賴關係都是同樣的,不一樣的是這個五個batch流入的數據規模和內容不同,因此說生成的是不一樣的RDD依賴關係的實例,因此說RDD的Graph脫胎於DStream的Graph,也就是說DStream就是RDD的模版,不一樣的時間間隔,生成不一樣的RDD Graph實例。scala
// DStream.scala line 65 // ======================================================================= // Methods that should be implemented by subclasses of DStream // ======================================================================= /** Time interval after which the DStream generates a RDD */ def slideDuration: Duration /** List of parent DStreams on which this DStream depends on */ def dependencies: List[DStream[_]] /** Method that generates a RDD for the given time */ def compute(validTime: Time): Option[RDD[T]]
DStream也有dependencies和computecode
// 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,這也正應證了隨着時間流逝,不斷的生成RDD,產生依賴關係的job,並經過jobScheduler在集羣上運行。再次驗證了DStream就是RDD的模版。orm
DStream能夠說是邏輯級別的,RDD就是物理級別的,DStream所表達的最終都是經過RDD的轉化實現的。前者是更高級別的抽象,後者是底層的實現。DStream實際上就是在時間維度上對RDD集合的封裝,DStream與RDD的關係就是隨着時間流逝不斷的產生RDD,對DStream的操做就是在固定時間上操做RDD。ci
總結:kafka
在空間維度上的業務邏輯做用於DStream,隨着時間的流逝,每一個Batch Interval造成了具體的數據集,產生了RDD,對RDD進行transform操做,進而造成了RDD的依賴關係RDD DAG,造成job。而後jobScheduler根據時間調度,基於RDD的依賴關係,把做業發佈到Spark Cluster上去運行,不斷的產生Spark做業。it