您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Spark-任务不可序列化:如何处理在外部类/对象外部调用的复杂映射闭包?

Spark-任务不可序列化:如何处理在外部类/对象外部调用的复杂映射闭包?

我自己想办法了!

您只需要在通过闭包之前对对象进行序列化,然后再进行反序列化即可。即使您的课程不是可序列化的,这种方法也行得通,因为它在后台使用了Kryo。您只需要一些咖喱。;)

这是我如何做的一个例子:

def genMapper(kryoWrapper: KryoSerializationWrapper[(Foo => Bar)])
               (foo: Foo) : Bar = {
    kryoWrapper.value.apply(foo)
}
val mapper = genMapper(KryoSerializationWrapper(new Blah(abc))) _
rdd.flatMap(mapper).collectAsMap()

object Blah(abc: ABC) extends (Foo => Bar) {
    def apply(foo: Foo) : Bar = { //This is the real function }
}

随意使Blah变得很复杂,包括类,伴随对象,嵌套类,对多个3rd party库的引用。

KryoSerializationWrapper指的是:https ://github.com/amplab/shark/blob/master/src/main/scala/shark/execution/serialization/KryoSerializationWrapper.scala

其他 2022/1/1 18:25:24 有451人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