我正在使用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
}
}
答案 0 :(得分:0)
您的变量已初始化,但是当在远程工作程序上实例化该类时,它再次为null。使您的变量成为您定义的新函数的成员,这必须解决问题。