我正在使用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
}
}
您的变量是初始化的,但是当类实例化在远程工人上时,它又是无效的。使您的变量成为您要定义的新功能的成员,这必须解决问题。