- 计算切片数量和大小(注意视频中的是hadoop 2.7.3,每个版本的方法都有变动,以实际为准)
List<InputSplit> splits = input.getSplits(job);
- 切片数量选择过程
最小值(肯定>=1):long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job)); | 返回的是1 |
最大值(肯定<= Long.Max ,另外也要根据参数mapreduce.input.fileinputformat.split.maxsize=): long maxSize = getMaxSplitSize(job); | 根据参数 |
getMinSplitSize(job):这个值的参数是mapreduce.input.fileinputformat.split.minsize,然后在下面的配置文件中找到,是0。
C:\Users\yawei.chen\Desktop\Puck\Hadoop\安装包\hadoop-2.7.6\share\doc\hadoop-project\hadoop-mapreduce-client\hadoop-mapreduce-client-core\mapred-default.xml
- 能否切片条件判断
*压缩文件不能切片。 下面的函数用于判断文件是否为压缩,如果不是则返回true,可以切。
- 根据block大小,去判断切片大小
计算法则
块大小 | long blockSize = file.getBlockSize(); |
|
切片大小 | long splitSize = this.computeSplitSize(goalSize, minSize, blockSize); | 相当于在minSplit maxSplit blockSize中间取一个中间值 |
computeSplitSize方法
通常情况下,minSplit =1,maxSplit =long.max, blockSize =128M,这时候切片大小是128M。因为HDFS默认的块大小是128M,每个切片都是128M时,正好在一个节点上,此时根据本地优先特例,不需要到其它节点进行网络传输,效率比较高。
假设有的人将maxSplit 设置为1M时,此时切片大小是1M。如果一个128M的文件,需要128个切片去运行。此时Map阶段,如果这些数据同时运算,需要128个节点同时分发128片数据;
如果没有这么多节点,那么单个节点上,会有多个map运行,此时需要依赖其它节点,并行运算。这个时候,就会网络覆盖非常大,对网络带宽的要求非常高,效率不高。