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倍,来确实是否需要把当前文件拆分

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值