2015-12-03 62 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 。正如你所说,在第二个例子中,有三个独立的进程并行进行**,那么如果集群资源足够,第二个代码示例将具有更好的性能。那么这两者的用例是什么? –