2016-06-03 7 views
0

Скажем, у меня есть следующий код.Планка Scala/Spark с повторными вызовами функций

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) Будет ли функция F (х) вызывается дважды для каждого х в пределах flatmap? Так как сначала я назвал f (x) ._ 1, а затем f (x) ._ 2.

2) Параллельно будет выполняться лифта (особенно часть считывания данных)? Скажем, у меня было 3 узла, и каждый узел имеет 32 ядра. Я установил --num-executors = 2 и --executor-core = 32. Другой узел используется как узел драйвера.

Чтобы ответить на вышеуказанные вопросы, я искал документы для Spark/Scala, но ответа не получил. Я попытался запустить код в своей собственной системе. Похоже, что

1) f (x) вызывается дважды, потому что я обнаружил, что разделы данных обрабатываются twices. Но я не уверен.

2) Я заметил, что две папки-исполнители создаются под файловой системой искрового журнала, а также некоторые stdout от каждого исполнителя. Но я тоже не уверен.

Спасибо!

ответ

0

1) Каждый рабочий выполнит f(x) дважды, так как он вызывается два раза в вашей функции буквально - каждый раз при извлечении другого элемента получающегося кортежа.

2) Последний параметр вашего метода range: 10, что означает, что ваш диапазон RDD будет иметь 10 разделов. Это означает, что верхняя граница параллельных исполнений этого flatMap равна 10 (если у вас будет 10 исполнителей, flatMap может выполняться параллельно на каждом из этих исполнителей). Поскольку у вас есть два исполнителя, flatMap все равно будет выполняться параллельно, но только для этих двух исполнителей.

Смежные вопросы