split和block的问题

这段代码理解:

  1.  List<InputSplit> splits = new ArrayList<InputSplit>();  
  2.     for (FileStatus file: listStatus(job)) {  
  3.       Path path = file.getPath();  
  4.       FileSystem fs = path.getFileSystem(job.getConfiguration());  
  5.       long length = file.getLen();  
  6.       BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length);  
  7.       if ((length != 0) && isSplitable(job, path)) {   
  8.         long blockSize = file.getBlockSize();  
  9.         long splitSize = computeSplitSize(blockSize, minSize, maxSize);  
  10.   
  11.         long bytesRemaining = length;  
  12.         while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {  
  13.           int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);  
  14.           splits.add(new FileSplit(path, length-bytesRemaining, splitSize,   
  15.                                    blkLocations[blkIndex].getHosts()));  
  16.           bytesRemaining -= splitSize;  
  17.         }  
  18.           
  19.         if (bytesRemaining != 0) {  
  20.           splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining,   
  21.                      blkLocations[blkLocations.length-1].getHosts()));  
  22.         }  
  23.       } else if (length != 0) {  
  24.         splits.add(new FileSplit(path, 0, length, blkLocations[0].getHosts()));  
  25.       } else {   
  26.         //Create empty hosts array for zero length files  
  27.         splits.add(new FileSplit(path, 0, length, new String[0]));  
  28.       }  
  29.     }  
  30.     LOG.debug("Total # of splits: " + splits.size());  
  31.     return splits;  
  32.   }

需要split跨block的话,调整下splitSize就行了,比如可以将splitSize设为blockSize的1.5倍就行了。

这里代码的理解:  

 就是在剩余的字节数大于SPLIT_SLOP时不断生成新split, 剩余字节不超过1.1个split时作为一个split处理,这样能够利用split的跨块读取,且节省资源。

由于我其他的处理逻辑需要分的很清, 不能1.1(SPLIT_SLOP默认1.1),  即使剩余不到10%,也要作为一个新块处理, 因此改为1.0我的问题就解决了!


split的作用主要有两个:1是作为逻辑单元,便于分布式处理,不像block只能在单个节点上,而是对于不完整的记录能够跨块读取,方便很多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值