В Spark RDD являются неизменяемыми, тогда как реализованы аккумуляторы?

1

Устойчивые распределенные наборы данных (RDD) предназначены для неизменности. Одна из причин, побуждающих их быть неизменными, заключается в отказоустойчивости и избегании, поскольку они обрабатываются многими процессами и, возможно, многими узлами одновременно. Это может избежать условий гонки, а также избежать накладных расходов, связанных с попыткой контролировать эти условия.

Существует несколько иллюстраций того, как реализуются RDD (например, этот). Однако, похоже, я не могу найти тот, который иллюстрирует, как реализуется Аккумулятор. Он находится в разделе RDD в документах Apache Spark. Означает ли это, что для каждого приращения значения создается новое RDD, или это совсем другая структура данных?

Теги:
apache-spark
rdd

1 ответ

1

Accumulator - это переменные только для записи для исполнителей. Они могут быть добавлены исполнителями и прочитаны только драйвером.

executors and read by the driver only.
executor1: accumulator.add(incByExecutor1)
executor2: accumulator.add(incByExecutor2)

driver:  println(accumulator.value)

Accumulators не являются потокобезопасными. Их действительно не нужно, поскольку метод DAGScheduler.updateAccumulators, который драйвер использует для обновления значений аккумуляторов после завершения задачи (успешно или с ошибкой), выполняется только в одном потоке, который запускает цикл планирования. Кроме того, они представляют собой структуры данных только для записи для работников, у которых есть свой собственный локальный справочник аккумулятора, тогда как доступ к значению аккумулятора разрешен только драйвером.
Аккумуляторы сериализуются, поэтому их можно безопасно ссылаться на код, выполняемый исполнителями, а затем безопасно отправлять по кабелю для выполнения.

val counter = sc.longAccumulator("counter")
sc.parallelize(1 to 9).foreach(x => counter.add(x))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню