Данные на 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.