Когда аккумуляторы действительно надежны?
Я хочу использовать аккумулятор для сбора статистики о данных, которыми я манипулирую в работе 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()
действие в конце этой цепочки будет частью той же последней стадии, и я гарантирую, что аккумуляторы, использованные на последней карте, не будут содержать дубликатов?
Разъяснение по этому вопросу было бы здорово! Благодарю.