Почему это не скомпилируется без конструктора по умолчанию?

Чтобы ответить на вопрос «Когда аккумуляторы действительно надежны?»

Ответ: Когда они присутствуют в действии.

В соответствии с документацией в Action Task, даже если все перезапущенные задачи присутствуют, он будет обновлять Accumulator только один раз.

Для обновлений аккумулятора, выполненных только внутри действий, Spark гарантирует, что обновление каждой задачи к аккумулятору будет применяться только один раз, то есть перезапущенные задачи не будут обновите значение. В преобразованиях пользователи должны знать, что обновление каждой задачи может быть применено более одного раза, если задачи или этапы работы будут повторно выполнены.

blockquote>

И действие разрешает запуск пользовательского кода .

Для примера.

val accNotEmpty = sc.accumulator(0)
ip.foreach(x=>{
  if(x!=""){
    accNotEmpty += 1
  }
})

Но почему Map + Action, а именно. Операции задания результата не являются надежными для операции Аккумулятора?

  1. Задача завершилась неудачно из-за некоторого исключения в коде. Spark попробует 4 раза (количество попыток по умолчанию). Если задача терпит неудачу каждый раз, когда она даст исключение. Если случайно это удастся, то Spark продолжит работу и просто обновит значение аккумулятора для успешного состояния, а состояния накопившихся состояний игнорируются. Вердикт : Правильно обработано
  2. Неисправность этапа: если узел исполнителя вылетает из строя, нет ошибки пользователя, но аппаратный сбой - И если узел опускается в режиме тасования. Поскольку выход в случайном порядке хранится локально, если узел опускается , что выход в случайном порядке отсутствует. Так что Spark возвращается на сцену, которая генерирует вывод в случайном порядке, ищет, какие задачи нужно перезапустить, и выполняет их на одном из узлов, которые все еще живы. После того как мы восстановим отсутствующий вывод в случайном порядке, этап, который сгенерировал вывод карты, выполнял некоторые из его задач несколько раз.Spark подсчитывает обновления аккумулятора от всех них. Вердикт: не обрабатывается в Задаче результата. Аккумулятор выдаст неправильный вывод.
  3. Если задание выполнено медленная работа, Spark может запустить specul аверсивная копия этой задачи на другом узле. Вердикт: не обрабатывается.Accumulator выдаст неверный результат.
  4. RDD, который кэшируется, огромен и не может находиться в памяти. Поэтому всякий раз, когда используется RDD, запустите операцию «Карта», чтобы получить RDD, и снова аккумулятор будет обновлен им. Вердикт: не обрабатывается. Счетчик выдаст неправильный вывод.

Так может случиться, что одна и та же функция может работать несколько раз на такие же данные. Так что Spark не предоставляет никаких гарантий для обновления аккумулятора из-за действия карты.

Так что лучше использовать Accumulator in Action в Spark.

Чтобы узнать больше об Аккумуляторе и его проблемах относятся к этой статье в блоге - Имраном Рашидом.

71
задан cpplearner 26 April 2019 в 21:11
поделиться