【问题标题】:kafka directstream dstream map does not printkafka directstream dstream映射不打印
【发布时间】:2016-08-02 18:20:24
【问题描述】:

我有这个简单的 Kafka Stream

val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicsSet)

// Each Kafka message is a flight
val flights = messages.map(_._2)

flights.foreachRDD( rdd => {
  println("--- New RDD with " + rdd.partitions.length + " partitions and " + rdd.count() + " flight records");
  rdd.map { flight => {        
    val flightRows = FlightParser.parse(flight)
    println ("Parsed num rows: " + flightRows)
    }
  }          
})

ssc.start()
ssc.awaitTermination()

Kafka 有消息,Spark Streaming 能够将它们作为 RDD 获取。但是我的代码中的第二个 println 不打印任何内容。我在本地 [2] 模式下运行时查看了驱动程序控制台日志,在纱线客户端模式下运行时检查了纱线日志。

我错过了什么?

以下代码代替 rdd.map,在 spark 驱动程序控制台中可以很好地打印:

for(flight <- rdd.collect().toArray) {
     val flightRows = FlightParser.parse(flight)
     println ("Parsed num rows: " + flightRows)
}

但我担心这个飞行对象的处理可能会发生在火花驱动程序项目中,而不是执行程序中。如果我错了,请纠正我。

谢谢

【问题讨论】:

  • 您查看过 worker 执行程序日志吗?也许它没有找到你的 FlightParser 类?

标签: scala spark-streaming rdd dstream


【解决方案1】:

rdd.map 是一个惰性转换。除非对该 RDD 调用操作,否则它不会实现。
在这种特定情况下,我们可以使用rdd.foreach,这是 RDD 上最通用的操作之一,使我们能够访问 RDD 中的每个元素。

flights.foreachRDD{ rdd => 
    rdd.foreach { flight =>        
        val flightRows = FlightParser.parse(flight)
        println ("Parsed num rows: " + flightRows) // prints on the stdout of each executor independently
    }
}

鉴于这个RDD动作是在executors中执行的,我们会在executor的STDOUT中找到println输出。

如果你想打印驱动上的数据,你可以collectDStream.foreachRDD闭包内的RDD的数据。

flights.foreachRDD{ rdd => 
  val allFlights = rdd.collect() 
  println(allFlights.mkString("\n")) // prints to the stdout of the driver
}

【讨论】:

  • 感谢@massg 的建议。当我尝试您的第一种方法时,出现以下异常: org.apache.spark.SparkException: Task not serializable Caused by: java.io.NotSerializableException: org.apache.spark.streaming.StreamingContext 我猜这是因为飞行变量仅在 Spark Driver 中可用,在执行程序中不可用。我错过了什么?
猜你喜欢
  • 2018-03-16
  • 2020-05-27
  • 1970-01-01
  • 2017-02-22
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2013-03-11
相关资源
最近更新 更多