java – Spark – 任务不可序列化:如何处理调用外部类/对象的复杂地图闭包?

看看这个问题:Scala + Spark – Task not serializable: java.io.NotSerializableExceptionon. When calling function outside closure only on classes not objects

问题:

假设我的映射器可以是内部调用其他类并创建对象并在其中执行不同内容的函数(def)。 (或者他们甚至可以是扩展类(Foo)=> Bar并在其应用方法中进行处理 – 但现在忽略这种情况)

Spark仅支持闭包的Java序列化。有什么办法吗?我们可以使用某些东西而不是关闭来做我想要做的事情吗?我们可以用Hadoop轻松地做这样的事情。这件事让Spark几乎不可用了。人们不能指望所有的第三方库都可以让所有的类扩展Serializable!

可能的解决方案:

这样的东西似乎是有用的:https://github.com/amplab/shark/blob/master/src/main/scala/shark/execution/serialization/KryoSerializationWrapper.scala

这肯定是一个包装是答案,但我看不清楚是怎么回事。

我想出了如何做到这一点我自己!

您只需要在通过关闭之前对对象进行序列化,然后再反序列化。即使您的课程不是Serializable,因为它在幕后使用了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像您想要的那样复杂,类,伴侣对象,嵌套类,引用多个第三方库。

KryoSerializationWrapper参考:https://github.com/amplab/shark/blob/master/src/main/scala/shark/execution/serialization/KryoSerializationWrapper.scala

http://stackoverflow.com/questions/23050067/spark-task-not-serializable-how-to-work-with-complex-map-closures-that-call-o

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – Spark – 任务不可序列化:如何处理调用外部类/对象的复杂地图闭包?