MapReduce的执行流程&排序

MapReduce 是一种用于处理大规模数据集的分布式计算模型。它将作业分成多个阶段,以并行处理和分布式存储的方式来提高计算效率。以下是 MapReduce 的执行流程以及各个阶段的详细解释:

1. 作业提交(Job Submission)

用户通过客户端提交 MapReduce 作业。客户端指定作业的输入数据、输出位置、Map 和 Reduce 函数以及其他配置参数。作业提交后,客户端与集群的资源管理器(如 YARN 的 ResourceManager)进行通信,申请资源并提交作业。

2. 作业初始化(Job Initialization)

资源管理器接收作业请求并启动作业管理器(JobManager),在 YARN 中叫做 ApplicationMaster。作业管理器负责进一步分解作业并为每个任务申请资源。

3. 任务分配(Task Assignment)

作业管理器将作业分解成多个任务(Tasks),包括多个 Map 任务和 Reduce 任务。资源管理器根据资源情况分配容器(Containers)来执行这些任务。

4. Map 阶段(Map Phase)

4.1. 输入分片(Input Splitting)

作业管理器将输入数据集分成若干个数据分片(Splits),每个分片通常对应一个 Map 任务。分片是逻辑上的划分,具体的数据读取由记录读取器(RecordReader)完成。

4.2. Map 任务执行

每个 Map 任务处理一个输入分片。Map 函数读取输入数据(通常是键值对),并产生中间键值对(key-value pairs)。

4.3. 本地排序(In-Memory Sort)

Map 任务在本地内存中对输出的中间键值对进行排序。如果输出数据超过内存限制,数据会溢出到磁盘,并进行合并和排序。

并且会将产生的中间键值对写入内存缓冲区(环形缓冲区),缓冲区的大小默认是100MB,存储阈值是80%,当存储的数据达到80%的时候会触发溢写(spill)操作,溢写会对环形缓冲区中的数据写入磁盘文件中,这个过程就被称为溢写文件。

在写入磁盘时,数据会被分区,排序,这个排序的过程也就是接下来提到的第二次排序,在maptask执行过程中,可能会发生多次溢写,生成多个溢写文件,在maptask结束之后,这些溢写文件会被合并成为一个或者少量文件。

5. Shuffle 和 Sort 阶段(Shuffle and Sort Phase)

5.1. Shuffle

在 Map 任务完成后,中间键值对会传输到 Reducer 节点。Shuffle 阶段负责将这些中间数据从 Mapper 节点传输到合适的 Reducer 节点。

5.2. Sort

Reducer 接收到来自多个 Mapper 的中间数据后,会进行排序。这个排序是基于键的全局排序,确保相同键的所有值聚集在一起。

6. Reduce 阶段(Reduce Phase)

6.1. Reduce 任务执行

每个 Reduce 任务接收到排序后的中间数据,调用 Reduce 函数处理每个键及其对应的值。Reduce 函数产生最终的输出键值对。

7. 输出阶段(Output Phase)

Reduce 任务的输出被写入到指定的输出位置(通常是分布式文件系统,如 HDFS)。

8. 作业完成(Job Completion)

当所有的 Map 和 Reduce 任务都完成后,作业管理器向资源管理器报告作业完成状态。客户端可以查询作业的状态和统计信息。作业的输出数据现在可以供用户使用。

执行流程图解

  1. 作业提交:客户端 -> 资源管理器
  2. 作业初始化:资源管理器 -> 作业管理器(JobManager/ApplicationMaster)
  3. 任务分配:作业管理器 -> Map 任务和 Reduce 任务
  4. Map 阶段
    • 输入分片 -> Map 任务 -> 本地排序
  5. Shuffle 和 Sort 阶段:Map 输出 -> Shuffle -> Sort
  6. Reduce 阶段:Reduce 任务执行
  7. 输出阶段:Reduce 输出写入 -> 输出位置
  8. 作业完成:作业管理器报告 -> 资源管理器 -> 客户端查询

通过这种结构化的执行流程,MapReduce 实现了对大规模数据的高效处理和分析。

总结:

总结一下,整个mapreduce的执行过程会包含大致三次排序过程,第一次发生在maptask阶段,map阶段会对输入的数据进行读取并产生中间键值对,maptask在本地内存中对输出的中间键值对进行排序。如果输出数据超过内存限制,就会触发第二次排序,此时数据会溢出到磁盘,并进行合并和排序。第三次排序:数据在进行shuffer和sort阶段的合并排序之后,会发送到对应的reducer节点,此时会进行最后的归并排序,将所有键值对按照相同的键进行合并,保证拥有相同键的值存放在一起,这次的排序是全局排序,reducetask会将排序好的结果进行输出。

相关推荐
rkshangan28 分钟前
软考高级:探寻易考科目与高效备考之路
大数据·网络
莹雨潇潇3 小时前
大数据时代的隐私与自由(演讲稿)
大数据
dogplays3 小时前
Doris Streamloader安装教程
大数据
哲讯智能科技10 小时前
智慧能源新篇章:SAP如何赋能光伏行业数字化转型
大数据·人工智能
宅小海12 小时前
14 配置Hadoop集群-配置历史和日志服务
linux·服务器·hadoop
嘟嘟嘟嘟嘟嘟嘟.12 小时前
MapReduce的工作原理
大数据·mapreduce
汤姆yu13 小时前
基于python大数据的商品数据可视化分析系统
大数据·python·信息可视化·商品数据
好记忆不如烂笔头abc13 小时前
oracle-blob导出,在ob导入失败
大数据·数据库·python
珹洺13 小时前
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程(附带图谱表格更好对比理解)
java·开发语言·前端·hive·hadoop·servlet·html
Double@加贝17 小时前
StarRocks的执行计划和Profile
大数据·starrocks