【发布时间】:2018-11-11 09:24:23
【问题描述】:
当我使用 Spark 从 S3 读取多个文件时(例如,一个包含许多 Parquet 文件的目录) -
是不是一开始就进行逻辑分区,然后每个executor直接下载数据(在worker节点上)?
或者驱动程序是否下载数据(部分或全部),然后才分区并将数据发送给执行程序?
此外,分区是否会默认为用于写入的相同分区(即每个文件 = 1 个分区)?
【问题讨论】:
当我使用 Spark 从 S3 读取多个文件时(例如,一个包含许多 Parquet 文件的目录) -
是不是一开始就进行逻辑分区,然后每个executor直接下载数据(在worker节点上)?
或者驱动程序是否下载数据(部分或全部),然后才分区并将数据发送给执行程序?
此外,分区是否会默认为用于写入的相同分区(即每个文件 = 1 个分区)?
【问题讨论】:
S3 上的数据显然在 HDFS 外部。
您可以通过提供一个或多个路径或使用 Hive Metastore 从 S3 读取 - 如果您已通过为外部 S3 表创建 DDL 并为分区使用 MSCK 或在 EMR 上为 Hive 使用 ALTER TABLE table_name RECOVER PARTITIONS 更新此内容.
如果你使用:
val df = spark.read.parquet("/path/to/parquet/file.../...")
那么不能保证分区,它取决于各种设置 - 请参阅 Does Spark maintain parquet partitioning on read?,注意到 API 不断发展并变得更好。
但是,这个:
val df = spark.read.parquet("/path/to/parquet/file.../.../partitioncolumn=*")
将根据您保存的分区结构以某种方式通过执行程序返回分区,有点像 SPARK bucketBy。
如果直接指定 S3,驱动程序只会获取元数据。
用你的话说:
【讨论】: