NPE in spark job



我正在使用Spark和在Scala中编程进行批处理作业。这项工作是一个简单的课程。但是,我定义了该类的字段变量,然后在运行方法中使用,该变量。

字段变量是在实际数据框和RDD操作之前初始化的,但随后在使用RDD时使用。

我观察到的是,在我的本地开发环境中,只有一个火花工人,一切都很好。但是,当我将作业提交到火花集群中时,它失败了,并说田间var是无效的。

我认为,字段var未正确序列化。这是真的吗?

一个后续问题是,在执行Spark作业时,是否建议使用现场变量?有设计模式吗?

编辑

import scala.collection.mutable
class Test {
  var config : MyConfig = null.asInstanceOf[MyConfig]
  def main(args: Array[String]): Unit = {
    config = new MyConfig
  }
  def job() = {
    /*config is null here*/
  }
}
case class MyConfig(
                     var from: String = "",
                     var to: String = "",
                     var unit: String = "",
                     var ids: Seq[String] = new mutable.ArraySeq[String](0)
                   ) {
  override def toString: String = {
    val sb = new StringBuilder
    sb.append(
      "from[%s], to[%s], last_n_unit[%s], id[%s]".format(
        this.from,
        this.to,
        this.unit,
        this.ids.mkString(",")
      )
    )
    sb.toString
  }
}

您的变量是初始化的,但是当类实例化在远程工人上时,它又是无效的。使您的变量成为您要定义的新功能的成员,这必须解决问题。

最新更新