Ускорить запись Spark, когда coalesce = 1?
У меня есть задание Spark, которое за день считывает данные из местоположения A и записывает их в местоположение B. Смысл задания - объединить множество маленьких файлов в один файл для каждого раздела стиля улья в s3. Мой код очень прост, но он работает очень медленно.
Код
df = spark.read.parquet('s3://location/A/')
(df
.coalesce(1)
.write
.mode('overwrite')
.partitionBy('date', 'user_id')
.parquet('s3://location/B/'))
Искра Отправить
spark-submit \
--master spark://foobar \
--deploy-mode cluster \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true \
--conf spark.dynamicAllocation.minExecutors=1 \
--conf spark.dynamicAllocation.maxExecutors=18 \
--conf spark.dynamicAllocation.initialExecutors=4 \
--conf spark.executor.memory=4G \
--conf spark.executor.cores=4 \
--conf spark.driver.memory=2G \
--conf spark.shuffle.io.preferDirectBufs=false \
--conf spark.executor.heartbeatInterval=10000000 \
--conf spark.network.timeout=10000000
Какую конфигурацию я могу сделать, чтобы она работала быстрее, или coalesce(1) всегда будет работать очень медленно?
1 ответ
Ссылка, размещенная @Explorer, может быть полезной. Попробуйте перераспределить (1) на ваших фреймах данных, потому что это эквивалентно объединению (1, shuffle=True). Будьте осторожны, если ваш выходной результат достаточно велик, работа также будет очень медленной из-за радикального сетевого ввода-вывода в случайном порядке.