split和block的问题

这段代码理解:

  1. List<InputSplit>splits=newArrayList<InputSplit>();
  2. for(FileStatusfile:listStatus(job)){
  3. Pathpath=file.getPath();
  4. FileSystemfs=path.getFileSystem(job.getConfiguration());
  5. longlength=file.getLen();
  6. BlockLocation[]blkLocations=fs.getFileBlockLocations(file,0,length);
  7. if((length!=0)&&isSplitable(job,path)){
  8. longblockSize=file.getBlockSize();
  9. longsplitSize=computeSplitSize(blockSize,minSize,maxSize);
  10. longbytesRemaining=length;
  11. while(((double)bytesRemaining)/splitSize>SPLIT_SLOP){
  12. intblkIndex=getBlockIndex(blkLocations,length-bytesRemaining);
  13. splits.add(newFileSplit(path,length-bytesRemaining,splitSize,
  14. blkLocations[blkIndex].getHosts()));
  15. bytesRemaining-=splitSize;
  16. }
  17. if(bytesRemaining!=0){
  18. splits.add(newFileSplit(path,length-bytesRemaining,bytesRemaining,
  19. blkLocations[blkLocations.length-1].getHosts()));
  20. }
  21. }elseif(length!=0){
  22. splits.add(newFileSplit(path,0,length,blkLocations[0].getHosts()));
  23. }else{
  24. //Createemptyhostsarrayforzerolengthfiles
  25. splits.add(newFileSplit(path,0,length,newString[0]));
  26. }
  27. }
  28. LOG.debug("Total#ofsplits:"+splits.size());
  29. returnsplits;
  30. }

需要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只能在单个节点上,而是对于不完整的记录能够跨块读取,方便很多。


你可能感兴趣的:(split)