Apache Spark: Dag не выполняется дважды для reduceByKey

У вас есть простой, может быть, странный вопрос: для следующего кода DAG выполняется дважды, что и ожидалось, потому что я вызываю действие два раза:

val input = sc.parallelize(List(1,2,3,4))
val result = input.map(x => {
  println("!!! Input Map !!!")
  errorLines.add(1)
  (x,1)
})
//.reduceByKey(_+_)
println(result.count())
println(result.collect())

Если я раскомментирую reduceByKey строку - DAG будет выполнен только один раз, хотя reduceByKey это преобразование и я вызываю действия два раза.

Означает ли это, что Spark не всегда пересчитывает DAG?


person ALincoln    schedule 03.07.2017    source источник


Ответы (1)


Файлы перемешивания в Spark служат неявным кешем, поэтому всякий раз, когда ваш конвейер содержит этап перемешивания (например, *ByKey) и происходит сбой узла, Spark будет повторять только последний этап.

При этом ни использование stdout, ни аккумуляторов errorLines не является надежным в преобразованиях. При нормальном исполнении первая будет потеряна, а вторая не дает гарантий ровно один раз.

Связано с Что означает пропущенный этап в веб-интерфейсе Apache Spark?

person zero323    schedule 03.07.2017