如果默认情况下从HDFS加载文件,spark会为每个块创建一个分区。但是,当从S3存储桶加载文件时,spark如何决定分区?
答案 0 :(得分:1)
请参阅org.apache.hadoop.mapred.FileInputFormat.getSplits()
的代码。
块大小取决于S3文件系统的实现(参见FileStatus.getBlockSize()
)。例如。 S3AFileStatus
只需将其设置为0
(然后FileInputFormat.computeSplitSize()
即可发挥作用)。
另外,如果您的InputFormat不可分割,您就不会分裂:)
答案 1 :(得分:0)
默认情况下,从s3读取时,spark将创建大小为64MB的分区。 因此,一个100 MB的文件将分为2个分区,即64MB和36MB。大小小于或等于64 MB的对象根本不会被分割。
答案 2 :(得分:-1)
Spark会将S3视为基于块的文件系统,因此HDFS和S3输入的分区规则是相同的:默认情况下,每个块将获得一个分区。值得自己检查创建的分区数量:
val inputRDD = sc.textFile("s3a://...")
println(inputRDD.partitions.length)
为了进一步阅读,我建议this,其中详细介绍了分区规则。