十四 MapReduce工作流程

孤街醉人 提交于 2020-02-28 05:35:50

1 流程示意图

在这里插入图片描述
在这里插入图片描述

2 解析

  1. 假如我们有一个文件ss.txt大小为200M的待处理文件,放在input目录下

  2. 客户端在submit job之前,获取待处理数据的信息, 然后根据参数配置, 形成一个任务分配的规划.把待处理的文件进行切片,200M大小的文件切成两个分区.

ss.txt  0 - 128M  第一个分区
ss.txt  128 - 200M  第二个分区
  1. 客户端把切片信息还有需要的jar包和配置文件提交提交到Yarn 路径(如果是本地的话提交到本地路径)

  2. 如果是提交到yarn,yarn中的Mr appmaster 会获取信息,根据切片信息计算出MapTask的数量(一般是多少个切片多少个Task),创建MapTask分别处理一个切片.

  3. MapTask 中的InputFormat 中的RecorderReader会读取文件(按照配置的InputFormat的规则读,默认是TextInputFormat,按行读),获取k-v键值对.

  4. 读完的数据,会进入用户定义的Mapper中进行逻辑运算.

  5. Mapper 中处理完数据之后会把处理后的数据提交给outputCollector,然后outputCollector会把数据存储在环形缓冲区中.
    环形缓冲区中左边存储元数据(数据信息),右边会存储数据(真正的k-v值),在写满环形缓冲区总容量(默认是100M)的80%时,会发生溢写(把环形缓冲区的数据写到磁盘中),然后环形缓冲区会反向存储数据(因为前面的数据已经存到磁盘中了,所以前面的数据已经没用,可以覆盖).

  6. 环形缓冲区会根据分区信息,对数据进行分区处理,各分区的数据进行排序(这个步骤是在环形缓冲区中进行的,没溢写之前,排序的算法是快排).

  7. 然后就溢写到文件
    (每满80% 会溢写到一个文件,所以一个分区有好多的文件,而且每个文件内部已经进行过排序的)
    在溢写到文件之前可以选择性采用Combiner 对 先进行合并
    (原来没有Combiner,数据在各个文件之间会有相同key值,而Combiner是把所有相同的key值得value相加到一起)(Combiner有使用限制的)

  8. merge 同一个分区的所有文件到一个文件
    (这个步骤是用归并排序对已经排好序的同一个分区的文件进行合并,并且合并后文件的数据也是排好序的).**到这里Mapper阶段的工作完成.**然后Mapper Task等待 Reducer Task来拉取数据.

  9. 请看 9).

  10. 所有MapTask任务完成后,启动相应数量的ReduceTask(多少分区启动多少ReduceTask),并告知ReduceTask处理数据范围(数据分区)

  11. ReduceTask会去拉取数据.(一个ReduceTask只处理一个分区的数据,所以一个ReduceTask只拉取一个分区的数据).把各个Mapper Task生成的文件通过归并排序合成一个有序的文件,而且把相同key值的value值相加.

  12. 然后会进入用户定义的Reducer一组一组的对数据进行逻辑处理.

  13. 对数据进行分组处理(这步是可选的)

  14. 通过OutputFormat输出数据(默认是TextOutputFormat
    ),整个过程完成.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!