【大数据2025】MapReduce

embedded/2025/1/20 1:48:00/

在这里插入图片描述

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.ppmy.cn/embedded/155347.html

相关文章

构建安全防线:基于视频AI的煤矿管理系统架构创新成果展示

前言 本文我将介绍一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的架构, 因此我也特别感谢CSDN平…

源码编译安装httpd 2.4,提供系统服务管理脚本并测试

1.安装httpd wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gzbmcv tar -zxvf httpd-2.4.62.tar.gz cd httpd-2.4.62 2.安装依赖包 sudo yum install -y gcc make apr-devel apr-util-devel pcre-devel sudo yum groupinstall "Development Tools"…

Redis 部署模式

Redis 提供了三种部署模式:单兵模式、哨兵模式、和 集群模式,每种模式有不同的特点和适用场景。下面分别介绍这三种模式。 1. 单兵模式(Standalone) 单兵模式是最简单的 Redis 部署模式,适合对高可用性要求不高的场景…

数字化转型的新引擎:开源AI智能名片2+1链动模式S2B2C商城小程序源码的应用与实践

摘要:本文旨在深入探讨开源AI智能名片21链动模式S2B2C商城小程序源码在企业数字化转型中的应用与实践。随着全球数字化浪潮的推进,企业正面临着前所未有的竞争压力与机遇。数字化转型已成为企业提升竞争力、实现可持续发展的关键路径。然而,不…

Windows图形界面(GUI)-QT-C/C++ - Qt控件与布局系统详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt布局系统(Layouts) 布局管理器基础 高级布局技巧 嵌套布局 设置间距和边距 常用控件详解 按钮类控件 QPushButton (标准按钮) QRadioButton (单选按钮) QCheckBox (复选框) …

图论1-问题 C: 算法7-6:图的遍历——广度优先搜索

题目描述 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先…

使用docker部署tomcat服务器和mysql数据库

使用docker部署tomcat服务器 1、拉去tomcat镜像 [rootlocalhost yum.repos.d]# sudo docker pull docker.io/tomcat:9 9: Pulling from library/tomcat de44b265507a: Pull complete 4c2afd91a87d: Pull complete 89e9bbcfa697: Pull complete 11be3e613582: Pull complet…

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍(不得不吐槽下,官方代码有很多遗留问题,他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上),经过了大量的查阅各种资料以…