PySpark очень медленно загружает на S3, работающий на Databricks - PullRequest
0 голосов
/ 06 мая 2019

Мой скрипт ETL читает три таблицы из реляционной базы данных, выполняет некоторые операции через PySpark и загружает это в мое хранилище S3 (с S3a).

Вот код, который делает загрузку:

dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)

У меня около 2 миллионов строк, написанных на S3 в паркетных файлах, разбитых по дате ('dt').

Мой сценарий занимает более двух часов, чтобы выполнить эту загрузку на S3 (это очень медленно), и он выполняется на кластерах данных в кластере с:

 3-8 Workers: 366.0-976.0 GB Memory, 48-128 Cores, 12-32 DBU

Я пришел к выводу, что проблема при загрузке, я не могу понять, что происходит.

Обновление: Используя repartition('dt') время выполнения было сокращено до ~ 20 минут. Это помогает мне, но я думаю, что оно должно быть выполнено за меньшее время.

1 Ответ

0 голосов
/ 10 мая 2019

Поскольку я обновил этот вопрос, добавив repartition('dt'), время выполнения было сокращено до ~ 13-20 минут.

dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)

После некоторых анализов я пришел к выводу, что кластер обрабатывал сериализованную загрузку, и файлы загружались один за другим в порядке возрастания даты по S3.

Таким образом, добавив перераспределение, кластер реорганизует данные между его узлами и загружает файлы случайным образом, что ускоряет загрузку (от ~ 3 часов до 20 минут).

Это решение помогло мне. Если кто-нибудь знает лучший подход или внесет свой вклад, я буду рад узнать.

...