Spark - 从 S3 读取分区数据 - 分区是如何发生的?

Posted

技术标签:

【中文标题】Spark - 从 S3 读取分区数据 - 分区是如何发生的?【英文标题】:Spark - Reading partitioned data from S3 - how does partitioning happen? 【发布时间】:2018-11-11 09:24:23 【问题描述】:

当我使用 Spark 从 S3 读取多个文件时(例如,一个包含许多 Parquet 文件的目录) - 是不是一开始就进行逻辑分区,然后每个executor直接下载数据(在worker节点上)? 或者驱动程序是否下载数据(部分或全部),然后才分区并将数据发送给执行程序?

此外,分区是否会默认为用于写入的相同分区(即每个文件 = 1 个分区)?

【问题讨论】:

【参考方案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,驱动程序只会获取元数据。

用你的话说:

"...每个executor直接下载数据(在worker节点上)?" YES 元数据是通过驱动程序协调和其他系统组件在 S3 上的文件/目录位置以某种方式获得的,但不是首先将数据下载到驱动程序 - 这在设计上是一个很大的愚蠢。但这也取决于 API 如何响应的语句格式。

【讨论】:

以上是关于Spark - 从 S3 读取分区数据 - 分区是如何发生的?的主要内容,如果未能解决你的问题,请参考以下文章

Spark分区的困境

spark sql 无法在 S3 中查询镶木地板分区

如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)

Spark中转换的失败处理

在 DataFrame 的每个分区内读取、转换和写入数据

spark 从 hbase 读取数据,worker 是不是需要从远程驱动程序中获取分区数据?