【翻译】Apache Hadoop MapReduce

原文:http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

综述

Hadoop MapReduce是一个便于开发并行处理海量数据(TB级)的应用的软件框架,该框架在由普通pc机组成的大规模集群(上千台节点)上实现了可靠性及容错。

一个MapReduce任务(job)通常会将输入数据集分片,这一工作是由map任务完全并行的完成的。框架整理map的运行结果,作为reduce任务的输入。通常数据的输入输出都是在文件系统上完成的。MapReduce框架负责调度、监控及重做失败任务的工作。

通常来讲计算节点和存储节点是一样的,也就是说,MapReduce框架及HDFS运行在同一个节点集合。这种配置使得框架可以在数据已就绪的节点集群内高效的调度任务,这样在集群内获得了 非常大的带宽。

MapReduce框架包含一个资源管理器(ResourceManager ),每个节点上的NodeManager及每个应用上的MRAppMaster。

应用至少要指定输入输出位置,并通过适当的接口实现及抽象类来提供map及reduce的功能。

Hadoop的job-client提交前述任务(这个任务可以是jar,也可以是其他可执行的文件),并配置到资源管理器。资源管理器将软件及配置分发给从机,调度并监控任务,向job-client提供状态及诊断信息。

尽管Hadoop框架是用Java实现的,MapReduce应用不限定使用Java编写。

Hadoop  Streaming使得用户可以创造及运行任意的可执行程序作为mapper或者reducer。

Hadoop Pipes是兼容SWIG的C++ API,用于实现MapReduce应用。

输入输出

MapReduce框架运行在键值对(<key, value>)上,也就是说,MapReduce框架将任务的输入视为一个键值对的集合,产生新的键值对集合作为任务输出。key及value的类需要能够被框架序列化,因此必须实现Hadoop的writable接口(org.apache.hadoop.io )。此外,key类需要实现WritableComparable接口(org.apache.hadoop.io)来促进框架的排序。

一个MapReduce任务的输入输出类型示例:

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

接下来玩例子:

MapReduce工作方式的小栗子:词频统计(wordcount)

 Java 源代码

复制上述代码到文件:

注意!文件夹及后面的jar需要让hdfs用户有7的权限!!!否则后面执行出错。

使用

假设环境变量设置如下(主要添加了后两条,不加会有classNotFound的错误)

编译前述WordCount.java文件并生成jar。

cdh hadoop默认lib目录:

/var/lib/

假设输入输出目录如下

/user/class_example/4_1/wordcount/input

/user/class_example/4_1/wordcount/output

 

在本地生成输入文件

导入到hdfs

(在jar的目录)跑一把前面生成的MapReduce程序的jar

参观一下输出:

 

 

 

 

 

 

 

 

 

 

 

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注