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 读取分区数据 - 分区是如何发生的?的主要内容,如果未能解决你的问题,请参考以下文章