混乱与Spark流式传输多个输入kafka dstreams

时间:2015-12-03 07:00:14

标签: spark-streaming

我是Spark Streaming的新手。我不知道下面代码之间的区别:

A:

 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(......)
}

在Spark Streaming App中执行时,2个代码示例之间有何不同。有帮助吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我会向后做这件事,因为这可能更容易解释: - )

在第二个示例中,您通过(1 to 3).map { [...] createStream [...] }创建了三个DStreams,然后在其上调用foreachRDD,因此您可以并行执行三组不同的处理,因此foreachRDD对于您在Spark流式上下文中设置的每个时间段,都会调用3次}函数 - 即在第一个时间段内,您将为流1调用foreachRDD,为流2调用一个,为流3。

在第一个示例中,您创建相同的三个DStream,但随后在它们上调用union以生成一个带有来自所有三个元素的DStream。这意味着您在每个时间段只能调用foreachRDD函数,但RDD,但它现在包含来自流1,流2和流3的所有的元素。