简介
hadoop系列的学习总结针对的都是hadoop2.6.x版本来说的。
Mapreduce是一个分布式运算程序的编程框架,下面统一将MapReduce简称为mr。
为什么会出现mr?
(1) 海量数据在单机上处理因为硬件资源限制,无法胜任。
(2) 而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度。
(3) 引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。mr框架的结构角色
(1) MRAppMaster:负责整个程序的过程调度及状态协调。
(2) MapTask:负责map阶段的整个数据处理流程。
(3) ReduceTask:负责reduce阶段的整个数据处理流程。
MapReduce的运行模式
本地运行模式
(1) mr程序是被提交给LocalJobRunner在本地以单进程的形式运行。
(2) 而处理的数据及输出结果可以在本地文件系统,也可以在hdfs上。
(3) 本地模式适合调试,所以开发时一般利用本地模式测试后再在集群上跑。
(4) 如果在windows下想运行本地模式来测试程序逻辑,需要在windows中配置环境变量:
%HADOOP_HOME% = d:/hadoop-2.6.4
%PATH% = %HADOOP_HOME%\bin
并且要将d:/hadoop-2.6.4的lib和bin目录替换成windows平台编译的版本(注意32位和64位不通用)集群运行模式
(1) 将mr程序提交给yarn集群resourcemanager,分发到集群节点上并发执行
(2) 处理的数据和输出结果应该位于HDFS文件系统
(3) 将程序打成JAR包,然后在集群的任意一个节点上用hadoop命令启动
MapReduce的shuffle原理
maptask的任务分配(切片)机制
将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个mapTask并行实例处理。
遍历输入目录下的文件,得到切片规划描述文件(由splitsList(split([文件路径、切片编号、偏移量的范围]))序列化生成),由FileInputFormat实现类的getSplits()方法完成。
在FileInputFormat中,计算切片大小的逻辑:
Math.max(minSize, Math.min(maxSize, blockSize))
-minsize:默认值:1
-maxsize:默认值:Long.MAXValue
-因此,默认情况下,切片大小=blocksize
mr的shuffle原理
- mr中,map阶段处理的数据如何传递给reduce阶段,是mr框架中最关键的一个流程,这个流程就叫shuffle。
- 具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序。
shuffle流程解析
(1)map task通过InputFormat中的RecordReader中的read()方法来读文件,一次读取一行,这里注意,mr默认将输出文件按照128M一个切片来进行处理,有多少个切片就启动多少个map tast来处理。(2) map task中通过context.write()方法将数据写入到OutputCollector收集器中,然后再写入到一个环形缓冲区(底层实现是一个数组,默认100M)中,默认写到80%就开始做清理工作,前面写着,后面有个进行清理,将数据溢出到文件中。
(3) 文件中的数据分区且区内有序。然后启动相应分区数量的reduce,将每个reduce将所有map task产生文件对应的分区的数据下载到本地工作目录后合并(例如reduce1对应1号分区,它会将所有map task产生的文件中对应的1号分区的数据拿过来),通过归并排序,各个reduce中的数据是有序的。
(4) 根据GroupingComparator对kv聚合成组,默认实现是k相同则认为是一组,对每一组调用reduce()方法,将这一组的k传给reduce中的参数key,将这一组的v的迭代器传给reduce的参数values。然后通过context.write()方法将数据写入到文件。
(5) mr工作机制需要注意的是map的数量和reduce的数量是由什么决定的。还有就是mr中的分区,排序及自定义分组,关于这部分内容下一篇学习总结中会具体来说。
shuffle流程图解
因为图太大了,所以分开来画。
(1)
(2)
注:maptask的数量由文件大小决定,而reduce的数量可以自己设置。
下一篇将介绍mr的自定义分区,自定义排序及自定义分组的相关学习总结。