我正在尝试从kafka服务器创建一个dStream,然后在该流上进行一些转换。如果流是空的,我已经包含了一个catch(if(!rdd.partitions.isEmpty)
);但是,即使没有事件发布到kafka主题,也永远不会达到else
语句。
val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)
stream.foreachRDD { rdd =>
if(!rdd.partitions.isEmpty) {
val message = rdd.map((x$2) => x$2._2).collect().toList.map(parser)
val val = message(0)
} else println("empty stream...")
ssc.start()
ssc.awaitTermination()
}
在使用KafkaUtils.createDirectStream
而不是createStream
时,是否应该使用替代语句检查流是否为空?
答案 0 :(得分:4)
使用RDD.isEmpty
代替RDD.partitions.isEmpty
,它会添加一项检查,以查看基础分区是否确实包含元素:
stream.foreachRDD { rdd =>
if(!rdd.isEmpty) {
// Stuff
}
}
RDD.partitions.isEmpty
无效的原因是RDD
内存在分区,但该分区本身为空。但是从partitions
Array[Partition]
的角度来看,它不是空的。