maptask数量决定机制--数据处理任务的分配机制
分配机制定义在FileInputFileFormat类中
分配的宗旨就是将block块数据进行"切分",每一片就交给一个maptask来处理
第一种方式:
指定切片大小形式这种方式如果切片处理的数据正好也在同一台机器上按照切片大小来读取数据的话如果是从0读到100而这台机器的上的block为128M的话,那剩下的28M则会在另一个Map任务上读取而另一台Map任务需要读取第一台Map任务的处理完后剩余的切片(28M)而这28M是要走网络的所以速度上会慢些.
第二种方式:
定义Block块大小和切片大小一样大小,这种实现是FileInputFormat的默认实现(排除小文件个人认为这种方式是最好的)
第三种方式:
如果都是小文件的话第二种方式是不可用的,因为不足Block大小的文件会按照文件大小来生成一个Block块大小,这时候如果分片大小和block大小一样那么就会开启很多个Map而map的开启就会调用java jvm 这时就会很耗费资源,比如map任务开启一个jvm 处理一个3M或几K的文件是很耗费资源的.在出现大量小文件下可以使用combineInputFormat而FileInputFormat机制就不适合使用了,当然最好的办法是在运算处理之前将小文件进行合并
切片机制定义:
FileInputFormat中默认的切片机制:
a/切片大小,默认等于block大小
b/切片时是针对每一个文件进行切片
比如: file1.txt 300M
file2.txt 10M
会切成几片:
file1.txt.split1-- 0~128
file1.txt.split2-- 128~256
file1.txt.split3-- 256~300
file2.txt.split1-- 0~10M
c/切片的大小也可以自定义:
在FileInputFormat中,切片主要由这几个值来运算决定
minsize
1 默认值
mapreduce.input.fileinputformat.split.minsize
maxsize
Long.MAXValue 默认值
mapreduce.input.fileinputformat.split.maxsize
计算切片的算法:
Math.max(minSize,Math.min(maxSize, blockSize));
参数如果调得比blocksize小则会让切片变小,而且就等于配置的这个参数的值
mapreduce.input.fileinputformat.split.maxsize
参数调的比blockSize大,则可以让切片变得比blocksize还大
mapreduce.input.fileinputformat.split.minsize