大数据中 MapReduce 的介绍指南

MapReduce 提供了一种高效、快捷且经济的应用程序构建方法。

该模型运用了并行处理和数据局部性等先进理念,为开发者和企业带来了诸多好处。

然而,市面上可选的编程模型和框架数量众多,令人难以抉择。

在大数据领域,我们不能随意选择。 必须选取能够处理海量数据的技术。

MapReduce 正是一个理想的解决方案。

本文将深入探讨 MapReduce 的本质及其优势。

让我们开始吧!

什么是 MapReduce?

MapReduce 是 Apache Hadoop 框架内的一种编程模型或软件架构。它用于创建能够在成千上万个具备容错性和可靠性的节点(称为集群或网格)上并行处理大规模数据的应用程序。

这种数据处理过程发生在存储数据的数据库或文件系统上。MapReduce 可以与 Hadoop 文件系统 (HDFS) 协同工作,从而访问和管理大量数据。

该框架由 Google 于 2004 年推出,并由 Apache Hadoop 发扬光大。它是 Hadoop 的处理层或引擎,可以执行以多种语言(包括 Java、C++、Python 和 Ruby)开发的 MapReduce 程序。

在云计算环境中,MapReduce 程序可以并行运行,因此非常适合大规模的数据分析。

MapReduce 的设计目标是通过使用“map”和“reduce”函数将任务分解为更小的子任务。它会映射每个子任务,然后将它们归约为等效的几个子任务,从而降低集群网络的处理负担和开销。

例如,假设你正在为一屋子的客人准备一顿饭。如果你尝试独自准备所有菜肴并完成所有步骤,那将既忙碌又耗时。

但如果你让朋友或同事(不是客人)帮忙准备,将不同的流程分配给可以同时执行任务的其他人,情况就会大不相同。这样,你就能更快、更轻松地准备好餐点,让客人准时享用。

MapReduce 采用了类似的原理,通过分布式任务和并行处理,更加高效、便捷地完成既定任务。

Apache Hadoop 允许程序员利用 MapReduce 在大型分布式数据集上执行模型,并使用先进的机器学习和统计技术来发现模式、进行预测、挖掘关联性等。

MapReduce 的特点

MapReduce 的主要特性包括:

  • 用户界面:它提供直观的用户界面,显示每个框架方面的详细信息。这有助于用户流畅地配置、应用和调整任务。

  • 有效负载:应用程序利用 Mapper 和 Reducer 接口实现 map 和 reduce 功能。Mapper 将输入键值对映射到中间键值对。Reducer 用于处理具有相同键的中间键值对,并执行排序、洗牌和归约这三个功能。
  • Partitioner:它控制中间映射输出键的划分。
  • Reporter:它用于报告进度、更新计数器和设置状态消息。
  • Counters:它表示 MapReduce 应用程序定义的全局计数器。
  • OutputCollector:该函数从 Mapper 或 Reducer 收集输出数据,而不是从中间输出。
  • RecordWriter:将数据输出或键值对写入输出文件。
  • DistributedCache:它用于有效地分发应用程序特定的、较大的只读文件。
  • 数据压缩:应用程序编写者可以压缩作业输出和中间映射输出。
  • 错误记录跳过:用户可以在处理 map 输入时跳过一些错误记录。该特性可以通过 SkipBadRecords 类进行控制。
  • 调试:它提供运行用户定义脚本和启用调试的选项。如果 MapReduce 中的任务失败,可以使用调试脚本查找问题。

MapReduce 架构

让我们通过深入了解 MapReduce 的组件来解析其架构:

  • 作业:在 MapReduce 中,作业是 MapReduce 客户端希望执行的实际任务。它由几个较小的子任务构成,这些子任务组合在一起形成最终任务。
  • 作业历史服务器:它是一个守护进程,用于存储和保存有关应用程序或任务的所有历史数据,例如在执行作业前后生成的日志。
  • 客户端:客户端(程序或 API)将作业提交给 MapReduce 进行执行或处理。在 MapReduce 中,一个或多个客户端可以不断地向 MapReduce Manager 发送作业进行处理。
  • MapReduce Master:MapReduce Master 将作业分解为多个较小的部分,并确保任务同时进行。
  • Job Parts:子作业或作业部分是通过划分主作业得到的。它们经过处理,并最终组合以生成最终任务。
  • 输入数据:它是提供给 MapReduce 用于任务处理的数据集。
  • 输出数据:任务处理后得到的最终结果。

