首页 > 其他 > 详细

MapReduce编程

时间:2014-02-15 08:55:52      阅读:409      评论:0      收藏:0      [点我收藏+]
MapReduce程序不能主动执行,而只能在MapReduce集群的各个结点上由服务器程序(如TaskTracker)调用执行,编写MapReduce程序的主要工作就是实现与调用程序的各种接口。Hadoop中的MapReduce程序需要提供几个接口的实现,下面介绍。不过,为了简化MapReduce编程,Hadoop也提供了许多常用的接口实现,MapReduce程序可以直接拿来使用。下面基于Hadoop新版MapReduce API介绍。

** 输入接口 -- Java抽象类 org.apache.hadoop.mapreduce.InputFormat<K, V>

MapReduce框架总是从输入接口读取Key-Value对。在相应的Java抽象类中定义了两个抽象方法分别用于获取输入分片和从输入分片读取Key-Value对的读取器。

* List<InputSplit> getSplits(JobContext context)

该方法根据作业配置返回一个输入分片列表。作业配置可以从输入参数context获得。由于MapReduce框架为每个输入分片生成一个Map任务,因此可以通过该方法控制MapReduce作业的Map任务数。

InputSplit用于封装输入分片的信息,该抽象类只定义了两个抽象方法:getLength方法,返回输入分片的字节数,MapReduce框架可以据此对输入分片排序;getLocations方法,返回输入分片所在的主机,MapReduce框架可以据此在输入分片所在的主机上执行Map任务,以尽可能让Map任务从本地读取数据。通常输入分片还会有其他信息,可以定义InputSplit的子类封装这些信息。

* RecordReader<K,V> createRecordReader(InputSplit split, TaskAttemptContext context)

该方法返回从指定输入分片读取Key-Value对的读取器。返回的读取器需要实现在抽象类RecordReader<K,V>中定义的几个抽象方法:initialize,初始化读取器;nextKeyValue,准备取下一个Key-Value对;getCurrentKey,取当前Key-Value对的Key;getCurrentValue,取当前Key-Value对的Value;getProgress,获取输入分片的读取进度;close,关闭读取器。这些方法将依次被MapReduce框架调用。  

** 输出接口 -- Java抽象类 org.apache.hadoop.mapreduce.OutputFormat<K, V>

输出接口被MapReduce框架用来输出MapReduce作业最终的Key-Value对,在相应的Java抽象类中定义了下面三个抽象方法。

* void checkOutputSpecs(JobContext context)

该方法用于在实际输出Key-Value对之前作一些常规性检查,如检查输出位置是否有效,同时还可以做一些必要的输出准备工作。如果检查过程中出现异常,将导致任务失败或重做。

* RecordWriter<K, V> getRecordWriter(TaskAttemptContext context)

该方法返回用来输出最终Key-Value对的输出器。通常不同的任务要使用独立的输出器,可以根据传入的参数context设定输出器的属性。抽象类RecordWriter<K,V>只定义了两个抽象方法:write,输出Key-Value对;close,关闭输出器。

* OutputCommitter getOutputCommitter(TaskAttemptContext context)

该方法返回一个OutputCommitter类型的对象,该对象被MapReduce框架用来提交MapReduce作业的结果。通过实现或覆盖OutputCommitter中的方法可以自定义结果提交方式:setupJob,在MapReduce作业准备输出最终结果前被调用,负责准备作业的输出环境;abortJob,在MapReduce作业失败返回之前被调用,负责清理作业在失败之前产生的输出结果;commitJob,在MapReduce作业正常返回之前被调用,负责提交作业的输出结果;setupTask,在任务准备输出最终结果前被调用,负责准备任务的输出环境;abortTask,在任务失败返回之前被调用,负责清理任务在失败之前产生的输出结果;needsTaskCommit,指示是否需要调用commitTask方法;commitTask,若needsTaskCommit返回true,则在任务正常返回之前被调用,负责提交任务的输出结果。

** Mapper -- Java抽象类 org.apache.hadoop.mapreduce.Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>

Mapper被MapReduce框架用来将从输入接口读取的Key-Value对映射为新的Key-Value对,以便下一步按Key分组和分发。通过覆盖相应Java抽象类中的三个方法可以自定义映射方式。

* void setup(Context context)

该方法在Map任务开始后立即被调用。可以在该方法中做一些必要的准备工作。

* void map(KEYIN key, VALUEIN value, Context context)

该方法是Mapper的关键,从输入分片读取的每一个Key-Value对被传递到该方法作映射处理,每一个输入的Key-Value对将被映射成零个或多个新的Key-Value对,新的Key-Value被送到context,由MapReduce框架收集并做后续分组和分发。

* void cleanup(Context context)

该方法在映射完输入分片的所有Key-Value对后被调用。可以在该方法中做一些必要的清理工作。

** Reducer -- Java抽象类 org.apache.hadoop.mapreduce.Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>

Reducer被MapReduce框架用来对来自Map任务的各个Key-Value对分组作规约处理。通过覆盖相应Java抽象类中的三个方法可以自定义规约方式。

* void setup(Context context)

该方法在Reduce任务开始后立即被调用。可以在该方法中做一些必要的准备工作。

* void reduce(KEYIN key, Iterable<VALUEIN> values, Context context)

该方法是Reducer的关键,来自Map任务的各个Key-Value对分组被传递到该方法作规约处理。规约过程中可能产生新的Key-Value对,这些Key-Value对将作为最终的Key-Value对被送到context,由MapReduce框架转送到输出接口。

* void cleanup(Context context)

该方法在对分发到Reduce任务的所有Key-Value对分组完成了规约处理后被调用。可以在该方法中做一些必要的清理工作。

MapReduce编程

原文:http://blog.csdn.net/wyc09/article/details/19202575

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!