DStream检查点已启用,但DStream及其功能不可序列化

时间:2016-10-31 06:50:14

标签: scala spark-streaming

我想将DStream发送给Kafka,但它仍然没有用。

searchWordCountsDStream.foreachRDD(rdd =>
rdd.foreachPartition(

    partitionOfRecords =>
    {
      val props = new HashMap[String, Object]()

      props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, outbroker)

      props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
        "org.apache.kafka.common.serialization.StringSerializer")
      props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
        "org.apache.kafka.common.serialization.StringSerializer")
      val producer = new KafkaProducer[String,String](props)

      partitionOfRecords.foreach
      {
        case (x:String,y:String)=>{
          println(x)
          val message=new ProducerRecord[String, String](outtopic,null,x)
          producer.send(message)
        }
      }
      producer.close()
    })
)

这是一些错误信息:

  

16/10/31 14:44:15错误StreamingContext:启动上下文时出错,   将其标记为已停止java.io.NotSerializableException:DStream   检查点已启用,但DStreams具有其功能   不可序列化的spider.app.job.MeetMonitor序列化堆栈:      - 对象不可序列化(类:spider.app.job.MeetMonitor,值:spider.app.job.MeetMonitor@433c6abb)      - field(类:spider.app.job.MeetMonitor $$ anonfun $ createContext $ 2,name:$ outer,type:class spider.app.job.MeetMonitor)      - object(类spider.app.job.MeetMonitor $$ anonfun $ createContext $ 2,)      - field(类:org.apache.spark.streaming.dstream.DStream $$ anonfun $ foreachRDD $ 1 $$ anonfun $ apply $ mcV $ sp $ 3,   name:cleaningF $ 1,输入:interface scala.Function1)      - object(类org.apache.spark.streaming.dstream.DStream $$ anonfun $ foreachRDD $ 1 $$ anonfun $ apply $ mcV $ sp $ 3,   )      - writeObject数据(类:org.apache.spark.streaming.dstream.DStream)      - object(类org.apache.spark.streaming.dstream.ForEachDStream,org.apache.spark.streaming.dstream.ForEachDStream@3ac3f6f)      - writeObject数据(类:org.apache.spark.streaming.dstream.DStreamCheckpointData)      - object(类org.apache.spark.streaming.dstream.DStreamCheckpointData,[0   检查点文件

     

])      - writeObject数据(类:org.apache.spark.streaming.dstream.DStream)      - object(类org.apache.spark.streaming.dstream.ForEachDStream,org.apache.spark.streaming.dstream.ForEachDStream@6f9c5048)      - 数组元素(索引:0)      - array(class [Ljava.lang.Object;,size 16)      - field(类:scala.collection.mutable.ArrayBuffer,name:array,type:class [Ljava.lang.Object;)      - object(类scala.collection.mutable.ArrayBuffer,ArrayBuffer(org.apache.spark.streaming.dstream.ForEachDStream@6f9c5048,   org.apache.spark.streaming.dstream.ForEachDStream@3ac3f6f))      - writeObject数据(类:org.apache.spark.streaming.dstream.DStreamCheckpointData)      - object(类org.apache.spark.streaming.dstream.DStreamCheckpointData,[0   检查点文件

     

])

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并在这里找到了答案

https://forums.databricks.com/questions/382/why-is-my-spark-streaming-application-throwing-a-n.html

似乎使用带有foreachRDD的检查点会导致问题。在我的代码中删除检查点后,一切都很好。

P / S。我只是想发表评论,但我没有足够的声誉这样做。

答案 1 :(得分:0)

我一直在使用Spark 2.3.0版本并遇到同样的问题,我只是通过为它抛出错误的类实现Serializable接口来解决它。

在你的情况下,spider.app.job.MeetMonitor应该实现它:。

公共类MeetMonitor实现了Serializable {

// ... }

如果您在课堂上使用Logger,请注意,它的实例也不可序列化,因此可能导致同样的问题。 这也可以通过将其定义为:

来解决

private static final Logger logger = Logger.getLogger(.class);