说我有以下代码。
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。但是,我也不确定。
谢谢!
答案 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
仍将并行执行,但仅限于这两个执行程序。