我正在创建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")
}
)