Spark读取hdfs分片数据源码剖析

  1. val lines: RDD[String] = sparkContext.textFile(args(0)) 我们通过 sparkContext.textFile来读取hdfs中某一数据
  2. 正常来说,应该是有几个文件就创建几个分区
  3. 然而我们dubug的时候发现,有时候3个文件却创建了4个分区
  4. 其实这是由于spark中对于hdfs分片数据拉取的源码
  5. 首先 我们在用testFile时,若不指定分区数量,则默认使用最小值=2
  6.     long goalSize = totalSize / (long)(numSplits == 0 ? 1 : numSplits);
    
  7. 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倍,来确实是否需要把当前文件拆分

所以在这里就有可能会把文件拆分到多个分区中


版权声明:本文为qq_41130274原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。