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

时间:2018-11-11 09:24:23

标签: apache-spark amazon-s3

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

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

1 个答案:

答案 0 :(得分:3)

S3上的数据显然在HDFS外部。

您可以通过提供一个或多个路径或使用Hive Metastore来从S3中读取-如果已通过创建用于外部S3表的DDL,使用MSCK用于分区或使用ALTER TABLE table_name RECOVER PARTITIONS用于Hive在EMR上进行了更新,

如果您使用:

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时,驱动程序才获取元数据。

以您的说法:

  • “ ......每个执行者都直接在工作节点上下载数据吗?”是
  • 元数据是通过驱动程序协调和其他系统组件以某种方式获得的,用于S3上的文件/目录位置,但并不是首先将数据下载到驱动程序-这在设计上是一件很愚蠢的事情。但这也取决于语句的格式,这些API的响应方式。