在架构中,客户端将作业提交给 MapReduce Master,后者将其分解成更小、相等的部分。这样,作业能够更快地处理,因为处理较小的任务比处理较大的任务需要更少的时间。

然而,请注意不要将任务分解得太小,因为那样可能会导致管理拆分带来的额外开销,从而浪费大量时间。

接下来,作业部分可用于执行 Map 和 Reduce 任务。此外,Map 和 Reduce 任务具有基于团队正在处理的用例的合适程序。程序员开发基于逻辑的代码来满足要求。

之后,输入数据被输入到 Map Task,以便 Map 可以快速生成键值对作为输出。这些数据不是存储在 HDFS 上,而是使用本地磁盘存储,以避免数据复制。

任务完成后,输出可以丢弃。因此,将输出存储在 HDFS 上时,数据复制会变得过于庞大。每个 map 任务的输出将被馈送到 reduce 任务,map 输出将提供给运行 reduce 任务的机器。

接下来,输出将被合并并传递给用户定义的 reduce 函数。最后,缩减后的输出将存储在 HDFS 上。

此外,根据最终目标,该过程可以有多个 Map 和 Reduce 任务用于数据处理。 Map 和 Reduce 算法经过优化,可将时间和空间复杂度保持在最低水平。

由于 MapReduce 主要涉及 Map 和 Reduce 任务,因此有必要进一步了解它们。接下来,我们将讨论 MapReduce 的各个阶段,以便清楚地了解这些主题。

MapReduce 的阶段

地图

在这个阶段,输入数据被映射到输出键值对。例如,key 可以指代地址 ID,而 value 可以是该地址的实际值。

此阶段只有一个但两个任务:拆分和映射。拆分是指从主作业中分离出来的子部分或作业部分。这些部分也称为输入拆分。因此,输入拆分可以被视为映射所消耗的输入块。

接下来,执行映射任务。它被认为是执行 map-reduce 程序的第一个阶段。在此,每个拆分中包含的数据将被传递给 map 函数进行处理并生成输出。

函数 – Map() 在输入键值对的内存存储库中执行,生成中间键值对。这个新的键值对将作为输入提供给 Reduce() 或 Reducer 函数。

减少

在映射阶段获得的中间键值对作为 Reduce 函数或 Reducer 的输入。与映射阶段类似,涉及两个任务:shuffle 和 reduce。

因此,获得的键值对被排序和打乱,然后馈送到 Reducer。接下来,Reducer 根据开发者编写的 reducer 算法,根据其键值对数据进行分组或聚合。

在这里,来自混洗阶段的值被组合以返回输出值。这个阶段是对整个数据集的汇总。

现在,执行 Map 和 Reduce 任务的完整过程由一些实体控制。这些是:

  • Job Tracker:简单来说,Job Tracker 是负责完整执行已提交作业的主节点。作业跟踪器管理集群中的所有作业和资源。此外,作业跟踪器会调度每个 Map 任务,使其在特定数据节点上运行的任务跟踪器上执行。
  • Task Tracker:简而言之,Task Tracker 充当从节点,并根据 Job Tracker 的指令执行任务。任务跟踪器分别部署在集群中执行 Map 和 Reduce 任务的每个节点上。

它之所以高效,是因为一个作业会被分解为若干任务,这些任务将在集群的不同数据节点上运行。Job Tracker 负责通过调度任务并在多个数据节点上运行来协调任务。然后,位于每个数据节点上的任务跟踪器执行部分作业并处理每个任务。

此外,任务跟踪器向作业跟踪器发送进度报告。同时,Task Tracker 会定期向 Job Tracker 发送“心跳”信号,通知系统状态。如果发生任何故障,作业跟踪器可以在另一个任务跟踪器上重新安排作业。

