spark streaming原始碼分析1 StreamingContext

五柳-先生發表於2016-01-29

首先看一個最簡單的例子,瞭解大致的樣子:

[java] view plain copy
  1. object NetworkWordCount {  
  2.   def main(args: Array[String]) {  
  3.     if (args.length < 2) {  
  4.       System.err.println("Usage: NetworkWordCount <hostname> <port>")  
  5.       System.exit(1)  
  6.     }  
  7.   
  8.     StreamingExamples.setStreamingLogLevels()  
  9.   
  10.     // Create the context with a 1 second batch size  
  11.     val sparkConf = new SparkConf().setAppName("NetworkWordCount")  
  12.     val ssc = new StreamingContext(sparkConf, Seconds(1))  
  13.   
  14.     // Create a socket stream on target ip:port and count the  
  15.     // words in input stream of \n delimited text (eg. generated by 'nc')  
  16.     // Note that no duplication in storage level only for running locally.  
  17.     // Replication necessary in distributed scenario for fault tolerance.  
  18.     val lines = ssc.socketTextStream(args(0), args(1).toInt, StorageLevel.MEMORY_AND_DISK_SER)  
  19.     val words = lines.flatMap(_.split(" "))  
  20.     val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)  
  21.     wordCounts.print()  
  22.     ssc.start()  
  23.     ssc.awaitTermination()  
  24.   }  
  25. }  
本小節主要介紹StreamingContext的構造

[java] view plain copy
  1. class StreamingContext private[streaming] (  
  2.     sc_ : SparkContext,  
  3.     cp_ : Checkpoint,  
  4.     batchDur_ : Duration  
  5.   )  

一、API:

1、cp_為null

  1. def this(sparkContext: SparkContext, batchDuration: Duration)  
2、方法內部也是通過conf自動建立一個sparkContext,cp_為null
  1. def this(conf: SparkConf, batchDuration: Duration)  
3、conf由預設的和引數部分組合而成,cp_為null
  1. def this(  
  2.     master: String,  
  3.     appName: String,  
  4.     batchDuration: Duration,  
  5.     sparkHome: String = null,  
  6.     jars: Seq[String] = Nil,  
  7.     environment: Map[String, String] = Map())  
4、從path目錄下讀取checkpoint的資訊來重建streamingContext,也就不需要sparkContext和Duration引數
  1. def this(path: String, hadoopConf: Configuration)  
  1. def this(path: String)//hadoopConf使用預設的hadoop配置檔案自動構造  
5、使用存在的sparkContext和checkpoint路徑來構造
  1. def this(path: String, sparkContext: SparkContext)  
6、需要注意的是,streamingContext物件內部有一個getOrCreate方法,指明如果在checkpointPath路徑下讀取不到,則呼叫creatingFunc建立新的streamingContext
  1. def getOrCreate(  
  2.     checkpointPath: String,  
  3.     creatingFunc: () => StreamingContext,  
  4.     hadoopConf: Configuration = new Configuration(),  
  5.     createOnError: Boolean = false  
  6.   ): StreamingContext  
二、StreamingContext主要的構造邏輯(checkpoint暫不討論)
1、構造一個graph: DStreamGraph
作用於DStream上的operation分成兩類 1. Transformation,2. Output 表示將輸出結果。DStreamGraph 有輸入就要有輸出,如果沒有輸出,則前面所做的所有動作全部沒有意義,那麼如何將這些輸入和輸出繫結起來呢?這個問題的解決就依賴於DStreamGraph,DStreamGraph記錄輸入的Stream和輸出的Stream。
2、構造一個JobScheduler
JobScheduler內部會構造一個jobGenerator,它用於按我們設定的批處理間隔產生job
3、狀態設定為INITIALIZED
下一節介紹上面例子中的operation部分

相關文章