Я хочу использовать накопитель для сбора статистики о данных, которые я манипулирую при работе Spark. В идеале я бы это сделал, пока работа вычисляет необходимые преобразования, но поскольку Spark будет перекомпилировать задачи в разных случаях, аккумуляторы не будут отражать истинные показатели. Вот как документация описывает это:
Для обновлений аккумуляторов, выполненных только внутри действий, Spark гарантирует, что каждое обновление задач на аккумуляторе будет только применяется один раз, то есть перезапущенные задачи не будут обновлять значение. В преобразования, пользователи должны знать, что каждое обновление задач может применяется несколько раз, если задачи или этапы работы перезапускаются.
Это запутанно, так как большинство действий не позволяют запускать собственный код (где могут использоваться аккумуляторы), они в основном принимают результаты предыдущих преобразований (лениво). В документации также показано следующее:
val acc = sc.accumulator(0)
data.map(x => acc += x; f(x))
// Here, acc is still 0 because no actions have cause the `map` to be computed.
Но если мы добавим data.count()
в конец, гарантированно ли это быть правильным (не иметь дубликатов) или нет? Ясно, что acc
не используется "только внутри действий", так как карта является преобразованием. Поэтому это не должно быть гарантировано.
С другой стороны, обсуждение связанных билетов Jira говорит о "задачах результата", а не о "действиях". Например здесь и здесь. Это, по-видимому, указывает на то, что результат действительно будет гарантированно правильным, поскольку мы используем acc
непосредственно перед и действием и поэтому должны вычисляться как один этап.
Я предполагаю, что эта концепция "задачи результата" имеет отношение к типу задействованных операций, являясь последней, которая включает в себя действие, как в этом примере, которое показывает, как несколько операций делятся на этапы ( в пурпуре, изображение взято из здесь):
Итак, гипотетически, действие count()
в конце этой цепочки будет частью одной и той же заключительной стадии, и мне будет гарантировано, что аккумуляторы, используемые на последней карте, не будут содержать никаких дубликатов?
Разъяснение вокруг этой проблемы было бы здорово! Спасибо.