MapReduce工作流程

MapReduce 详细工作流程Map阶段

整个Map阶段流程大体为下图所示

Map阶段 简单概述:

首先 input File 通过split 切分为多个 split文件 通过 Record按行读取内容给map 进行处理 ,数据被map处理结束之后交给OutputCollector 收集器 之后对结果key 进行分区 (默认是hash分区)之后写入buffer 每个map task里面都有一个环形缓冲区 储存着 map的输出结果 当缓冲区快满了(80%),会将缓冲区里的文件以Spill(溢写)的方式 用临时文件的方式存入磁盘 当整个map task 结束之后再对磁盘中的 所有map task 产生的临时文件做合并 最终生成输出文件 然后等待 reduce task来拉数据

Map阶段 详细步骤:
  1. 首先,读取数据组件 InputFormat (默认 TextInputFormat)会通过 getSplits方法对输入目录中文件进行逻辑切片规划得到 splits,有多少个 split 就对应启动多少个 MapTask。split 与 block 的对应关系默认是一对一。
  2. 将 输 入 文 件 切 分 为 splits 之 后 , 由 RecordReader 对 象 ( 默 认LineRecordReader)进行读取,以\n 作为分隔符,读取一行数据,返回 key/value。Key 表示每行首字符偏移值,value 表示这一行文本内容。
  3. 读取 split 返回 key/value,进入用户自己继承的 Mapper 类中,执行用户重写的 map 函数。RecordReader 读取一行这里调用一次。
  4. map逻辑之后 会将map之后的每条结果都通过context.write进行collect数据收集。在collect中 会先对其进行分区处理 默认使用(HashPartitioner)。MapReduce提供的Partitioner接口 他的作业就是根据看key和value以及reduce的数量决定当前的这对输出数据应该交给那个reduce task 处理(reduce task 会按块来处理数据)默认对 key hash 后再以reduce task 数量取模。默认的取模方式只是为了平均 reduce 的处理能力,如果用户自己对 Partitioner 有需求,可以订制并设置到 job 上。
  5. 接下来 将数据写到内存 ,内存中的这一部分被称为环形缓冲区(说白了就是个数组 只不过这个数组头尾相连而已)环形结构是一个抽象概念。 缓冲区的作用其实就是收集map阶段的结果 减少对磁盘的IO影响 。 我们之前的 索引和数据都会放到环形缓冲区里面(逻辑上是左边存放索引(kvindex) 右边存放数据<k,v> ) 缓冲区是有大小限制,默认是 100MB。当缓冲区里的数据足够多了之后 就可能把内存撑爆 所以环形缓冲区里面会有一个阈值(默认为80%) 当环形缓冲区中的数据到了阈值之后 会触发溢写 就是将缓冲区里的数据一临时文件的形式写入到磁盘中 (而且由于溢写是单线程来完成的 ,不会影响数据写到内存 意思就是Map task 的输出结果还可以往剩下的 20MB 内存中写,互不影响。 )
  6. 当溢写线程启动后,需要对这 80MB 空间内的 key 做排序(Sort)。排序是MapReduce 模型默认的行为,这里的排序也是对序列化的字节做的排序。如果在job阶段设置了 Combiner(合并) 就会将具有相同的key 的key/value对的value加起来 减少溢写到磁盘的数据量(Combiner会优化map阶段之后传入Reduce的数据)那么那些时候可以使用Combiner呢 Combiner的输出是Reducer的输入 Combiner是不能修改最终的计算结果的 Combiner 只应该用于那种 Reduce 的输入 key/value与输出 key/value 类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对 job 执行效率有帮助,反之会影响 reduce 的最终结果。
  7. 每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),如果 map 的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。当整个数据处理结束之后开始对磁盘中的临时文件进行merge 合并,因为最终的文件只有一个,写入磁盘,并且为这个文件提供了一个索引文件,以记录每个 reduce 对应数据的偏移量。
  8. 自此 map 整个阶段结束
    在这里插入图片描述
Reduce阶段 简单概述:

Reduce阶段大概分为 copy 、sort 、reduce三个阶段 copy阶段会将传来的数据下载到reduce task本地磁盘
之后进入sort阶段 按块进行排序 最后调用用户自己定义的reduce函数进行数据处理

Reduce阶段 详细步骤:
  1. Copy 阶段,简单地拉取数据。Reduce 进程启动一些数据 copy 线程(Fetcher),通过 HTTP 方式请求 maptask 获取属于自己的文件。
  2. sort 阶段 把分散的数据合并成一个大的数据后,还会再对合并后的数据排序。
  3. 对排序后的键值对调用 reduce 方法,键相等的键值对调用一次 reduce 方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到 HDFS文件中。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值