Hadoop MapReduce概念

Map-Reduce编程是什么意思?

MapReduce是一种编程模型,旨在通过将工作划分为一组独立的任务来并行处理大量数据。

MapReduce编程模型受功能语言的启发,并以数据密集型计算为目标。 输入数据格式是特定于应用程序的,由用户指定。 输出是一组<key,value>对。 用户使用两个功能Map和Reduce来表达算法。 Map函数应用于输入数据,并生成中间<key,value>对的列表。 Reduce函数适用于具有相同**的所有中间对。 它通常执行某种合并操作,并产生零个或多个输出对。 最后,输出对按其键值排序。 以MapReduce程序的最简单形式,程序员仅提供Map函数。 运行时提供所有其他功能,包括具有相同关键字的中间对的分组和最终排序。

MapReduce模型的阶段

MapReduce中的顶层工作是一项工作。 作业通常具有映射和缩小阶段,尽管可以省略缩小阶段。 例如,考虑一个MapReduce作业,该作业计算在一组文档中每个单词的使用次数。 映射阶段对每个文档中的单词进行计数,然后归约阶段将每个文档的数据聚合为整个整个集合中的单词计数。

在映射阶段 ,输入数据分为多个输入拆分,以供跨Hadoop集群并行运行的映射任务进行分析。 默认情况下,MapReduce框架从Hadoop分布式文件系统(HDFS)获取输入数据。

精简阶段使用映射任务的结果作为一组并行精简任务的输入。 reduce任务将数据合并为最终结果。 默认情况下,MapReduce框架将结果存储在HDFS中。

尽管缩减阶段取决于映射阶段的输出,但是映射和缩减处理不一定是顺序的。 也就是说,reduce任务可以在任何地图任务完成后立即开始。 没有必要先完成所有映射任务,然后再开始执行任何简化任务。

MapReduce对键值对进行操作。 从概念上讲,MapReduce作业采用一组输入键值对,并通过将数据传递给map并简化函数来产生一组输出键值对。 映射任务产生一组中间的键值对,reduce任务将其用作输入。

地图输出对中的键不必唯一。 在映射处理和归约处理之间,随机排序步骤将具有相同键的所有映射输出值排序到单个归约输入(键,值列表)对中,其中“值”是共享相同键的所有值的列表。 因此,归约任务的输入实际上是一组(键,值列表)对。

Hadoop MapReduce概念

Hadoop MapReduce概念

尽管每组键值对都是同类的,但每个步骤中的键值对不必具有相同的类型。 例如,输入集中(KV1)的键值对可以是(字符串,字符串)对,其中map阶段生成的(string,integer)对作为中间结果(KV2),而reduce阶段的生成(integer,字符串)对以获取最终结果(KV3)。

地图输出对中的键不必唯一。 在映射处理和归约处理之间,随机排序步骤将具有相同键的所有映射输出值排序到单个归约输入(键,值列表)对中,其中“值”是共享相同键的所有值的列表。 因此,归约任务的输入实际上是一组(键,值列表)对。

展示MapReduce概念的示例

该示例通过计算一组文本文件中每个单词的出现次数演示了MapReduce的基本概念。

MapReduce输入数据分为输入分割,并且这些分割进一步分为输入键值对。 在此示例中,输入数据集是两个文档document1和document2。 InputFormat子类将数据集分为每个文档一个拆分,总共2个拆分:

Hadoop MapReduce概念

Hadoop MapReduce概念

注意: MapReduce框架使用作业配置中提供的org.apache.hadoop.mapreduce.InputFormat子类将输入数据集划分为称为拆分的块。 拆分由本地Job Client创建,并包含在Job Tracker可用的作业信息中。 JobTracker为每个拆分创建一个映射任务。 每个映射任务都使用InputFormat子类提供的RecordReader将拆分转换为输入键值对。

将为输入文档中的每一行生成一个(行号,文本)键值对。 映射函数丢弃行号,并为输入行中的每个单词生成每行(单词,计数)对。 reduce阶段生成(单词,计数)对,表示所有输入文档中的汇总单词计数。 给定显示的输入数据,示例作业的map-reduce进度为:

Hadoop MapReduce概念

map阶段的输出包含多个具有相同键的键/值对:'oats'和'eat'键出现两次。 回想一下,MapReduce框架在进入reduce阶段之前将所有值与相同的键合并,因此reduce的输入实际上是(键,值)对。 因此,上面显示了从贴图输出到归约的整个过程。

