tgoop.com/data_engineerette/353
Create:
Last Update:
Last Update:
Committers in Spark
В спарке есть такая штука, как коммиттеры. Они нужны, чтобы пользователи видели только успешные финальные результаты. Их несколько:
v1
"spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version" = 1
Сначала все файлы пишутся во временные папки в attempt/, потом перекладываются (по сути rename) в task/ и в самом конце в корень вашей папки. Тут упор на надежность: если что-то упало, то оно перезапустится и не попадет в конечную папку, пока не отработает
v2
"spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version" = 2
Здесь файлы пишутся в attempt/, а потом сразу перемещаются в корень вашей папки. Тут упор на производительность: нет дополнительного шага, но если что-то пойдет не так, то останутся куски файлов
Для работы с s3 есть magic и staging. Предыдущие не подходят, т.к. переименование реализовано как копирование и удаление. И если файлов много, то это очень долгая операция
magic
"spark.hadoop.fs.s3a.committer.name" = "magic"
"spark.hadoop.fs.s3a.committer.magic.enabled" = "true"
Файлы пишутся сразу в корень, но облако должно быть консистентным. Появился в конце 2021
staging
С ним я не игралась, но суть в том, что сами файлы пишутся в стейджинг на hdfs (отсюда и название), а потом грузятся в s3
_SUCCESS
Возможно, вы когда-нибудь заглядывали в файл _SUCCESS. Если писать алгоритмами v1/v2, то он будет пустым. А вот пример с magic:
{
"name" : "org.apache.hadoor.fs.3a.commit. files.SuccessData/1",
"timestamp" : 1744183768995,
"date" : "Wed Apr 09 10:29:28 MSK 2025",
"committer" : "magic",
"description" : "Task committer attempt_202504091019345870801396712503545_6660_m_1000000_0",
"metrics" : {
"stream_write_block_uploads" : 0,
"files_created" : 1,
"stream_closed" : 200,
...