为什么实现PairFlatMapFunction的类会出现NullPointerException?

时间:2015-11-19 05:45:37

标签: java nullpointerexception apache-spark

我在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操作的理解是错误的?

1 个答案:

答案 0 :(得分:2)

原因是private static OtherClass otherObjstatic1.5 Defining Serializable Fields for a ClassJava Object Serialization Specification中所述:

  

类的默认可序列化字段被定义为非瞬态和非静态字段。

...并且在反序列化之后,构造函数不会被调用,从而导致NPE。

Java Serialization是默认的序列化机制,用于通过网络将任务从驱动程序发送到执行程序。

您可以使用1.10 The Serializable Interface中所述的writeObjectreadObject方法覆盖默认行为。