У меня вопрос об использовании аккумуляторов в СДР и о том, как их надежно использовать.
Итак, представьте, что у нас есть следующий аккумулятор:
val sc: SparkContext = //...
val accum = sc.longAccumulator("Accumulator name")
val rdd = //some rdd
rdd foreach { _ =>
accum.add(1L)
}
Насколько я понимаю, данные RDD
делятся на разделы, и каждый раз, когда мы выполняем какое-либо действие, оно пытается
computeOrReadCheckpoint(split: Partition, context: TaskContext)
для каждого раздела.
Таким образом, если мы уже полностью вычислили один раздел, мы обновляем значение аккумулятора на стороне драйвера. Но после этого исполнитель, содержащий этот раздел, вылетает, но RDD
еще не был проверен.
Таким образом, раздел пересчитывается с нуля. Поэтому я ожидаю, что аккумулятор обновляется дважды для этих записей.
Возможен ли такой сценарий?