用 Hadoop 进行分布式并行编程, 第 2 部分程序实例(2)

然后将 JobConf 对象作为参数,调用 JobClient 的 runJob, 开始执行这个计算任务。至于 main 方法中使用的 ToolRunner 是一个运行 MapReduce 任务的辅助工具类,依样画葫芦用之即可。


代码清单 3
public int run(String[] args) throws Exception { JobConf conf = new JobConf(getConf(), WordCount.class); conf.setJobName("wordcount"); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); conf.setMapperClass(MapClass.class); conf.setCombinerClass(Reduce.class); conf.setReducerClass(Reduce.class); conf.setInputPath(new Path(args[0])); conf.setOutputPath(new Path(args[1])); JobClient.runJob(conf); return 0; } public static void main(String[] args) throws Exception { if(args.length != 2){ System.err.println("Usage: WordCount <input path> <output path>"); System.exit(-1); } int res = ToolRunner.run(new Configuration(), new WordCount(), args); System.exit(res); } }  

以上就是 WordCount 程序的全部细节,简单到让人吃惊,您都不敢相信就这么几行代码就可以分布式运行于大规模集群上,并行处理海量数据集。

4. 通过 JobConf 定制计算任务

通过上文所述的 JobConf 对象,程序员可以设定各种参数,定制如何完成一个计算任务。这些参数很多情况下就是一个 java 接口,通过注入这些接口的特定实现,可以定义一个计算任务( job )的全部细节。了解这些参数及其缺省设置,您才能在编写自己的并行计算程序时做到轻车熟路,游刃有余,明白哪些类是需要自己实现的,哪些类用 Hadoop 的缺省实现即可。表一是对 JobConf 对象中可以设置的一些重要参数的总结和说明,表中第一列中的参数在 JobConf 中均会有相应的 get/set 方法,对程序员来说,只有在表中第三列中的缺省值无法满足您的需求时,才需要调用这些 set 方法,设定合适的参数值,实现自己的计算目的。针对表格中第一列中的接口,除了第三列的缺省实现之外,Hadoop 通常还会有一些其它的实现,我在表格第四列中列出了部分,您可以查阅 Hadoop 的 API 文档或源代码获得更详细的信息,在很多的情况下,您都不用实现自己的 Mapper 和 Reducer, 直接使用 Hadoop 自带的一些实现即可。


表一 JobConf 常用可定制参数
参数 作用 缺省值 其它实现
InputFormat 将输入的数据集切割成小数据集 InputSplits, 每一个 InputSplit 将由一个 Mapper 负责处理。此外 InputFormat 中还提供一个 RecordReader 的实现, 将一个 InputSplit 解析成 <key,value> 对提供给 map 函数。   TextInputFormat
(针对文本文件,按行将文本文件切割成 InputSplits, 并用 LineRecordReader 将 InputSplit 解析成 <key,value> 对,key 是行在文件中的位置,value 是文件中的一行)
  SequenceFileInputFormat  
OutputFormat 提供一个 RecordWriter 的实现,负责输出最终结果   TextOutputFormat
(用 LineRecordWriter 将最终结果写成纯文件文件,每个 <key,value> 对一行,key 和 value 之间用 tab 分隔)
  SequenceFileOutputFormat  
OutputKeyClass 输出的最终结果中 key 的类型   LongWritable     OutputValueClass 输出的最终结果中 value 的类型   Text     MapperClass Mapper 类,实现 map 函数,完成输入的 <key,value> 到中间结果的映射   IdentityMapper
(将输入的 <key,value> 原封不动的输出为中间结果)
  LongSumReducer,
LogRegexMapper,
InverseMapper
 
CombinerClass 实现 combine 函数,将中间结果中的重复 key 做合并   null
(不对中间结果中的重复 key 做合并)
    ReducerClass Reducer 类,实现 reduce 函数,对中间结果做合并,形成最终结果   IdentityReducer
(将中间结果直接输出为最终结果)
  AccumulatingReducer, LongSumReducer  
InputPath 设定 job 的输入目录, job 运行时会处理输入目录下的所有文件   null     OutputPath 设定 job 的输出目录,job 的最终结果会写入输出目录下   null     MapOutputKeyClass 设定 map 函数输出的中间结果中 key 的类型   如果用户没有设定的话,使用 OutputKeyClass     MapOutputValueClass 设定 map 函数输出的中间结果中 value 的类型   如果用户没有设定的话,使用 OutputValuesClass     OutputKeyComparator 对结果中的 key 进行排序时的使用的比较器   WritableComparable     PartitionerClass 对中间结果的 key 排序后,用此 Partition 函数将其划分为R份,每份由一个 Reducer 负责处理。   HashPartitioner
(使用 Hash 函数做 partition)
  KeyFieldBasedPartitioner PipesPartitioner  

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

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