一、Map阶段流程

1.Read阶段

这个阶段主要是客户端读取待处理数据的阶段。

  1. 客户端获取待处理数据
  2. 客户端submit之前,根据数据信息,形成一个任务分配的规则(分片信息)
    1. FileInputFormat
    2. CombineFileInputFormat
  3. 提交切片信息给集群(resource manager)

    1. Job.split
    2. wc.jar
    3. Job.xml

      2.Map阶段

  4. RM根据切片信息启动一个appmaster,并分配map task给节点(node manager)

  5. 分配了map task的节点执行

    1. 以kv对的形式读取切片
      1. TextInputFormat
      2. KeyValueTextInputFormat
      3. NLineInputFormat
      4. 自定义InputFormat
    2. 对每一个kv对进行处理

      3.Collect阶段

  6. 将kv的处理结果写出到一个环形缓冲区

    1. 默认100M
    2. 左侧数据,右侧索引
    3. 写到80%后,将数据写入磁盘,并反向回写
    4. 不断重复
  7. 根据分区方式和分区数量进行分区
    1. HashPartition
    2. 自定义Partition
    3. 1分区
    4. 多分区
  8. 分区内部排序

    1. 根据key进行字典顺序排序
    2. 快排

      4.溢写阶段

      在环形缓冲区写到80%或MapTask结束后将环形缓冲区的数据持久化写入磁盘文件。文件存储分区数据且区内有序。

      5.Combine阶段

      MapTask进行预聚合以减小网络传输压力。方式为归并排序。

      二、Reduce阶段流程

      1.Copy阶段

  9. app master根据分区的数量启动相应数量的reduce task

  10. 每个ReduceTask的节点将对应分区的数据下载到本地

    2.Merge阶段-合并文件

    将从不同MapTask下载的文件合并为一个文件

    3.Sort阶段-归并排序

    排序实际上与合并同时进行,通过归并排序的方式执行,实现分区内有序。
    这个阶段还可以进行GroupingComparator分组,将key不同或不完全相同的记录划分为一组传递至ReduceTask执行

    4.Reduce阶段

  11. 一次读取一个分组的数据

    1. 仅按照key分组
    2. 通过GroupingComparator分组
  12. 业务逻辑
  13. 写入输出文件
    1. 默认TextOutputFormat