Apache spark 检查点SqlContext nullpointerException问题

Apache spark 检查点SqlContext nullpointerException问题,apache-spark,apache-spark-sql,spark-streaming,Apache Spark,Apache Spark Sql,Spark Streaming,我在我的应用程序中使用了检查点,当我的应用程序以失败开始时,我在SQLContext上得到一个NullPointerException。 我假设由于序列化/反序列化问题,应用程序无法恢复SQLContext。SQLContext不可序列化吗 下面是我的代码 //DriverClass final JavaSparkContext javaSparkCtx = new JavaSparkContext(conf); final SQLContext sqlContext =

我在我的应用程序中使用了检查点,当我的应用程序以失败开始时,我在SQLContext上得到一个NullPointerException。 我假设由于序列化/反序列化问题,应用程序无法恢复SQLContext。SQLContext不可序列化吗

下面是我的代码

    //DriverClass
    final JavaSparkContext javaSparkCtx = new JavaSparkContext(conf);
    final SQLContext sqlContext = new SQLContext(javaSparkCtx);

    JavaStreamingContextFactory javaStreamingContextFactory = new JavaStreamingContextFactory() {
        @Override
        public JavaStreamingContext create() { //only first time executed
            // TODO Auto-generated method stub

            JavaStreamingContext jssc = new JavaStreamingContext(javaSparkCtx, Durations.minutes(1));
            jssc.checkpoint(CHECKPOINT_DIRECTORY);

            HashMap < String, String > kafkaParams = new HashMap < String, String > ();
            kafkaParams.put("metadata.broker.list",
                            "abc.xyz.localdomain:6667");
            //....
            JavaDStream < String > fullMsg = messages
                                             .map(new MapFunction());

            fullMsg.foreachRDD(new SomeClass(sqlContext));
            return jssc;
        }
    };
}

//Closure Class
public class SomeClass implements Serializable, Function < JavaRDD < String > , Void > {
    SQLContext sqlContext;
    public SomeClass(SQLContext sqlContext) {
        // TODO Auto-generated constructor stub
        this.sqlContext = sqlContext;
    }
    public void doSomething() {
        this.sqlContext.createDataFrame();**// here is the nullpointerException**
    }
    //.......
}
SQLContext是可序列化的,因为Spark SQL需要在内部执行器端使用SQLContext。但是,不应将其序列化到流检查点。相反,您应该从rdd获取它,如下所示SQLContext SQLContext=SQLContext.getOrCreaterdd.context


有关更多详细信息,请参阅流式文档:

如果我们使用HiveContext而不是SQLContext,会发生什么情况?如果您已经创建了HiveContext,SQLContext.getOrCreate将只返回它。