带有重复函数调用的Scala / Spark平面图

时间:2016-06-03 18:40:49

标签: scala apache-spark flatmap

说我有以下代码。

def f(x): (Array[Double], Array[Int])={
    val   data: Array[Double]   //1D array
    val   index: Array[Int]    //Data element's index

    //Read data from a file into "data"
    //Generate index (based on value "x") into "index"

    (dset_datas, index)
}

sc.range(0, 10, 1, 10).flatMap.(x => (f(x)._1 zip f(x)._2))

问题:

1)对于flatmap中的每个x,函数f(x)是否会被调用两次?因为我首先调用f(x)._ 1然后调用f(x)._ 2。

2)是否会并行执行flapmap(特别是数据读取部分)?假设我有3个节点,每个节点有32个核心。我设置--num-executors = 2和--executor-cores = 32。另一个节点用作驱动程序节点。

为了回答上述问题,我搜索了很多Spark / Scala的文档,但没有得到任何答案。我试图在我自己的系统上运行代码。它看起来像那样

1)f(x)被调用两次,因为我发现数据分区是处理过的两次。但是,我不确定。

2)我注意到在spark日志文件系统下创建了两个executor文件夹,还有一些来自每个执行器的stdout。但是,我也不确定。

谢谢!

1 个答案:

答案 0 :(得分:0)

1)每个工作人员将执行set terminal pdf set output "fichier.pdf" set datafile separator "," f(x, t) = x/(80.4/(x + t)**2) do for [t1=0:1] { do for [t2=0:1] { plot 'AirEauG10VEtHDebit1mLMinute.dat' u 1:(f($2, t1)) title 'e='.t1,\ 'a.dat' u 1:(f($2, t2)) title 'e='.t2 } } 两次,因为它在你的函数文本中被调用了两次 - 每次都提取结果元组的不同元素。

2)f(x)方法的最后一个参数是range,这意味着你的范围RDD将有10个分区。这意味着10的并行执行的上限是10(如果你有10个执行程序,flatMap可以在每个执行程序上并行执行)。由于您有两个执行程序,flatMap仍将并行执行,但仅限于这两个执行程序。