为什么Spark Streaming + Kafka中的foreachRDD很慢,应该是什么时候?

时间:2017-04-13 04:05:43

标签: scala apache-spark apache-kafka spark-streaming

我使用Spark 2.1和Kafka 0.08.xx来执行Spark Streaming作业。这是一个文本过滤作业,大部分文本将在此过程中被过滤掉。我以两种不同的方式实施:

  1. 直接过滤DirectStream的输出:

    val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)
    val jsonMsg = messages.map(_._2)
    val filteredMsg = jsonMsg.filter(x=>x.contains(TEXT1) && x.contains(TEXT2) && x.contains(TEXT3))
    
  2. 使用foreachRDD函数

     messages.foreachRDD { rdd => 
               val record = rdd.map(_.2).filter(x => x.contains(TEXT1) &&
                                                     x.contains(TEXT2) &&
                                                     x.contains(TEXT3) )} 
    
  3. 我发现第一种方法明显比第二种方法快,但我不确定这是常见的情况。

    方法1和方法2之间有什么区别吗?

1 个答案:

答案 0 :(得分:1)

filter是一种转变。转换被懒惰地评估,也就是说,除非您执行某个操作(例如foreachRDD,写入数据等),否则它们不会执行任何操作。

所以在1.实际上没有任何事情发生,因此明显快于2.,这是使用动作foreachRDD来做某事。