Hadoop 中的 MapReduce 是什么? Archi结构与图表

⚡ 智能摘要

MapReduce 是 Hadoop 的编程模型,它通过对每个输入拆分运行 map 函数,然后对分组的中间值运行 reduce 函数,将大型数据集转换为小型结果。

  • 🔘 四个阶段: 每个作业都以拆分、映射的方式运行。ping进行洗牌和归约,键值对在每个阶段之间流动。
  • ☑️ 示例: 三行文字变成了七个字数统计,准确地显示了每个阶段的贡献。
  • ✅ 分体式尺码: 每个输入分割运行一个 map 任务,分割大小通常与 HDFS 块大小匹配。
  • 🧪 中间数据: 映射输出会写入本地磁盘而不是 HDFS,因为复制丢弃的数据会造成浪费。
  • 🛠️ 协调: 一份工作Tracker 安排工作和任务Trackers 通过周期性的心跳信号报告进展情况。
  • ⚠️ 版本说明: YARN 用 Hadoop 2.x 中的 ResourceManager、NodeManager 和每个作业的 ApplicationMaster 取代了这对组件。

通过示例解释 Hadoop 中的 MapReduce 架构

Hadoop 中的 MapReduce 是什么?

MapReduce 是一种用于处理海量数据的软件框架和编程模型。MapReduce 程序分两个阶段运行,即 Map 和 Reduce。Map 任务负责拆分和归约。ping 在 Reduce 任务中,数据会进行重新排序和缩减。

Hadoop的 能够运行用各种语言编写的 MapReduce 程序: Java, 红宝石, Python和 C++MapReduce 程序本质上是并行的,因此非常适合使用集群中的多台机器执行大规模数据分析。

每个阶段的输入都是键值对。此外,每个程序员都需要指定两个函数:一个映射函数和一个归约函数。

映射简化 Archi大数据中的结构解释示例

整个过程分为四个执行阶段,即拆分、映射。ping重新洗牌和减少。

现在,在本 MapReduce 教程中,让我们通过一个 MapReduce 示例来理解它。

假设你的 MapReduce 有以下输入数据: 大数据 程序:

Welcome to Hadoop Class
Hadoop is good
Hadoop is bad

下图 traces 这三条线贯穿每个阶段,从左侧的输入分割到右侧的最终字数统计。

MapReduce架构图 trac通过拆分将三行输入映射到ping重新洗牌和减少

MapReduce 任务的最终输出是

坏 1
增益级 1
非常好 1
Hadoop的 3
is 2
至 1
欢迎来到大巨龙 1

大数据中的 MapReduce 过程会经历以下几个阶段。

输入拆分

在大数据作业中,MapReduce 的输入会被分割成固定大小的片段,称为输入拆分。一个输入拆分是输入数据中会被单个 Map 处理的部分。

地图绘制

这是 MapReduce 程序执行的第一阶段。在这个阶段,每个拆分中的数据都会被传递给一个 map 对象。ping 生成输出值的函数。在我们的示例中,map 函数的作用是生成输出值。ping 该阶段的目标是统计输入分割中每个单词出现的次数(有关输入分割的更多详细信息,请参见下文),并准备一个列表,格式如下: 。

洗牌

此阶段会消耗 Map 的输出。ping 阶段。其任务是整合地图中的相关记录。ping 相位输出。在我们的示例中,相同的词语及其各自的频率被组合在一起。

减少

在此阶段,来自洗牌阶段的输出值将被聚合。此阶段会将来自洗牌阶段的值合并,并返回一个单一的输出值。简而言之,此阶段是对整个数据集进行汇总。

在我们的示例中,此阶段汇总了 Shuffle 阶段的值,即计算每个单词的总出现次数。

映射简化 Archi结构详解

以下几点解释了拆分任务、映射任务和归约任务是如何在集群中实际放置和存储的。

  • 为每个拆分创建一个映射任务,然后对拆分中的每个记录执行映射函数。
  • 将数据拆分成多个部分总是有益的,因为处理单个部分所需的时间远小于处理整个输入所需的时间。拆分部分越小,负载均衡性越好,因为各个部分可以并行处理。
  • 然而,拆分规模过小也是不可取的。当拆分规模过小时,管理拆分和创建映射任务的开销会占据作业总执行时间的大部分。
  • 对于大多数工作而言,最好使分割尺寸与总尺寸相等。 高密度文件系统 块大小从 Hadoop 2.x 开始默认为 128 MB(Hadoop 1.x 中为 64 MB),并由以下因素控制: dfs.blocksize 属性。
  • 执行 map 任务会将输出写入相应节点上的本地磁盘,而不是写入 HDFS。
  • 选择本地磁盘而不是 HDFS 的原因是为了避免 HDFS 存储操作期间发生的数据复制。
  • Map 输出是中间输出,经过 Reduce 任务处理后产生最终输出。
  • 一旦作业完成,map 输出就可以丢弃。因此,将其存储在具有副本的 HDFS 中就有些大材小用了。
  • 一旦发生节点故障,在 map 输出被 Reduce 任务消费之前,Hadoop 会在另一个节点上重新运行 map 任务,并重新创建 map 输出。
  • Reduce 任务不遵循数据局部性原则。每个 Map 任务的输出都会被传递给 Reduce 任务。Map 的输出会被传输到运行 Reduce 任务的机器上。
  • 在这台机器上,输出被合并,然后传递给用户定义的reduce函数。
  • 与 map 输出不同,reduce 输出存储在 HDFS 中(第一个副本存储在本地节点上,其他副本存储在异地节点上)。因此,写入 reduce 输出确实会消耗网络带宽,但仅与普通 HDFS 写入管道消耗的带宽相当。

