Ускорить запись 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). Будьте осторожны, если ваш выходной результат достаточно велик, работа также будет очень медленной из-за радикального сетевого ввода-вывода в случайном порядке.

Другие вопросы по тегам