EMR-Spark медленно записывает DataFrame с массивом строк в S3 - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь записать фрейм данных в S3 из EMR-Spark, и я наблюдаю очень медленное время записи, когда запись доминирует над общим временем выполнения (~ 80%) сценария.Что бы это ни стоило, я попробовал оба формата: .csv и .parquet, это не имеет значения.

Мои данные могут быть отформатированы двумя способами, вот предпочтительный формат:

ID: StringType |ArrayOfIDs: ArrayType

(Количество уникальных идентификаторов в числах первого столбца в младших миллионах. ArrayOfIDs содержит строки в формате GUID и может содержать от 100 до 100 000 элементов)

Запись первой формы на S3 невероятно медленная.Для чего я пытался установить mapreduce.fileoutputcommitter.algorithm.version в 2, как описано здесь: https://issues.apache.org/jira/browse/SPARK-20107 без реального эффекта.

Однако мои данные также могут быть отформатированы в виде списка смежности, вот так:

ID1: StringType |ID2: StringType

Кажется, это намного быстрее для записи в S3, но я не знаю почему.Вот мои конкретные вопросы:

  • В конечном итоге я пытаюсь перенести свои данные в кластер Aurora RDS Postgres (те, кто до меня твердо говорил, что JDBC-разъем Spark слишком медленныйдля работы, поэтому я сейчас пытаюсь сбросить данные в S3 перед загрузкой в ​​Postgres с помощью команды COPY).Я не женат на том, чтобы использовать S3 в качестве промежуточного хранилища, если есть лучшие альтернативы для передачи этих фреймов данных в RDS Postgres.

  • Я не знаю, почему первая схема с массивомстрок намного медленнее при записи.Общее количество записанных данных на самом деле намного меньше, чем во второй схеме, поскольку исключает дублирование идентификаторов из первого столбца.Также было бы неплохо понять это поведение.

...