我的代码看起来像这样(抱歉,这是我无法显示完整代码的原因):
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和独立模式下运行的区别是什么?我怎样才能让它正常工作?
答案 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
})
}
}