NPE在火花工作

时间:2018-02-07 08:24:30

标签: scala apache-spark

我正在使用spark和scala编程来完成批处理作业。这份工作很简单。但是,我为类定义了一个字段变量,然后在作业运行方法中使用它。

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

我观察到的是,在我的本地开发环境中,只有一个火花工人,一切正常。但是,当我将作业提交给spark集群时,它失败并且表示字段var为NULL。

然后我认为,字段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
  }
}

1 个答案:

答案 0 :(得分:0)

您的变量已初始化,但是当在远程工作程序上实例化该类时,它再次为null。使您的变量成为您定义的新函数的成员,这必须解决问题。