本章节将分为InputFormat,split,OutputFormat三个小章节来介绍框架原理
1.InputFormat
1.1 切片:
将输入数据分成几份,每份交给一个MapTask去处理(getSplit方法)
对于MapRedcue,切片发生在客户端,任务提交的时候
机制:MapTask并行度决定机制
切了多少片,就开启多少个MapTask
1.2 打碎:
对于每一个MapTask要处理的那部分数据,InputFormat会将这部分数据打碎成行,从而交给Mapper去处理
源码细节:
1.3 关于切片的源码剖析:(了解)
(1)提交任务之前的准备工作:
driver在向yarn提交任务之前,需要把jar包,切片,配置文件都拷贝到hdfs的临时目录
(2) 查看切片细节:也就是上文提到的writeSplits()那一步
以上源码包含三个信息:
-
首先每个文件单独切片
-
切片大小默认等于块大小,也就是128M
这样的话,数据需要通过网络传输到不同容器,占据太多带宽,导致别的任务的shuffle变慢
-
切片时按照切片大小的1.1倍判断,避免最后一块切片只有一丁点,浪费开销,所以如果最后剩余的小于12.8M,就会归到前一块处理
-
切片大小的计算方式
1.4 InputFormat多种实现类
FileInputFormat常见的接口实现类包括:
(1) TextInputFormat:
按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量,LongWritable类型。 值是这行的内容,不包括任何行终止符(换行符和回车符) ,Text类型。
ps.偏移量包括字母以及空格
(2)CombineTextInputFormat
核心:当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)
例子:
(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
用途:CombineTextInputFormat用于小文件过多的场景。
如果小文件太多的话,还是用TextInputFormat进行切片,由于一个文件对应一个MapTask,因此会产生大量MapTask,会降低效率
代码:
放到dirver类中
// 如果不设置InputFormat,它默认用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);
//虚拟存储切片最大值设置20m
CombineTextInputFormat.setMaxInputSplitSize(job, 20971520);
2.Shuffle阶段
位置:位于mapper的后半截与reducer的前半截
作用:排序和分区(把从map出来的一个切片数据输出成一个有序的K,V集合)
1.关于排序的解释:对于大文件经历的三次排序
关于(环形)缓冲区Buffer:一个高速存储介质,就好比内存可以做硬盘的缓存,就是在缓存区中存够的数据,然后一次性写入硬盘。在缓冲区内将k,v做一个快速排序,然后写到磁盘上。然后多次快排的结果进行一次归并排序,最终形成有序文件
每个mapTask最终都会形成一个有序的文件,最后都汇总给reduceTask,reduce拿文件前会将所有的文件再次归并操作,使得reduce处理之前形成一个完整有序的文件,最终reduce按照排列好的key进行处理
2.关于分区的解释:
需要对map内部进行分区,分区的个数等于reduce的个数(如果一个reduce归并忙不过来,就开启多个reduce,此时需要把相同区内的key发到同一个reduce)
需要在缓冲器中就完成分区,在分区中完成快排,然后溢写到磁盘后,把相同分区的归并到一个分区。
3.总结
shuffle有两个作用:
-
排序(为了分组):用到了快排与归并(一共三次)
-
对于其中一个MapTask
-
数据经过Mapper处理,写到缓冲区
-
缓冲中的数据如果满了,快排后写到磁盘
-
多次写到磁盘的文件(全部内部有序),进行归并操作,得到完整的输出文件(MapTask输出)
-
-
对于ReduceTask
-
将所有MapTask数据全部下载到本地,再次进行归并排序,得到完整的有序文件,给Reducer输入
-
-
-
分区(为了将数据分给多个ReduceTask)
-
分区的个数取决于ReduceTask个数
-
MapTask从缓冲区开始就分区,排序是在分区内部排序,归并也对同一个分区进行归并
-
MapTask最终得到的是一个分区且区内按照key有序的输出文件
-
有几个ReduceTask,就会将数据分成几个区,ReduceTask各自处理对应分区的数据
-
详细工作流程: