我的代码如下所示(抱歉,我无法显示完整代码):
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/