输出阶段:在此阶段,你将获得从 Reducer 生成的最终键值对。可以使用输出格式化程序来转换键值对,并在记录器的帮助下将它们写入文件。

为什么使用 MapReduce?

以下是使用 MapReduce 的优势,说明为什么在大数据应用中必须使用它:

并行处理

你可以将作业拆分到不同的节点,每个节点同时处理 MapReduce 中作业的一部分。因此,将较大的任务分解为较小的任务可以降低复杂性。另外,由于不同的任务在不同的机器而不是单台机器上并行运行,因此处理数据所需的时间显著减少。

数据局部性

在 MapReduce 中,可以将处理单元移到数据所在的位置,而不是反向操作。

在传统方式中,数据被移动到处理单元进行处理。然而,随着数据的快速增长,这一过程开始带来许多挑战。其中一些挑战是成本更高、耗时更长、主节点负担过重、故障频繁和网络性能下降。

但是,MapReduce 通过采用相反的方法来帮助克服这些问题,即将处理单元引入数据所在的位置。通过这种方式,数据被分布在不同的节点之间,每个节点都可以处理一部分存储的数据。

这样,由于每个节点与其对应的数据部分并行工作,因此降低了成本,缩短了处理时间。此外,由于每个节点处理一部分数据,因此不会有节点负担过重。

安全

MapReduce 模型提供了更高的安全性。它有助于保护应用程序免受未经授权的数据访问,同时增强集群安全性。

可扩展性和灵活性

MapReduce 是一个高度可扩展的框架。它允许你使用数千 TB 的数据在多台机器上运行应用程序。它还提供了处理结构化、半结构化或非结构化以及任何格式或大小的数据的灵活性。

简易性

你可以使用任何编程语言(如 Java、R、Perl、Python 等)编写 MapReduce 程序。因此,任何人都可以轻松学习和编写程序,同时确保满足其数据处理需求。

MapReduce 的用例

  • 全文索引:MapReduce 用于执行全文索引。它的 Mapper 可以映射单个文档中的每个单词或短语。而 Reducer 用于将所有映射的元素写入索引。
  • 计算 PageRank:Google 使用 MapReduce 来计算 PageRank。
  • 日志分析:MapReduce 可以分析日志文件。当映射器搜索被访问的网页时,可以将大型日志文件分解为不同的部分或拆分。

如果在日志中发现一个网页,则会向 reducer 提供一个键值对。其中,网页将作为键,索引“1”作为值。在 Reducer 收到键值对后,将聚合各种网页。最终输出是每个网页的总点击数。

  • 反向 Web 链接图:该框架还可以在反向 Web 链接图中发挥作用。在此,Map() 生成 URL 目标和源,并从源或网页获取输入。

接下来,Reduce() 会聚合与目标 URL 关联的每个源 URL 的列表。最后,它输出源和目标。

  • 字数统计:MapReduce 用于统计一个单词在给定文档中出现的次数。
  • 全球变暖:组织、政府和公司可以使用 MapReduce 来解决全球变暖问题。

例如,你可能想要了解全球变暖导致海洋温度升高的情况。为此,你可以在全球范围内收集数以千计的数据。数据可以包括高温、低温、纬度、经度、日期、时间等。这需要几个 map 和 reduce 任务才能使用 MapReduce 计算出输出结果。

  • 药物试验:传统上,数据科学家和数学家共同开发能够对抗疾病的新药。随着算法和 MapReduce 的普及,组织中的 IT 部门可以轻松解决只有超级计算机专家才能处理的问题。现在,你可以检查一种药物对一组患者的有效性。
  • 其他应用:MapReduce 甚至可以处理在其他情况下不适合关系数据库的大规模数据。它还可以使用数据科学工具,并允许在不同的分布式数据集上运行它们,而这在以前只能在一台计算机上实现。

由于 MapReduce 的稳健性和简易性,它在军事、商业、科学等领域都有应用。

结论

MapReduce 可以被视为技术领域的一项突破。它不仅是一个更快、更简单的流程,而且还具有成本效益和省时性。鉴于其优势和不断增长的应用率,预计其在各行各业和组织中的采用率将会提高。

你还可以探索一些学习大数据和 Hadoop 的最佳资源。