从 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 了解更多详情。
如果默认情况下文件是从 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 了解更多详情。