我在yarn上运行Spark应用程序(spark-1.5.1 - hadoop2.6),在集群上运行时出现NullPointerException。我已经搜索了一些有关此问题的信息,我认为我的程序似乎没有在另一个RDD函数中使用RDD函数。
使用groupbykey函数后我使用flatmaptopair函数。我覆盖的Java代码就像:
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;
}
}
但是,我的重载函数中的语句抛出了NullPointerException:
WARN TaskSetManager: Lost task 7.0 in stage 1.0 (TID 17, 4-52): java.lang.NullPointerException
我是否在Spark中初始化静态变量时犯了一些错误?或者我对RDD操作的理解是错误的?
答案 0 :(得分:2)
原因是private static OtherClass otherObj
为static
且1.5 Defining Serializable Fields for a Class的Java Object Serialization Specification中所述:
类的默认可序列化字段被定义为非瞬态和非静态字段。
...并且在反序列化之后,构造函数不会被调用,从而导致NPE。
Java Serialization是默认的序列化机制,用于通过网络将任务从驱动程序发送到执行程序。
您可以使用1.10 The Serializable Interface中所述的writeObject
和readObject
方法覆盖默认行为。