当前位置: 首页 > article >正文

【大数据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 目录下),查看作业输出日志以分析运行状况。普通用户一般通过可视化界面查看日志。
  • 排错方法:从日志信息中排查和解决作业运行问题。

http://www.kler.cn/a/509610.html

相关文章:

  • Linux:磁盘分区
  • 【蓝桥杯】Python算法——求逆元的两种算法
  • linux手动安装mysql5.7
  • 构建优雅、高效的 Nodejs 命令行工具 - Archons
  • 闪豆多平台视频批量下载器
  • Unity ShaderGraph中Lit转换成URP的LitShader
  • 解决conda create速度过慢的问题
  • DETRs with Collaborative Hybrid Assignments Training论文阅读与代码
  • 【LeetCode: 226. 翻转二叉树 + 二叉树】
  • 若依入门使用
  • WEB攻防-通用漏洞_XSS跨站_绕过修复_http_only_CSP_标签符号
  • Redis的线程模型是什么
  • Qt QML专栏目录结构
  • 基于Python的心电图报告解析与心电吸引子绘制
  • 嵌入式工程师必学(7):SWD仿真接口(for ARM)的使用方法
  • wps数据分析000002
  • 密码机服务器在云计算中的应用与挑战
  • 【时时三省】(C语言基础)柔性数组
  • SAP 固定资产常用的数据表有哪些,他们是怎么记录数据的?
  • springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境
  • 【深度学习】Huber Loss详解
  • nuiapp在APP中的.nvue页面中使用webview展示空白的问题
  • 【HarmonyOS NAPI 深度探索7】N-API 数据处理:与 JavaScript 数据的交互
  • 【零基础入门unity游戏开发——unity3D篇】地形Terrain的使用介绍
  • Node.js卸载超详细步骤(附图文讲解)
  • 基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1