参考文章:
https://www.jianshu.com/p/461f86936972
mapreduce运行的5个阶段
mapreduce在运行的过程中大致概括为5个步骤
1. [input阶段]获取输入数据进行分片作为map的输入
2. [map阶段]过程对某种输入格式的一条记录解析成一条或多条记录
3. [shffle阶段]对中间数据的控制,作为reduce的输入
4. [reduce阶段]对相同key的数据进行合并
5. [output阶段]按照格式输出到指定目录
运行过程图
input阶段
input阶段主要是从节点上反序列化数据,读取后切片,供map阶段使用
序列化格式和inputformat格式可以自定义设置
只有支持分片的压缩格式可以分片
记录格式:如serse 用正则表达式来转换文本hive
具体的步骤顺序如下:
1. 访问datanode中的数据反序列化数据并进行切片,为每一个切片分配一个map任务
2. 并发的执行这些任务
3. 通过recordReader读取切片中的每一条记录,按照记录格式读取,偏移值作为map的key,记录行作为value,当做map方法的参数
map阶段
通过对输入记录的处理,转换成一个或多个中间记录
shuffle阶段
需要注意:
1. shuffle阶段会对中间值进行优化,并且将分区的数据分发给各个reduce处理
map任务的输出默认是放在本地磁盘的临时缓冲目录中的
分区,排序,combiner过程可自定义
由于受限于集群可用带宽,通常会对中间数据做压缩,combiner处理,减少网络带宽消耗
分区的作用就是决定根据map 输出的key值由哪个reduce处理
mapper实现类读取配置文件属性,可以在配置中指定压缩的格式
每一个分组的后台线程对输出结果的key进行排序,在排序的过程中,有combine函数则会进行调用
1.map数据会先输出到内存缓冲区中,到达默认的80%的阀值后,会像map任务本地写数据,每次写都会生成一个小文件。
2.在写到本地的过程中,会经历分区,排序,combiner(可选)的过程
3.当最后一个文件溢写到本地磁盘中的时候,区与区的文件就是合并,排序,压缩(可选)
4.经过分区的排序的大文件会按照不同的分区被拷贝到相应的reduce中处理
5.reduce端通过http network复制map端传来的数据
6.将输入的数据排序后合并,经过2次排序后会返回一个value的迭代器
7.分组将相同key的value放到一起作为一个value集合,作为reduce的输入
reduce 阶段
处理<key,list<value>>对,对每个key产生一个结果
output阶段
对输出数据通常会做压缩,节省磁盘空间
将reduce结果按照输出的格式写入文件中
按照输出文件的格式,将每个键值对结果输出一行,中间分隔符默认是‘\t’.默认调用键值对对象的toString()方法