从本地文件系统读取目录时,textFile函数分区的行为

时间:2019-07-24 10:36:58

标签: apache-spark pyspark

在读取目录时,我无法理解sc.textfile("directory")是如何进行分区的。

我有一个包含10个文件的目录。 rdd1 = sc.textFile("/path/*")如果我在路径目录下有10个文件,则默认情况下会创建10个分区,但是当我将第二个参数设置为11时,我会得到分区号20,而当传递21时,我会得到30分区可以帮助我了解第二个参数的值

2 个答案:

答案 0 :(得分:0)

Spark将这项工作委托给Hadoop的InputFormat.getSplits(int numSplits),更确切地说,是TextInputFormat
其中numSplits参数只是一个提示。甚至spark都将此参数称为minPartitions

现在它取决于输入文件格式,例如 是否压缩?
如果是,请检查压缩编解码器是否可拆分。
然后使用以下逻辑:

long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
long minSize = Math.max(job.getLong(FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize)  
...
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);

之后,Spark会过滤所有零尺寸的分割

allInputSplits.filter(_.getLength > 0)

并按拆分创建分区

new HadoopPartition(id, i, inputSplits(i))

答案 1 :(得分:0)

Spark将这项工作委托给Hadoop的InputFormat.getSplits(int numSplits),更确切地说,是TextInputFormat。 其中numSplits参数只是一个提示。甚至spark都将此参数称为minPartitions

现在它取决于输入文件格式,例如是否压缩? 如果是,请检查压缩编解码器是否可拆分。 然后使用以下逻辑:

long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
long minSize = Math.max(job.getLong(FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize)  
...
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);

之后,Spark会过滤所有零尺寸的分割

allInputSplits.filter(_.getLength > 0)

并按拆分创建分区

new HadoopPartition(id, i, inputSplits(i))

computeSplitSize中,返回最大值minSize或最小值(blockSizegoalSize

protected long computeSplitSize(long goalSize, long minSize,
                                       long blockSize) {
    return Math.max(minSize, Math.min(goalSize, blockSize));
}