spark streaming原始碼分析2 從簡單例子看DStream上的operation

五柳-先生發表於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. }  
這一節學習一下Dstream上的operation部分

1、呼叫socketTextStream方法,返回一個ReceiverInputDStream型別。它繼承與InputDStream,InputDStream又繼承於DStream

  (1)設定本身的InputDStream到DStreamGraph中

  (2)獲取streamId

2、呼叫flatMap方法,返回一個flatMappedDStream。

看一下FlatMappedDStream的成員

[java] view plain copy
  1. private[streaming]  
  2. class FlatMappedDStream[T: ClassTag, U: ClassTag](  
  3.     parent: DStream[T],  
  4.     flatMapFunc: T => Traversable[U]  
  5.   ) extends DStream[U](parent.ssc) {  
  6.   
  7.   override def dependencies: List[DStream[_]] = List(parent)  
  8.   
  9.   override def slideDuration: Duration = parent.slideDuration  
  10.   
  11.   override def compute(validTime: Time): Option[RDD[U]] = {  
  12.     parent.getOrCompute(validTime).map(_.flatMap(flatMapFunc))  
  13.   }  
  14. }  
RDD的操作非常類似

dependencies:即呼叫flatmap操作的DStream,這裡指ReceiverInputDStream

slideDuration:Dstream產生RDD的時間間隔,即批處理間隔

compute:根據引數得到一個RDD,繼而在這個RDD上呼叫flatmap操作。flatmap操作的方法引數實際上附加到了RDD的身上。



2、呼叫map方法,其實是將map方法附加給了RDD。之後的reduceByKey同理。

3、呼叫print方法,它是一個輸出操作。預設輸出RDD的前10個元素。呼叫print方法得到一個ForEachDStream,並將這個ForEachDStream註冊到DStreamGraph中。


至此,operation部分就結束了。此時,還沒有真正執行起來,這需要呼叫StreamingContext的start方法才行。

轉載: http://blog.csdn.net/yueqian_zhu/article/details/49021329

相關文章