如何对Spark DStream Kafka ConsumerRecord RDD进行分区

时间:2018-09-28 09:16:26

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

我发现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())

但是仍然得到相同的对象而不是可序列化错误。任何帮助是极大的赞赏。

  1. 我试图使流成为瞬态,但这也不能解决问题。

  2. 我将测试类设置为Serializable,但是没有解决问题。

0 个答案:

没有答案