在scala中使用函数调用的Spark执行顺序是什么?

时间:2018-02-27 06:41:02

标签: scala apache-spark global-variables

我有一个火花程序如下:

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函数中,我调用initid_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程序的执行顺序是什么?为什么我的解决方案有效?

0 个答案:

没有答案