MapReduce 如何组织工作?

现在,在本 MapReduce 教程中,我们将学习 MapReduce 的工作原理。

Hadoop 将作业分解成多个任务。任务分为两种类型:

  1. 地图任务(拆分和地图)ping)
  2. 减少任务(重新排序,减少)

整个执行过程,即 Map 和 Reduce 任务的执行,由两种类型的实体控制,这两种实体分别称为:

  1. 工作Tracker:扮演主人的角色,负责完整执行提交的任务。
  2. 多任务Trackers:像奴隶一样行事,每个人都承担一部分工作。

系统中提交执行的每个作业都对应一个作业。Tracker 位于 NameNode 上,并且有多个 TaskTrac驻留在数据节点上的 kers。

注意: 工作Tracker 和 TaskTracker 对属于 MapReduce 版本 1(Hadoop 1.x)。从 Hadoop 2.x 开始,YARN 将这些职责分配给集群范围的 ResourceManager、每个节点上的 NodeManager 以及每个作业一个 ApplicationMaster,尽管 map、shuffle 和 reduce 阶段本身保持不变。

下图展示了提交的作业是如何分解成各个任务的。 trac跨越集群。

图示展示了如何将工作拆分为映射和简化任务。 trac工作Tracker 和 TaskTracKERS

  • 一项作业被分解成多个任务,然后在集群中的多个数据节点上运行这些任务。
  • 这是工作职责。 tracker 通过调度任务在不同的数据节点上运行来协调活动。
  • 单个任务的执行则由该任务负责。 tracker,它驻留在执行作业部分的每个数据节点上。
  • 任务 tracker 的职责是向工作单位发送进度报告。 tracker。
  • 此外,这项任务 tracker 会定期向作业发送“心跳”信号。Tracker 以便通知它系统的当前状态。
  • 因此,这份工作 tracker 保持 track 代表每项任务的整体进度。如果任务失败,则该任务 tracker 可以将其重新安排到另一个任务中。 tracker。

常见问题

从 Hadoop 2.x 版本开始,YARN 就实现了这一点。集群范围的 ResourceManager 负责调度,每个节点上运行一个 NodeManager,每个作业对应一个 ApplicationMaster。 tracks 执行其任务。map 和 reduce 阶段保持不变。

基于过往作业历史记录训练的模型可以预测运行时间,推荐拆分大小和归约器数量,并及早发现偏差。它们还会监控计数器值,在运行结束前标记异常缓慢或失败的作业。

Copilot 对脚手架的处理非常出色:mapper 和 reducer 签名、泛型、导入和驱动程序配置调用。模式决策,例如哪个字段是组ping 关键是,仍然需要一位了解数据的开发人员。

通常的起始值略低于可用 reduce 槽的数量,这样每个 reducer 都能一次性运行完毕。槽数太少会导致数据拖尾过长;槽数太多则会产生大量小型输出文件。

组合器(combiner)是一个可选的小型归约器,它在映射(map)的输出通过网络传输之前运行。它可以大幅减少 shuffle 流量,但只能在归约操作同时满足结合律和交换律时使用。

Spark MapReduce 将中间结果保存在内存中,并将作业表示为一个有向阶段图,而 MapReduce 则在阶段之间将中间输出写入磁盘。 Spark 因此,对于迭代工作来说速度要快得多。

分区器决定将每个中间键分配给哪个 reducer,默认情况下,它会对键进行哈希运算,并取 reducer 数量的模。如果哈希运算导致单个 reducer 过载,则会编写自定义分区器。

Hadoop 会为每个输入拆分创建一个 map 任务,这里的拆分指的是一个字节范围,而不是整个文件。一个大文件会产生多个拆分;许多小文件则会产生规模很小、效率低下的 map 任务。

总结一下这篇文章: