【大数据2025】MapReduce
2025/1/19 17:42:29
来源:https://blog.csdn.net/qq_44810930/article/details/145231718
浏览:
次
关键词:【大数据2025】MapReduce
MapReduce 基础介绍
- 起源与发展:是 2004 年 10 月谷歌发表的 MAPREDUCE 论文的开源实现,最初用于大规模网页数据并行处理,现成为 Hadoop 核心子项目之一,是面向批处理的分布式计算框架。
- 基本原理:分为 map 和 reduce 两个阶段。map 阶段将计算任务分发到数据节点并行运算,各节点得出部分结果;reduce 阶段汇总部分结果得到最终结果,体现分而治之与并行运算思想,遵循计算跟着数据走、移动计算而非数据的原则。
MapReduce 特点
- 计算与数据关系:计算任务移动到数据所在节点,数据不动,降低分布式编程门槛。
- 扩展性:具有良好扩展性,随着节点增加,存储和计算能力近乎线性递增。
MapReduce 适用场景
- 离线批处理任务:适合海量数据离线批处理,如数据统计(PVUV 统计)、搜索引擎索引构建、海量数据查询、复杂数据分析算法实现等。
MapReduce 不适用场景
- 实时性要求高的场景:不适合毫秒或秒级返回结果的场景,如 OLAP、流计算,因其计算效率达不到实时性要求,且无法处理无界数据集和支持实时计算模式。
- DAG 运算场景:不能进行有向无环图(DAG)运算,由于中间结果需落盘、读盘和网络传输,导致延迟高、效率低。
MapReduce 与 Spark 在 DAG 运算上的对比
- MapReduce 的劣势:做 DAG 运算慢,中间结果落盘、读盘和网络传输过程繁琐,效率低。
- Spark 的优势:支持 DAG 运算,数据存于内存,可直接将结果给到下一个任务计算,速度快,但存在内存不足问题。
MAPREDUCE 作业运行原理与词频统计示例
- 以词频统计展示 MAPREDUCE 作业运行原理,即统计英文文本中单词出现频率。
- 若文本存于 HDFS,其自动进行 split 操作;若未存于 HDFS,则按 128 兆一块进行数据块拆分,每个数据块启动一个 map task。
map 任务处理过程
- map task 将每行文本按空格拆分单词,把单词作为 K,给每个单词标 value 值为 1,形成 K-V 形式中间结果。
reduce 节点聚合操作
- 把相同 K 的数据分发到同一个 reduce 节点进行聚合,将相同 K 的 value 值累加得到最终词频结果,其中难点在于如何把相同 K 分发到同一 reduce,此过程需经过 shuffle(洗牌)阶段。
哈希取模分发机制
- shuffle 阶段通过哈希取模实现分发,先将字符串形式的 K 进行数字编码,再对 reducer 个数进行哈希取模(即转换后的数字除以 reducer 个数取余数),余数对应相应的 reduce 节点,以此保证相同 K 能聚合到同一 reducer。
生产中 reduce 个数设置
- 生产中 reduce 个数可手动指定,实际应用中可能不像示例中有较多 reduce,如可能只有两个 reduce,此时单词会按哈希取模结果分发到这两个 reduce 中进行处理。
map reduce 执行流程
- 文件拆分与 map 任务启动:文件上传至 HDFS 后会自动进行 split,拆分成多个 block,每个 block 启动一个 map 任务。
- map 任务处理与分组:map 任务处理数据得到 key-value 结果,并依据 key 对 reduce 个数进行哈希取模分组。例如有三个 reduce,则按对三取模结果分为三组。
- reduce 任务拉取与处理:reduce 任务启动 fetch 线程,从各 map 拉取对应组数据,将来自多个地方的同组数据合并为一个大文件后,对文件按 key 进行 reduce 处理(如词频统计中对相同 key 的 value 累加求和),每个 reducer 会输出一个结果文件存于同一目录下,这些文件总和即为最终结果。
执行阶段划分
- 按任务划分:分为 map task 和 reduce task。
- 按运行阶段划分:包括 split 阶段、shuffle 阶段、reduce 阶段及输出阶段。其中 shuffle 阶段由 map task 和 reduce task 共同完成,map task 负责对内存缓存区(100 兆,达 80%即 80 兆时触发)的数据进行分组排序并落盘,可能产生多个小文件后再合并成大文件;reduce task 从 map 拉取数据到缓存(有阈值,超阈值也会落盘),同样要对数据合并、分组排序后再进行 reduce 处理。
shuffle 阶段详细分析
- map 端操作:map 运算结果存放在 100 兆内存缓存区,达到 80 兆时触发溢写到磁盘,同时进行分组排序,根据 reduce 个数哈希取模分组并在组内排序,多次溢写会生成多个分组有序小文件,最后需合并成大的分组有序文件。
- reduce 端操作:reduce 启动 fetch 线程从 map 拉取数据到缓存,缓存达到阈值后溢写生成小文件,再合并成大文件并进行分组排序(按 K 值分组排序),最后对分组有序文件进行 reduce 处理。
- 效率问题:shuffle 阶段是 map reduce 执行慢的关键。其在 map 和 reduce 过程中大量数据落盘,且 reduce 拉取数据时存在大量网络传输,内存缓存使用量小(仅几百兆),频繁与磁盘交互及网络传输导致整体效率低下。
作业提交与运行
- 提交方式:使用
hadoop -jar
命令提交作业,需指定 jar 包名称及要运行的主类名,并可添加参数。例如,官方示例包中运行 MAREDUCE 作业统计π值时,需按此方式提交。 - 作业管理:通过
yarn application - list
查看作业运行情况,用 yarn application -kill
取消作业。
作业运行监控
- 运行状态显示:作业提交后会生成作业 id,运行时控制台会实时显示 map 和 reduce 的进度信息。需注意,按
CTRL + C
只能中断控制台输出,无法终止后台作业。 - 可视化监控:可访问yarn集群主节点的 8088 端口进入可视化监控页面,在
applications
中找到正在运行的作业,点击作业 id 查看详细运行情况。
日志查看与排错
- 查看途径:除可视化界面外,可在作业运行节点查找日志。运维人员可登录节点,依据
yarn node manager
相关配置找到日志存储目录(通常在 log
目录下),查看作业输出日志以分析运行状况。普通用户一般通过可视化界面查看日志。 - 排错方法:从日志信息中排查和解决作业运行问题。