2015-12-03 63 views
1

我是Spark Streaming的新手。我不知道下面的代碼之間的區別:火花流多輸入kafka dstreams混淆

答:

val kafkaDStreams = (1 to 3).map { i => 
     KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, 
     topicsMap, StorageLevel.MEMORY_AND_DISK_SER) 
     .map(_._2) 
} 
ssc.union(kafkaDStreams).foreachRDD(......) 

B:

val kafkaDStreams = (1 to 3).map { i => 
    KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, 
      topicsMap, StorageLevel.MEMORY_AND_DISK_SER) 
    .map(_._2).foreachRDD(......) 
} 

什麼時候,以星火流應用程序執行的2個樣品之間的差異。任何幫助?謝謝!

回答

1

我會倒退,需要創建三個DStreams通過(1 to 3).map { [...] createStream [...] },然後要求他們foreachRDD,所以你有三個這樣做,因爲它可能更容易解釋這樣:-)

在第二個例子單獨的處理並行進行,因此您的Spark流式上下文中設置的每個時間段都會調用您的foreachRDD函數三次 - 即在第一個時間段內,您將爲流1獲得一個foreachRDD的調用,一個用於流2和一個流3.

在第一個例子中,你創建相同的三個DS但是然後在它們上面調用union來生成一個DStream,其中包含三個元素。這意味着每個時間段只有一個呼叫foreachRDD函數,但是RDD現在包含來自所有的流1,流2和流3的元素。

+0

感謝您的回覆,Philip 。正如你所說,在第二個例子中,有三個獨立的進程並行進行**,那麼如果集羣資源足夠,第二個代碼示例將具有更好的性能。那麼這兩者的用例是什麼? –