MR是HADOOP的核心计算框架。是一个可容错的并行处理集群。
1. 核心思想
MR的核心思想是分而治之(本来是基于整体数据的运算,结果将数据数据分割成很多个小的数据集。然后并行计算这些小数据集,最后将每个小数据集的计算结果进行汇总。得到最终的计算结果)。
整个过程分为Map阶段和Reduce阶段。第一阶段完全并行,互不相干。第二阶段的reduceTask的并发实例也互不相干。但是他数据上依赖上一个阶段(mapTask)并发实例的输出。
(1) MR的处理流程。根据InPutFormat 将原始数据转成Map<key,Value>,作为MapTask的数输入。通过Map函数将计算结果保存到磁盘。reduceTask拉到各自的本地作为RduceTask的输入。经过RduceTask的计算。通过OutPutFormat格式转换成确定的格式保存到磁盘。
2. 工作流程
MR工作流程大致可以分为4部分。分别是输入分片inputFormat、Map阶段、reduce阶段和OutPutFormat。
(1) inputFormat阶段 通过inputFormat,将数据切分成Map<key,value> 数据,作为Map节点的输入。默认为TxtInputFormat。
(2) Map阶段.接收<key,value>参数,进行map运算、结果缓存在环形缓冲区、超于阈值(80%),分组(分区),排序,combiner,合并溢写磁盘。
- 分区:按照Partition进行分区(默认按照HashPartition,对key进行的hashCode%Reduce 获取分区号,前往对应的分区存储数据)。
- Sort 排序。同一个分区的不同数据按照key字典排序。默认为升序。
- 如果设置有combiner,则在map端进行提前聚合。
- 溢写磁盘。
(3) Reduce阶段:获取map数据reduce根据自己的分区号去各个mapTask的节点获取自己对应的分区数据。数据拉到reduce本地,进行归并排序:在reduce节点上对获取的数据合并后重新排序作为reduce的输入。Reduce函数运算进行reduceTask逻辑运算。
(4) outPutFormat阶段:通过设定的outPutFormat 对reduce的数据写入磁盘。默认为TextOutPutFormat
3. shuffle机制
shuffle 是指MR过程中,map方法之后,reduce方法之前的过程。分为两部分,Map部分和reduce部分。
(1) shuffle的Map部分
Map处理之后,结果缓存在环形缓冲区中,数据量大于阈值,会准备溢写。会进行分区(按照key的hashcode进行分区)、排序(按照key进行升序)、Combiner【可以没有此环节】溢写文件,map操作完成后,过程中可能产生多个溢写文件。同一个分区多个溢写的文件,合并成一个文件。
(2) shuffle的reduce部分
copy阶段:Reduce 去各个maptesk节点,根据自己的分区号找到当前reduce对应的数据并传递回。归并排序:merge阶段合并多个maptask的数据,如果内存不够、溢写磁盘。数据给reduce任务。
4. 序列化
为了提高系统性能。高效的序列化机制比较重要。
(1) 什么是序列化?什么是反序列化?为什么需要序列化?
序列化是指把内存中的对象转成字节序列的过程。反序列化是指将字节序列转成内存对象的过程。序列化一般有两个场景。内存数据需要保存到磁盘和对象需要跨网络传递到其它机器。
(2) Hadoop有自己的序列化机制:writable
(3) 序列化和反序列化的属性顺序需要完全一致。
5. 数据压缩
压缩技术能提高底层数据传输的效率。
压缩的基本原则:运算密集型job,少用压缩。IO密集型job,多用压缩。
比较常用的几种压缩算法:
Gzip:压缩率比较高,压缩和解压缩时间也比较快。
Bzip2:压缩率最高,压缩和解压缩时间长。
Loz:
Snappy: