从 S3 存储桶加载文件时,Spark 会创建多少个分区?

How many partitions does Spark create when a file is loaded from S3 bucket?

如果默认情况下文件是从 HDFS 加载的,spark 会为每个块创建一个分区。但是从S3 bucket加载文件时,spark是如何决定分区的呢?

参见org.apache.hadoop.mapred.FileInputFormat.getSplits()的代码。

块大小取决于 S3 文件系统实现(参见 FileStatus.getBlockSize())。例如。 S3AFileStatus 只需将其设置为 0(然后 FileInputFormat.computeSplitSize() 开始发挥作用)。

此外,如果您的 InputFormat 不可拆分,则不会拆分 :)

默认情况下,spark 在从 s3 读取数据时会创建大小为 64MB 的分区。 所以一个 100 MB 的文件将被分成 2 个分区,64MB 和 36MB。大小小于或等于 64 MB 的对象根本不会被拆分。

即使从 S3 存储桶读取文件,Spark(默认情况下)也会为每个块创建一个分区,即分区总数 = 总文件大小 / 块大小。

S3 的块大小值在 Hadoop 的核心文件中以 属性 的形式提供 -site.xml Spark 使用的文件:

<property>
  <name>fs.s3a.block.size</name>
  <value>32M</value>
  <description>Block size to use when reading files using s3a: file system.
  </description>
</property>

与 HDFS 不同,AWS S3 不是文件系统。它是一个对象存储。 S3A 连接器使 S3 看起来像一个文件系统。

请查看 documentation 了解更多详情。