我有一个火花程序如下:
object A {
var id_set: Set[String] = _
def init(argv: Array[String]) = {
val args = new AArgs(argv)
id_set = args.ids.split(",").toSet
}
def main(argv: Array[String]) {
init(argv)
val conf = new SparkConf().setAppName("some.name")
val rdd1 = getRDD(paras)
val rdd2 = getRDD(paras)
//......
}
def getRDD(paras) = {
//function details
getRDDDtails(paras)
}
def getRDDDtails(paras) = {
//val id_given = id_set
id_set.foreach(println) //worked normal, not empty
someRDD.filter{ x =>
val someSet = x.getOrElse(...)
//id_set.foreach(println) ------wrong, id_set just empty set
(some_set & id_set).size > 0
}
}
class AArgs(args: Array[String]) extends Serializable {
//parse args
}
我有一个全局变量id_set
。起初,它只是一个空集。在main函数中,我调用init
将id_set
设置为args中的非空集。之后,我调用getRDD
函数调用getRDDDtails
。在getRDDDtails
中,我根据id_set
中的内容过滤了一个rdd。但是,结果semms为空。我试图在执行器中打印is_set
,它只是一个空行。所以,问题似乎是is_set
没有很好地启动(在init
函数中)。但是,当我尝试在驱动程序中打印is_set
时(在函数getRDDDtails
的标题行中),它正常工作,而不是空的。
因此,我尝试在函数val id_given = id_set
中添加getRDDDtails
,稍后再使用id_given
。这似乎解决了这个问题。但我完全不知道为什么会发生这种情况? Spark程序的执行顺序是什么?为什么我的解决方案有效?