我正在尝试使用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)
})
})
}
答案 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
})
})