MapTask的工作原理
1 map文件切割
splitsize的大小。分片是按照splitsize的大小进行的,默认情况下,splitsize的大小等同于hdfs的block大小。但可以通过参数调节。
splitsize=Math.max(minSize,Math.min(maxSize,blockSize))
其中:mapreduce配置文件配置。
minSize =mapreduce.input.fileinputformat.split.minsize //默认配置0
maxSize = mapreduce.input.fileinputformat.split.maxsize //默认配置是256m
默认情况下:minSize<block<maxsize,所以切割的大小默认和block相同。如果改变minSize和maxsize的大小可以条件切割的大小。
2 MapTask任务启动的数量
启动多少个Maptask任务,是由切片的个数决定。
如果map阶段的输入文件切割为3个切片,就会启动3个并行的MapTask任务,分别来处理每以个切片的切割工作。
3 MapTask对输入文件切割的基本思路
(1)默认一次读取一行内容
(2)对行的内容进行字符串切割。
(3)mapTask切割后的结果为单个内容和数字,以K,V方式输出。
总之,mapTask切割文件内容的操作,是由开发人员根据业务需求编写的map程序决定的。
4 mapTask任务输出的结果的处理【重要】
(1)mapTask结果使用OutputCollector收集。输出的结果收集器。
(2)结果收集器将数据存放到一个环形缓冲区。环形缓冲区默认大小100m。当环形缓冲区的数据达到一定的比例阈值(默认是80%),就会写出。
环形缓冲区数据写出来的过程,叫溢出。
(3)数据写入磁盘之前,先进行分区,然后排序。
(4)数据写入磁盘临时文件。文件的数量和分区数相同,并且内容是排好序的。
5 mapTask溢出分区处理
mapTask的结果如果都写入同一个文件,reduceTask的数量是多个,reduceTask就会出现抢夺maptask输出资源,或者多个reduceTask不清楚如何分配处理maptask输出的资源文件。
maptask的默认分区的方式是根据reduceTask的数量分区。输出结果hash与分区数量求余,得到结果所在的分区。
假设有3个reduceTask,溢出的分区就会有3个分区。