Java 为什么实现PairFlatMapFunction的类会出现NullPointerException?
我在Thread上运行Spark应用程序(Spark-1.5.1-hadoop2.6),在集群上运行时会出现NullPointerException。我已经搜索了一些关于这个问题的信息,我认为我的程序似乎没有在另一个RDD函数中使用RDD函数 在使用groupbykey函数之后,我使用了flatmaptopair函数。我的重写Java代码如下所示:Java 为什么实现PairFlatMapFunction的类会出现NullPointerException?,java,nullpointerexception,apache-spark,Java,Nullpointerexception,Apache Spark,我在Thread上运行Spark应用程序(Spark-1.5.1-hadoop2.6),在集群上运行时会出现NullPointerException。我已经搜索了一些关于这个问题的信息,我认为我的程序似乎没有在另一个RDD函数中使用RDD函数 在使用groupbykey函数之后,我使用了flatmaptopair函数。我的重写Java代码如下所示: public class MyClass implements PairFlatMapFunction<Tuple2<A, Iterab
public class MyClass implements PairFlatMapFunction<Tuple2<A, Iterable<B>>, C, D> {
private static OtherClass otherObj;
public MyClass() {
this.otherObj = new OtherClass();
}
@Override public Iterable<Tuple2<C, D>> call(Tuple2<A, Iterable<B>> tuple2) {
otherObj.getInfo(); // NullPointerException
// ...
return XX;
}
}
我在Spark中初始化静态变量时是否犯了一些错误?或者我对RDD操作的理解是错误的?原因是
私有静态OtherClass otherObj
是静态的
,如中所述:
类的默认可序列化字段定义为非瞬态和非静态字段
…并且在导致NPE的反序列化之后不会调用构造函数
Java序列化是默认的序列化机制,用于通过网络将任务从驱动程序发送给执行者
您可以使用中所述的
writeObject
和readObject
方法覆盖默认行为。@JacekLaskowski非常感谢!在搜索了有关Java序列化的更多信息后,我意识到修改静态
或瞬态
的变量不会被序列化以进行传输。反序列化后不会调用构造函数。因此,worker中的otherObj
应该是未定义的。
WARN TaskSetManager: Lost task 7.0 in stage 1.0 (TID 17, 4-52): java.lang.NullPointerException