Java笔记 ·

Hadoop MapReduce简介

概述

MapReduce作业(job)通常将输入数据集拆分为独立的块,这些块由map任务(map tasks)以完全并行的方式处理。框架对maps的输出(outputs)排序,然后输入到reduce 任务(reduce tasks)。通常,作业的输入和输出都存储在文件系统中。该框架负责调度任务,监控它们并重新执行失败的任务。

通常,计算节点和存储节点是相同的,即MapReduce框架和Hadoop分布式文件系统(请参阅HDFS体系结构指南)在同一组节点上运行。此配置允许框架有效地在已存在数据的节点上调度任务,从而在集群中产生非常高的聚合带宽。

MapReduce框架由一个单独的主(master)ResourceManager,每个集群节点(cluster-node)一个从(slave ) NodeManager和每个应用程序(application)的MRAppMaster组成(参见YARN体系结构指南)。

最低限度,应用程序指明输入/输出位置,并通过实现适当的接口和/或抽象类来提供map和reduce方法。再加上其他作业的参数,就构成了作业配置(job configuration)。然后,Hadoop的 job client 提交作业(jar包/可执行程序等)和配置信息给ResourceManager,后者负责将软件/配置分发给slave,调度任务并监控它们,向作业客户端( job-client)提供状态和诊断信息。

输入与输出

Map/Reduce框架运转在<key, value> 键值对上,也就是说, 框架把作业的输入看为是一组<key, value> 键值对,同样也产出一组 <key, value> 键值对做为作业的输出,这两组键值对的类型可能不同。

框架需要对key和value的类(classes)进行序列化操作, 因此,这些类需要实现 Writable接口。 另外,为了方便框架执行排序操作,key类必须实现 WritableComparable接口。

一个Map/Reduce 作业的输入和输出类型如下所示:

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

Mapper

将输入键值对(key/value pair)映射到一组中间格式的键值对集合。即将键值对通过函数映射成一组新的键值对。

Reducer

Reducer将与一个key关联的一组中间数值集归约(reduce)为一个更小的数值集。即将键值对动key相同的值整合,通过函数映射成新的键值对。

Reducer有3个主要阶段:shuffle、sort和reduce。

Shuffle

Reducer的输入就是Mapper已经排好序的输出。在这个阶段,框架通过HTTP为每个Reducer获得所有Mapper输出中与之相关的分块。

Sort

框架在此阶段按keys(因为不同的映射器可能输出相同的键)对Reducer输入进行分组。

Shuffle和Sort阶段同时发生;

在获取map-outputs时,它们被合并。

Secondary Sort

如果需要中间过程对key的分组规则和reduce前对key的分组规则不同,那么可以通过 JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。再加上 JobConf.setOutputKeyComparatorClass(Class)可用于控制中间过程的key如何被分组,所以结合两者可以实现按值的二次排序。

Reduce

如果需要中间过程对key的分组规则和reduce前对key的分组规则不同,那么可以通过 JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。再加上 JobConf.setOutputKeyComparatorClass(Class)可用于控制中间过程的key如何被分组,所以结合两者可以实现按值的二次排序。

Hadoop文档-0.18

Apache Hadoop 2.8.5

Hadoop 系列(一)基本概念

Hadoop MapReduce

Hadoop官方文档翻译——YARN Architecture(2.7.3)

参与评论