Чтобы ответить на вопрос «Когда аккумуляторы действительно надежны?»
Ответ: Когда они присутствуют в действии.
В соответствии с документацией в Action Task, даже если все перезапущенные задачи присутствуют, он будет обновлять Accumulator только один раз.
Для обновлений аккумулятора, выполненных только внутри действий, Spark гарантирует, что обновление каждой задачи к аккумулятору будет применяться только один раз, то есть перезапущенные задачи не будут обновите значение. В преобразованиях пользователи должны знать, что обновление каждой задачи может быть применено более одного раза, если задачи или этапы работы будут повторно выполнены.
blockquote>И действие разрешает запуск пользовательского кода .
Для примера.
val accNotEmpty = sc.accumulator(0) ip.foreach(x=>{ if(x!=""){ accNotEmpty += 1 } })
Но почему Map + Action, а именно. Операции задания результата не являются надежными для операции Аккумулятора?
- Задача завершилась неудачно из-за некоторого исключения в коде. Spark попробует 4 раза (количество попыток по умолчанию). Если задача терпит неудачу каждый раз, когда она даст исключение. Если случайно это удастся, то Spark продолжит работу и просто обновит значение аккумулятора для успешного состояния, а состояния накопившихся состояний игнорируются. Вердикт : Правильно обработано
- Неисправность этапа: если узел исполнителя вылетает из строя, нет ошибки пользователя, но аппаратный сбой - И если узел опускается в режиме тасования. Поскольку выход в случайном порядке хранится локально, если узел опускается , что выход в случайном порядке отсутствует. Так что Spark возвращается на сцену, которая генерирует вывод в случайном порядке, ищет, какие задачи нужно перезапустить, и выполняет их на одном из узлов, которые все еще живы. После того как мы восстановим отсутствующий вывод в случайном порядке, этап, который сгенерировал вывод карты, выполнял некоторые из его задач несколько раз.Spark подсчитывает обновления аккумулятора от всех них. Вердикт: не обрабатывается в Задаче результата. Аккумулятор выдаст неправильный вывод.
- Если задание выполнено медленная работа, Spark может запустить specul аверсивная копия этой задачи на другом узле. Вердикт: не обрабатывается.Accumulator выдаст неверный результат.
- RDD, который кэшируется, огромен и не может находиться в памяти. Поэтому всякий раз, когда используется RDD, запустите операцию «Карта», чтобы получить RDD, и снова аккумулятор будет обновлен им. Вердикт: не обрабатывается. Счетчик выдаст неправильный вывод.
Так может случиться, что одна и та же функция может работать несколько раз на такие же данные. Так что Spark не предоставляет никаких гарантий для обновления аккумулятора из-за действия карты.
Так что лучше использовать Accumulator in Action в Spark.
Чтобы узнать больше об Аккумуляторе и его проблемах относятся к этой статье в блоге - Имраном Рашидом.