Возможно ли в спарк для чтения больших файлов S3 CSV параллельно? - PullRequest
2 голосов
/ 07 июля 2019

Обычно искровые файлы сохраняются в нескольких частях, что позволяет каждому рабочему читать разные файлы.Есть ли подобное решение при работе с отдельными файлами?s3 предоставляет API выбора, который должен позволять такое поведение.

Искра, кажется, поддерживает этот API (https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-s3select.html),, но, похоже, это относится только к оптимизации запросов, а не к распараллеливанию чтения

Ответы [ 2 ]

0 голосов
/ 14 июля 2019

FYI CSV по своей сути являются однопоточными. В CSV-файле нет дополнительной информации, которая сообщает читателю, где начинается любая строка, не читая весь файл с самого начала.

Если вы хотите, чтобы несколько читателей в одном файле использовали формат, такой как Parquet, в котором есть группы строк с явно заданной начальной позицией, определенной в нижнем колонтитуле, которая может быть прочитана независимыми читателями. Когда спарк отправляется на чтение файла паркета, он разбивает группы строк на отдельные задачи. В конечном итоге наличие файлов соответствующего размера очень важно для повышения производительности.

0 голосов
/ 08 июля 2019

S3 Select не связан с вашим вариантом использования.

  1. Выбор S3: выберите SQL и выполните проектирование в хранилище S3, чтобы клиент получил предварительно отфильтрованные данные. Результат возвращается как CSV с удаленным заголовком или JSON. Вы не можете тогда иметь> 1 работника, нацеленного на это. (вы можете попробовать, но каждому работнику придется считывать и отбрасывать все данные в цикле до его смещения, и предсказать диапазоны, которые каждый работник может обработать, практически невозможно)

  2. У вас:> 1 рабочий обрабатывает различные части файла, который был разбит на разделы

Разделение больших файлов на более мелкие части для параллельной обработки - это именно то, что делает Spark (и mapreduce, hive и т. Д.) Для любого формата, где это имеет смысл.

CSV-файлы легко разбиваются на разделы при условии, что они сжаты с помощью разделяемого формата формата сжатия (нет, snappy, но не gzip)

Все, что нужно, это указать искре, что такое порог разделения. Для S3a установите значение fs.s3a.block.size на значение, на которое оно затем может быть разделено, тогда ваши запросы к CSV, Avro, ORC, Parquet и т. П. Будут разделены среди рабочих.

Если ваши работники не выполняют много вычислений в строке, существует минимальный размер блока, прежде чем это даже стоит делать. Эксперимент.

...