Hadoop MapReduce初学者教程

Hadoop MapReduce是一个软件框架,可以轻松地编写应用程序,以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。与 HDFS相似,Hadoop MapReduce甚至可以在商用硬件中执行,并假定节点可以随时发生故障并仍然处理作业。通过将一个任务划分为多个独立的子任务,MapReduce可以并行处理大量数据。与HDFS相似,MapReduce也具有主从架构。

MapReduce作业通常将输入数据集拆分为独立的块,这些任务由地图任务以完全并行的方式进行处理。该框架对地图的输出进行排序,然后将其输入到reduce任务中。通常,作业的输入和输出都存储在文件系统中。

输入和输出,甚至是MapReduce作业中的中间输出,都是<key, value>成对的形式。键和值必须是可序列化的,并且不使用Java序列化程序包,而是具有一个接口,该接口必须实现并且可以有效地序列化,因为数据处理必须从一个节点移动到另一个节点。

MapReduce应用程序中的步骤

在大数据中,您希望将大数据集分解为许多较小的部分,并使用相同的算法并行处理它们。使用HDFS,文件已经被分割成一口大小的片段。MapReduce可帮助您处理所有这些数据。

MapReduce作业很复杂,涉及多个步骤。某些步骤是由Hadoop以默认行为执行的,可以在需要时将其覆盖。以下是在MapReduce中依次执行的必需步骤:

  1. 映射器

    在MapReduce中,Mapper代码应具有逻辑,该逻辑可以独立于其他块数据。映射器逻辑应利用算法中所有可能的并行步骤。在特定的InputFormat类型和必须在其上运行Mapper进程的文件的驱动程序中设置对Mapper的输入。Mapper的输出将是map <key, value>,在Mapper输出中设置的键和值不会保存在HDFS中,而是会在OS空间路径中创建一个中间文件,并且该文件将被读取并进行随机排序。

  2. 随机排序(合并)

    随机排序和排序是Mapper和Reducer之间MapReduce中的中间步骤,由Hadoop处理,可以根据需要覆盖。随机播放过程通过对Mapper输出的键值进行分组来聚合所有Mapper输出,并且该值将附加在值列表中。因此,随机播放输出格式将为map <key, List<list of values>>

  3. 减速器

    Reducer是聚合器过程,将经过随机排序和排序后的数据发送到我们拥有的<key, List<list of values>>Reducer,Reducer将在值列表上进行处理。每个密钥可以发送到不同的Reducer。Reducer可以设置该值,并将其合并到MapReduce作业的最终输出中,并且该值将作为最终输出保存在HDFS中。

MapReduce Stream 程
MapReduce Stream 程

让我们看一下序列图的所有动作通知。这将有助于更好地可视化整个过程。

MapReduce序列图
MapReduce序列图

让我们来看一个上述步骤的例子。考虑一下,我们将一个文件分为两个节点,文件内容为:

  1. file1内容:“ hello world hello moon”
  2. file2内容:“再见世界晚安月亮”

现在,在每个步骤之后,MapReduce的结果如下:

MapReduce步骤输出
MapReduce步骤输出
没有reducer的应用程序称为纯地图作业,当不需要合并map任务的结果集时,这将很有用。

用Java编写MapReduce应用程序

要对HDFS中存储的大数据使用MapReduce,必须提供以下输入:

  • 指定输入/输出位置
  • 通过实现适当的接口和/或抽象类来提供映射并简化功能

Map和Reduce函数必须与Serializable键和值一起使用,因为它们将在不同的节点之间移动。

对于序列化,Hadoop使用以下两个接口:

  1. 可写界面(用于值)

    Writable接口用于序列化和反序列化的值。一些实现的类Writable接口是ArrayWritableBooleanWritableByteWritable等,我们可以创建自己的自定义Writable,可以在MapReduce的使用类。为了创建自定义类,我们必须实现Writable该类并实现以下两种方法:

    void write(DataOutput out):这将对象序列化。
    void readFields(DataInput in):读取 InputStream 并将其转换为对象。

  2. WritableComparable接口(用于密钥)

    WritableComparable用于键,键是从Writable接口继承的,并实现可比较的接口以提供值对象的比较。有些实现是的BooleanWritableBytesWritableByteWritable等创建自定义WritableComparable类,我们必须实现WritableComparable类,并实现以下三种方法:

    void write(DataPutput out):序列化对象
    void readFields(DataInput输入:读取 InputStream 并将其转换为对象
    Int compareTo(Object obj):比较对键进行排序所需的值

将以上输入组合到MapReduce作业中后,可以将其提交给JobTracker

JobTracker和TaskTracker Stream 程

为了执行上面讨论的所有事情,MapReduce具有以下两个守护进程:

  1. JobTracker(主 Stream 程)

    JobTracker的主要功能是资源管理,跟踪资源可用性和任务处理周期。JobTracker识别TaskTracker来执行某些任务,并监视任务的进度和状态。JobTracker是MapReduce Stream 程的单点故障。

  2. TaskTracker(从属进程)

    TaskTracker是从属守护程序进程,它执行JobTracker分配的任务。TaskTracker定期将心跳消息发送到JobTracker,以通知有关可用插槽的信息,并将有关任务的状态发送给JobTracker,并检查是否必须执行任何任务。

投机执行

MapReduce作业分为多个Mapper和Reducer Stream 程以及一些中间任务,因此一个作业可以产生数百或数千个任务,并且某些任务或节点可能需要很长时间才能完成任务。Hadoop监视和检测任务何时运行得比预期的慢,并且如果该节点的执行历史较慢,则它将在另一个节点中启动相同的任务作为备份,这称为推测性执行任务。Hadoop不会尝试修复或诊断节点或进程,因为该进程没有给出错误,但是它很慢,并且由于硬件降级,软件配置错误,网络拥塞等原因会导致速度变慢。

一旦标记了执行缓慢的任务,JobTracker就会在另一个节点上启动该任务,并获取该任务的结果,该结果首先完成并杀死其他任务并记录情况。如果某个节点始终落后,则JobTracker对该节点的优先级会降低。

可以启用或禁用推测性执行,并且默认情况下将其启用,因为它是一个有用的过程。推测执行必须监视每个任务,在某些情况下会影响性能和资源。不建议在执行某些任务的情况下执行推测执行,在这些任务中,特别是reduce的任务由于特定reducer上的数据偏斜而可能获得数百万个值,这比其他任务需要更长的时间,而启动另一个任务也无济于事。

MapReduce的局限性?

  1. 您无法控制地图或缩小的运行顺序。
  2. 为了获得最大的并行度,您需要Maps和Reduces不依赖于同一MapReduce作业中生成的数据(即,两者都应该是无状态的)。
  3. 在所有地图都完成之前,不会进行归约操作。
  4. 一般的假设,Reduce的输出小于Map的输入。
  5. 由于带有索引的数据库将始终比未索引数据上的MapReduce作业快,因此性能可能下降。

学习愉快!

saigon has written 1440 articles

Leave a Reply