MapReduce完整工作流程

1、mapreduce工作流程(终极版)

  1. 任务提交

  2. 拆-split逻辑切片--任务切分。 FileInputFormat--split切片计算工具 FileSplit--单个计算任务的数据范围。

  3. 获得split信息和个数。

MapTask阶段

  1. 读取split范围内的数据。k(偏移量)-v(行数据)

关键API:TextInputFormat。

  1. 循环调用mapper.map(k,v) 关键代码:

while(xx.next){ mapper.map(k,v); }

  1. mapper.map执行完毕后,输出k-v,调用k-v的分区计算

Partitioner.getPartition(k,v,reduceTask数量)--分区号。

  1. 将输出k-v{分区号},存入临时缓冲区。环形缓冲区。

MapOutputBuffer--环形缓冲区。

  1. 如果缓冲区写满80%(mapper代码执行完毕),触发spill溢写过程。

① 读取k-v{分区号},对溢写范围内的数据进行排序。

② 存放到本地磁盘文件中,产生分区内的溢写文件。

  1. 溢写完毕后,产生多个溢写文件

① 将多个溢写文件合并成1个有序---归并排序。

② combiner(分区 合并 调用reducer--局部reduce操作)【如果开启】

结果: 每个MapTask执行完毕后本地磁盘,每个分区(目录)内只有一个文件。(Key有序)

ReduceTask阶段

  1. 从各个MapTask节点下载对应分区的结果文件。

MapTask(分区0文件)

MapTask(分区0文件)→ ReduceTask-0

MapTask(分区0文件)

  1. merge操作

① 排序

② 按照key分组

③ 将key相同的多个value--->[v,v,v,v]

  1. 循环调用Reducer.reduce方法处理数据

while(xxx){ reducer.reduce(k,vs); }

  1. reducer.reduce输出key-value,将数据写入HDFS中。

TextOutputForamt 格式化数据的工具类

FileOutputFormat 指定输出HDFS的路径位置。

整个过程简述:

任务提交,根据文件大小切分Split逻辑切片,一个逻辑切分会启动一个Maptesk任务,Maptask会循环读取block块上的数据输出key和value,然后进行分区计算将输出的k、v存入临时缓冲区,缓冲区写满80%后会产生溢写文件(多个),然后将不同分区的多个溢写文件合并为一个溢写文件作为该阶段的输出文件。通过网络传输进入reduceTesk阶段,将不同split逻辑切分中的相同的分区号文件进行合并为一个文件(merge操作),作为reduceeTesk的输入文件,循环调用Reducer.reduce方法执行任务,将数据写入HDFS中。

2、Spill溢写过程详解

发生在MapReduce过程中的排序:

第一次: MapTask阶段环形缓冲区开始spill溢写,缓冲区每次溢写,发生一轮排序。 快排排序

第二次: Maptask多次溢写产生的多个溢写文件(单个文件每部k有序),要做归并排序,maptask每个分区内,只保留1个文件(key有序) 归并排序

第三次: ReduceTask-0 汇总多个MapTask的(对应分区-0)结果文件,归并排序

3、Shuffle过程详解

简言:站在数据的角度来讲,数据从Mapper.map方法离开,一直到数据进入Reducer.reduce方法,中间的过程。

Mapper阶段

  1. 循环调用mapper.map(k,v) 关键代码:

while(xx.next){ mapper.map(k,v); }

  1. mapper.map执行完毕后,输出k-v,调用k-v的分区计算

Partitioner.getPartition(k,v,reduceTask数量)--分区号。

  1. 将输出k-v{分区号},存入临时缓冲区。环形缓冲区。

MapOutputBuffer--环形缓冲区。

  1. 如果缓冲区写满80%(mapper代码执行完毕),触发spill溢写过程。

① 读取k-v{分区号},对溢写范围内的数据进行排序。

② 存放到本地磁盘文件中,产生分区内的溢写文件。

ReduceTask阶段

  1. 从各个MapTask节点下载对应分区的结果文件。

MapTask(分区0文件)

MapTask(分区0文件)→ ReduceTask-0

MapTask(分区0文件)

  1. merge操作

① 排序

② 按照key分组

③ 将key相同的多个value--->[v,v,v,v]

  1. 循环调用Reducer.reduce方法处理数据

while(xxx){ reducer.reduce(k,vs); }

相关推荐
TracyCoder1232 小时前
ElasticSearch内存管理与操作系统(一):内存分配底层原理
大数据·elasticsearch·搜索引擎
cd_949217213 小时前
九昆仑低碳科技:所罗门群岛全国森林碳汇项目开发合作白皮书
大数据·人工智能·科技
Acrelhuang3 小时前
工商业用电成本高?安科瑞液冷储能一体机一站式解供能难题-安科瑞黄安南
大数据·开发语言·人工智能·物联网·安全
小王毕业啦3 小时前
2010-2024年 非常规高技能劳动力(+文献)
大数据·人工智能·数据挖掘·数据分析·数据统计·社科数据·经管数据
言無咎3 小时前
从规则引擎到任务规划:AI Agent 重构跨境财税复杂账务处理体系
大数据·人工智能·python·重构
私域合规研究4 小时前
【AI应用】AI与大数据融合:中国品牌出海获客的下一代核心引擎
大数据·海外获客
TDengine (老段)4 小时前
金融风控系统中的实时数据库技术实践
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
MMME~5 小时前
Ansible模块速查指南:高效定位与实战技巧
大数据·运维·数据库
计算机毕业编程指导师5 小时前
大数据可视化毕设:Hadoop+Spark交通分析系统从零到上线 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·城市交通
计算机毕业编程指导师5 小时前
【计算机毕设选题】基于Spark的车辆排放分析:2026年热门大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·车辆排放