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