Hadoop对Map执行框架的实现(客户端)

在这篇:Hadoop中Map任务的执行框架中(见  ),我花了大力气把Map任务在TaskTracker节点上的具体执行过程抽象出了框架,这个框架主要涉及到这些组件:map任务执行器Mapper、map任务执行上下文环境Context、任务报告器TaskReporter,而实际上,Context由两个子组件构成:记录读取器RecordReader、记录写入器RecordWriter。所以我将在接下来一系列文章将主要围绕这三大组件来详细阐述Hadoop是如何具体的来Map任务的执行框架,即Map任务的执行过程。这个过程的实现即涉及到客户端对这些操作是如何实现的,有涉及到TaskTracker端是如何这些操作进行有序调度的,而本文则主要纠结于客户端的配置细节。

对于任意一个Map任务的执行,它都首先需要用户在提交作业的时候对Map操作进行相应的设置,这些配置包括:map操作的输入数据来源、如何读取这些数据并组织成map操作的输入记录、map操作、如何对map的输出进行合并、reduce的工作数量等。当然,这些配置信息可以通过Job来配置,也可以通过当前MapReduce的配置文件mapred-site.xml来配置下面就来看看与之相关的类吧!

Hadoop对Map执行框架的实现(客户端)

先要必须说明的是我只在Job中列举了与map操作设置相关的方法,现在来分别介绍这些配置的作用:

1.setNumReduceTasks()

它用来设置作业在reduce阶段被分为几个reduce任务来完成,这个值决定了每一个map任务最后的输出结果被分为多少个部分,而每一个部分将交由不同的ruduce来处理。对应配置文件mapred-site.xml中的mapred.reduces.tasks项。

2.setInputFormatClass()

它用来设置如何读取map的输入数据,它包含两个方法,一个是getSplits(),另一个createRecordRader(),其中getSplits方法用来对map任务的输入数据进行切分,每一个输入数据切片都将对应一个map任务,也就是说它决定了这个作业将被分成几个map任务来完成;createRecordRader方法用来构造一个RecordReader,这个RecordReader就是上面提到的Map任务执行框架中的记录读取器——读取一个输入数据切片,并把这些数据构造成若干个key-value。对于map任务的输入数据进行切分这个操作一定是在客户端完成,并且在客户端提交作业之前(这一点的详细介绍我在前面的博文中已经详细的提高过了)。对应配置文件mapred-site.xml中的mapreduce.inputformat.class项。

3.setMapperClass()

map任务的实际操作类,它在run()方法中不断地从Contex中的RecordReader处读取一个key-value,然后对这个key-value对进行用户自定义的处理,处理结果会是一个新的key-value,然后再将这个新的key-value保存到Contex中的RecordWriter中,一直重复这个操作,直到Contex的RecordReader中再也没有key-value。对应配置文件mapred-site.xml中的mapreduce.map.class项。

4.setCombineClass()

它被用来设置对map的输出结果如何进行合并,其实map操作的输出也是key-value,这个合并操作一般是在Contex的RecordWriter中完成。从这个方法我们可以看出,合并类需要继承Reducer,它实际上可以看作是reduce操作的一个预处理,在map阶段进行数据的合并主要有两个目的:一是合并map操作的输出可以减少存储空间,同时也减轻了后面reduce的工作量;而是在map操作合并时,它的key-value数据都在内存中,这样做要比交给后来的reduce任务做要方便、快速的多。对应配置文件mapred-site.xml中的mapreduce.combine.class项。

5.setPartitionerClass()

它被用来设置对map操作结果中的每一个key-value进行划分,即应该把这个key-value交由那个reduce来处理,因此对于它的唯一的一个有效方法getPartition(K,V,int)中的int入参指的就是作业的reduce数量。对应配置文件mapred-site.xml中的mapreduce.partitioner.class项。

6.setMapOutputKeyClass()/ setMapOutputValueClass()

它们被用来指定map任务的结果输出key、value类型,它们应该和合并类的输入key-value类型保持一致。分别对应配置文件mapred-site.xml中的mapred.mapoutput.key.class项和mapred.mapoutput.value.class项。

7.setSortComparatorClass()

它被用来设置如何对map操作结果的key-value集合进行排序,这个排序一般以key为主。这里有一个问题,这个排序是在合并之前进行的呢,还是在合并之后进行的呢,或者在合并前后都进行呢?这个问题,我将在TaskTracker端进行分析。对应配置文件mapred-site.xml中的mapred.output.key.comparator.class项。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8ef5cac42632017c9dd702dce69f7ed6.html