Java 为什么我的Spark程序在IntelliJ中运行良好,但抛出;org.apache.spark.SparkException:任务不可序列化”;提交之后?

Java 为什么我的Spark程序在IntelliJ中运行良好,但抛出;org.apache.spark.SparkException:任务不可序列化”;提交之后?,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,我的代码如下所示(抱歉,我无法显示完整代码是有原因的): 在IntelliJ中,一切都很好。但是在使用spark submit构建并提交jar文件后,它抛出org.apache.spark.sparkeexception:Task not serializable。堆栈跟踪指向mapToPair中的lambda 我的问题是:在IDE中运行和在独立模式下运行有什么区别?我怎样才能使它正常工作呢?好的,我刚刚想出了解决办法。对于不可序列化的类,特别是来自第三方库的类,您可以使用Spark,如下所示:

我的代码如下所示(抱歉,我无法显示完整代码是有原因的):

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


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

好的,我刚刚想出了解决办法。对于不可序列化的类,特别是来自第三方库的类,您可以使用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
                     })
    }
}
import com.twitter.chill.MeatLocker;
公共类MyClass{
final MeatLocker _field1;//不可序列化对象
公共无效剂量测定法(){
myJavaDStream。。。
.map(t->{
//调用_field1.get()而不是_field1来展开值
})
}
}

您的类包含两个不可序列化的对象,因此根据定义,您的类是不可序列化的。在IntelliJ内部运行时,所有内容都在IntelliJ的本地运行,因此它不必实际分发类。在独立模式下运行时,它必须分发(并因此序列化)类,这就是为什么在独立模式下会看到错误。
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
                     })
    }
}