java - 为什么我的Spark程序在IntelliJ中运行良好,但提交后抛出 "org.apache.spark.SparkException: Task not serializable"?

标签 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:任务不可序列化。堆栈跟踪指向 mapToPair 中的 lambda。

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

最佳答案

好的,所以我刚刚找到了解决方案。对于不可序列化的类,尤其是。从第 3 方库,您可以 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
                     })
    }
}

关于java - 为什么我的Spark程序在IntelliJ中运行良好,但提交后抛出 "org.apache.spark.SparkException: Task not serializable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037852/

相关文章:

apache-spark - SBT 无法导入 Kafka 编码器/解码器类

apache-spark - Spark 错误 : java. lang.NoClassDefFoundError: org/apache/spark/sql/sources/v2/StreamWriteSupport

java - JSplitPane 中分隔线移动的动画

java - Android 自定义日历/日期选择器

java - 两个日期之间的期间数(自定义)

apache-spark - 如果数据为 10 gb 且 RAM 为 1gb,会将数据加载到内存中

apache-spark - Apache Spark Streaming 中的定期广播

java - 为什么我们不能在 Java 7+ 中打开类?

apache-spark - 如何在 Spark 中生成大字数文件?

apache-spark - 如何将托管在 HDFS 中的配置文件传递给 Spark 应用程序?