Apache Spark:从检查点恢复状态期间的NPE

时间:2017-02-16 10:43:38

标签: hadoop apache-spark hbase spark-streaming

我们正在构建简单的Streaming应用程序,它使用HBase RDD与传入的DStream连接。 示例代码:

val indexState = sc.newAPIHadoopRDD(
  conf,
  classOf[TableInputFormat],
  classOf[ImmutableBytesWritable],
  classOf[Result]).map { case (rowkey, v) => //some logic}

val result = dStream.transform { rdd =>
  rdd.leftOuterJoin(indexState)
}  

它运行正常,但是当我们为StreamingContext启用检查点时 让应用程序从以前创建的检查点恢复, 它总是抛出NullPointerException。

ERROR streaming.StreamingContext: Error starting the context, marking it as stopped
java.lang.NullPointerException
        at org.apache.hadoop.hbase.mapreduce.TableInputFormat.setConf(TableInputFormat.java:119)
        at org.apache.spark.rdd.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:120)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)
        at scala.Option.getOrElse(Option.scala:120)
        at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)
        at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)
        at scala.Option.getOrElse(Option.scala:120)

有人遇到过同样的问题吗? 版本:

  • Spark 1.6.x
  • Hadoop 2.7.x

谢谢!

1 个答案:

答案 0 :(得分:1)

Spark Streaming检查点不能用于从以前的作业中恢复,至少在1.6.x中是这样。如果您的作业已停止并重新提交,则无法重新使用检查点数据。在提交作业之前,您必须删除任何旧的检查点数据。

  

[R]从早期检查点信息中删除升级前代码无法完成。检查点信息基本上包含序列化的Scala / Java / Python对象,并且尝试使用新的修改类反序列化对象可能会导致错误。在这种情况下,要么使用不同的检查点目录启动升级的应用程序,要么删除以前的检查点目录。

Upgrading the code - checkpointing