- val lines: RDD[String] = sparkContext.textFile(args(0)) 我们通过 sparkContext.textFile来读取hdfs中某一数据
- 正常来说,应该是有几个文件就创建几个分区
- 然而我们dubug的时候发现,有时候3个文件却创建了4个分区
- 其实这是由于spark中对于hdfs分片数据拉取的源码
- 首先 我们在用testFile时,若不指定分区数量,则默认使用最小值=2
-
long goalSize = totalSize / (long)(numSplits == 0 ? 1 : numSplits);
- spark中用了goalSize这个属性,来定义一个理想的大小,totalSize为传入数据总大小,numSplits为分区数.
8. long splitSize = this.computeSplitSize(goalSize, minSize, blockSize); .
9. protected long computeSplitSize(long goalSize, long minSize, long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}
调用computeSplitSize算出splitSize
for(bytesRemaining = length; (double)bytesRemaining / (double)splitSize > 1.1D; bytesRemaining -= splitSize) {
splitHosts = this.getSplitHostsAndCachedHosts(blkLocations, length - bytesRemaining, splitSize, clusterMap);
splits.add(this.makeSplit(path, length - bytesRemaining, splitSize, splitHosts[0], splitHosts[1]));
}
再通过计算当前文件的大小是否大于splitSize1.1倍,来确实是否需要把当前文件拆分
所以在这里就有可能会把文件拆分到多个分区中