kafka directstream dstream map不打印

时间:2016-04-12 08:52:14

标签: scala spark-streaming rdd dstream

我有这个简单的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)
}

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

由于

1 个答案:

答案 0 :(得分:2)

{!! Form::open(['action' => ['Test\\TestController@destroy', $thread->id], 'method' => 'delete', 'onsubmit' => 'return ConfirmDelete()']) !!} 是一种懒惰的转变。除非在该RDD上调用某个动作,否则它将无法实现 在这种特定情况下,我们可以使用rdd.map这是RDD上最通用的操作之一,使我们可以访问RDD中的每个元素。

rdd.foreach

鉴于此RDD操作在执行程序中执行,我们将在执行程序的STDOUT中找到println输出。

如果您想在驱动程序上打印数据,可以flights.foreachRDD{ rdd => rdd.foreach { flight => val flightRows = FlightParser.parse(flight) println ("Parsed num rows: " + flightRows) // prints on the stdout of each executor independently } } 关闭collect内的RDD数据。

DStream.foreachRDD