如何通过在RDD上分离输入DStream来处理输入DStream以打印Kafka消息?

时间:2019-03-31 01:01:04

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

我正在创建Spark Streaming应用程序,并希望分别处理每个kafka消息。现在,我只想记录消息值以验证一切正常。但是,当我尝试打印消息值时,我得到了java.lang.NullPointerException。我有条件跳过空的RDD。问题出在第logger.warn(s"Message ${message.value.toString}")行,因为没有它,一切运行正常。造成异常的原因是什么?

我的想法是在单独的RDD上拆分输入DStream,所以我使用的是foreachRDD方法。使用它,我应该获得ConsumerRecord的RDD,其中第一个元素是键,第二个是实际值。然后,我开始处理每个ConsumerRecord,以尝试提取并打印消息值。

val kafkaStream = KafkaUtils.createDirectStream[String, String](
    streamingContext,
    PreferConsistent,
    Subscribe[String, String](topics, kafkaParams)
  )

kafkaStream.foreachRDD( (rdd: RDD[ConsumerRecord[String, String]], time: Time) =>
    if(!rdd.isEmpty){
      rdd.foreach(message =>
        if(!message.value().isEmpty){
          logger.warn(s"Message ${message.value.toString}")
        }else{
          logger.warn(s"Empty value")
        }
      )
    }else{
      logger.warn(s"Empty rdd")
    }
  )

0 个答案:

没有答案