Spark在foreachRDD操作中引发Not Serializable Exception

时间:2019-06-30 15:41:03

标签: scala apache-kafka spark-streaming

我正在尝试使用scala和spark流实现观察者模式。这个想法是,每当我从流(从kafka)接收到一条记录时,我都会通过在闭包内部调用方法“ notifyObservers”来通知观察者。这是代码:

该流由kafka utils提供。 遵循模式规则将方法notifyObserver定义为抽象类。 我认为该错误与方法无法序列化有关。 我在想正确吗?如果是的话,我应该遵循哪种解决方案? 谢谢

def onMessageConsumed() = {
    stream.foreachRDD(rdd => {
      rdd.foreach(consumerRecord => {
        val record = new Record[T](consumerRecord.topic(), 
                                   consumerRecord.value())
        //notify observers with the record to compute
        notifyObservers(record)
      })
    })
  }

1 个答案:

答案 0 :(得分:0)

是的,在发送给其他执行器的代码中使用的类(在foreach等中执行)应该实现Serializable接口。

此外,如果您的通知代码需要连接到某些资源,则需要将foreach包装到foreachPartition中,如下所示:

stream.foreachRDD(rdd => {
   rdd.foreachPartition(rddPartition =>
      // setup connection to external component      
      rddPartition.foreach(consumerRecord => {
        val record = new Record[T](consumerRecord.topic(), 
                                   consumerRecord.value())
        notifyObservers(record)
      })
      // close connection to external component
   })
  })