Spark - чтение разделенных данных из S3 - как происходит разделение? - PullRequest
0 голосов
/ 11 ноября 2018

Когда я использую Spark для чтения нескольких файлов из S3 (например, каталог со многими файлами Parquet) -
Происходит ли логическое разбиение в начале, тогда каждый исполнитель загружает данные напрямую (на рабочем узле)?
Или драйвер загружает данные (частично или полностью) и только затем разбивает их на части и отправляет данные исполнителям?

Кроме того, будут ли разделы по умолчанию теми же разделами, которые использовались для записи (то есть каждый файл = 1 раздел)?

1 Ответ

0 голосов
/ 12 ноября 2018

Данные на S3, очевидно, являются внешними по отношению к HDFS.

Вы можете читать из S3, указав путь или пути, или используя Hive Metastore - если вы обновили его, создав DDL для таблицы External S3 и используя MSCK для разделов, или ALTER TABLE table_name RECOVER PARTITIONS для Hive в EMR .

Если вы используете:

val df = spark.read.parquet("/path/to/parquet/file.../...")

тогда нет гарантии на разделение, и это зависит от различных настроек - см. Поддерживает ли Spark разделение паркета при чтении? , отмечая, что API развиваются и улучшаются.

Но это:

val df = spark.read.parquet("/path/to/parquet/file.../.../partitioncolumn=*")

будет возвращать разделы поверх исполнителей некоторым образом в соответствии с сохраненной структурой разделов, немного похоже на SPARK bucketBy.

Драйвер получает метаданные только при непосредственном указании S3.

В ваших терминах:

  • "... каждый исполнитель загружает данные напрямую (на рабочий узел)?" ДА
  • Метаданные получаются каким-то образом с помощью координации драйверов и других системных компонентов для расположения файлов / каталогов на S3, но не так, что данные сначала загружаются в драйвер - это было бы большой глупостью в дизайне. Но это зависит также от формата заявления о том, как реагируют API.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...