MapReduce工作生命周期

以下是典型的MapReduce作业的生命周期和主要参与者的角色。整个生命周期更加复杂,因此我们将重点放在主要组件上。

Hadoop配置可以通过不同的方式完成,但是基本配置包括以下内容。

  • 运行作业跟踪程序的单个主节点
  • 运行Task Tracker的多个工作程序节点

以下是MapReduce作业的生命周期组件。

  • 本地作业客户端:本地作业客户端准备要提交的作业,并将其交给作业跟踪器。
  • 作业跟踪器:作业跟踪器计划作业并在任务跟踪器之间分配地图工作以进行并行处理。
  • 任务跟踪器:每个任务跟踪器都会生成一个地图任务。 作业跟踪器从任务跟踪器接收进度信息。

一旦地图结果可用,作业跟踪器就会在任务跟踪器之间分配精简工作以进行并行处理。

每个“任务跟踪器”都会生成一个“简化任务”以执行工作。 作业跟踪器从任务跟踪器接收进度信息。

在reduce任务开始运行之前,不必完成所有地图任务。 简化任务可在地图任务开始完成后立即开始。 因此,映射和简化步骤通常会重叠。

MapReduce作业中不同组件的功能

作业客户端:作业客户端执行以下任务

  • 验证作业配置
  • 生成输入拆分。 这基本上是将输入作业分成多个块
  • 将作业资源(配置,作业JAR文件,输入拆分)复制到共享位置,例如HDFS目录,作业跟踪器和任务跟踪器可以在该位置访问它
  • 将作业提交给作业跟踪器

作业跟踪器:作业跟踪器执行以下任务

  • 从作业客户端放置信息的共享位置获取输入拆分
  • 为每个拆分创建一个映射任务
  • 将每个地图任务分配给任务跟踪器(工作器节点)

地图任务完成后,Job Tracker将执行以下任务

  • 创建减少任务,直到任务配置启用的最大任务。
  • 将每个映射结果分区分配给reduce任务。
  • 将每个化简任务分配给任务跟踪器。

任务跟踪器:任务跟踪器管理一个工作节点的任务,并向任务跟踪器报告状态。

当任务跟踪器分配了映射或归约任务时,它将执行以下任务

  • 在本地获取作业资源
  • 在工作节点上生成子JVM,以执行映射或简化任务
  • 向工作追踪器报告状态

调试Map Reduce

Hadoop会在程序执行期间保留重要事件的日志。 默认情况下,它们存储在运行Hadoop的hadoop-version /目录的logs /子目录中。 日志文件名为hadoop-username-service-hostname.log。 最新数据位于.log文件中; 较旧的日志将附加其日期。 日志文件名中的用户名是指启动Hadoop时使用的用户名-这不一定与您用来运行程序的用户名相同。 服务名称指的是几个Hadoop程序中的哪个正在编写日志。 这些可以是jobtracker,namenode,datanode,secondarynamenode或tasktracker。 所有这些对于调试整个Hadoop安装都很重要。 但是对于单个程序,tasktracker日志将是最相关的。 程序引发的任何异常都将记录在tasktracker日志中。

日志目录还将有一个名为userlogs的子目录。 在这里,每个任务运行都有另一个子目录。 每个任务将其stdout和stderr记录到此目录中的两个文件中。 请注意,在多节点Hadoop群集上,这些日志不是集中汇总的-您应检查每个TaskNode的logs / userlogs /目录中的输出。

在分布式设置中进行调试非常复杂,并且需要登录多台计算机以访问日志数据。 如果可能,应通过在本地运行Hadoop对程序进行单元测试。 Hadoop部署的默认配置在“单实例”模式下运行,其中整个MapReduce程序在与JobClient.runJob()相同的Java实例中运行。 然后使用Eclipse之类的调试器,可以在map()或reduce()方法内设置断点以发现错误。

减少工作是强制性的吗?

有些作业可以在地图阶段完成所有工作。 因此,作业可以是仅地图作业。 要在映射完成后停止作业,请将reduce任务数设置为零。

结论

本模块描述了Hadoop系统核心的MapReduce执行平台。 通过使用MapReduce,应用程序可以实现高度的并行性。 MapReduce框架通过限制节点之间可能发生的通信,为其上运行的应用程序提供高度的容错能力。

翻译自: https://www.javacodegeeks.com/2014/04/hadoop-mapreduce-concepts.html