为什么我的Spark程序在IntelliJ中运行正常但抛出" org.apache.spark.SparkException:任务不可序列化"提交后?

时间:2017-05-18 02:56:18

标签: java apache-spark spark-streaming

我的代码看起来像这样(抱歉,这是我无法显示完整代码的原因):

public class MyClass {

    final A _field1; // Non-serializable object
    final B _field2; // Non-serializable object

    public void doSomething() {
        myJavaDStream...
                     .mapToPair(t -> {
                         // Do some stuff with _field1 and _field2
                     })
                     .reduceByKey((b1, b2) -> {
                         // Do other stuff with _field1 and _field2
                     })
                     ...
    }
}

public static void main() {
    MyClass myClass = new MyClass();
    myClass.doSomething();
}

在IntelliJ中,一切正常。但是在使用spark-submit构建并提交jar文件后,它会抛出org.apache.spark.SparkException: Task not serializable。堆栈跟踪指向mapToPair中的lambda。

我的问题是:在IDE和独立模式下运行的区别是什么?我怎样才能让它正常工作?

1 个答案:

答案 0 :(得分:0)

好的,所以我只想出了解决方案。对于非可序列化的类,尤其是来自第三方lib,你可以wrap them with Twitter Chill,它附带Spark,就像这样:

import com.twitter.chill.MeatLocker;

public class MyClass {

    final MeatLocker<A> _field1; // Non-serializable object

    public void doSomething() {
        myJavaDStream...
                     .map(t -> {
                         // call _field1.get() instead of _field1 to unwrap the value
                     })
    }
}