我发现Kafka主题的大小参差不齐。我们要基于某种逻辑对输入的RDD进行重新分区。
但是当我尝试应用分区时,出现object not serializable (class: org.apache.kafka.clients.consumer.ConsumerRecord
错误。
我发现了以下解决方法
Job aborted due to stage failure: Task not serializable
调用rdd.forEachPartition
并在其中创建NotSerializable
对象,如下所示:
rdd.forEachPartition(iter -> {
NotSerializable notSerializable = new NotSerializable();
// ...Now process iter
});
以上逻辑适用于此,不确定我是否错过了任何事情
val stream =KafkaUtils.createDirectStream[String, String]( ssc, PreferConsistent, Subscribe[String, String](topics, kafkaParam) ).map(_.value())
stream.foreachRDD { rdd =>
val repartitionRDD = flow.repartitionRDD(rdd,1)
println("&&&&&&&&&&&&&& repartitionRDD " + repartitionRDD.count())
val modifiedRDD = rdd.mapPartitions {
iter =>{
val customerRecords: List[ConsumerRecord[String, String]] = List[ConsumerRecord[String, String]]()
while(iter.hasNext){
val consumerRecord :ConsumerRecord[String, String] = iter.next()
customerRecords:+ consumerRecord
}
customerRecords.iterator
}
}
val r = modifiedRDD.repartition(1)
println("************* after repartition " + r.count())
但是仍然得到相同的对象而不是可序列化错误。任何帮助是极大的赞赏。
我试图使流成为瞬态,但这也不能解决问题。
我将测试类设置为Serializable,但是没有解决问题。