现在的位置: 首页 > 综合 > 正文

基础MapReduce程序骨架

2013年09月07日 ⁄ 综合 ⁄ 共 3014字 ⁄ 字号 评论关闭
/***************************************************
 * MapReduce Basic Template
 * Author: jokes000
 * Date: 2011-12-14
 * Version: 1.0.0
 **************************************************/

public class MapReduceTemplate extends Configured implements Tool {
	
	public static class MapClass extends Mapper<Object,Object,Object,Object> {
		
		// Map Method
		public void map(KEYIN key, VALUEIN value, Mapper.Context context) {
			
		}
	}
	
	public static class Reduce extends Reducer<Object,Object,Object,Object> {
		
		// Reduce Method
		public void reduce(KEYIN key, Iterable<VALUEIN> values, Reducer.Context context) {
			
		}
	}
	
	// run Method
	public int run(String[] args) throws Exception {
		// Create and Run the Job
		Job job = new Job();
		job.setJarByClass(MyJob.class);
		
		FileInputFormat.addInputPath(job, new Path(arg0[0]));
		FileOutputFormat.setOutputPath(job, new Path(arg0[1]));
		
		job.setMapperClass(MapClass.class);
		job.setReducerClass(Reduce.class);
		job.setInputFormatClass(MyInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		System.exit(job.waitForCompletion(true) ? 0 : 1);
		return 0;
	}
	
	public static void main(String[] args) throws Exception {
		// 
	}
}

Mapper、Reducer在Job执行期间被多个节点clone以及执行,而剩下的Job Class值在客户端上执行。

除去Mapper和Reducer之后,我们程序的骨架为:

/***************************************************
 * MapReduce Basic Template
 * Author: jokes000
 * Date: 2011-12-14
 * Version: 1.0.0
 **************************************************/

public class MapReduceTemplate extends Configured implements Tool {
	
	// run Method
	public int run(String[] args) throws Exception {
		// Create and Run the Job
		Job job = new Job();
		job.setJarByClass(MyJob.class);
		
		FileInputFormat.addInputPath(job, new Path(arg0[0]));
		FileOutputFormat.setOutputPath(job, new Path(arg0[1]));
		
		job.setMapperClass(MapClass.class);
		job.setReducerClass(Reduce.class);
		job.setInputFormatClass(MyInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		System.exit(job.waitForCompletion(true) ? 0 : 1);
		return 0;
	}
	
	public static void main(String[] args) throws Exception {
		// 
	}
}

这个骨架的核心是run()函数,被成为程序的driver,driver实例化、配置一个Job实体,并使其运行。

Job class会和JobTracker通信使其在集群中执行MapReduce Job。

run()函数中的基础步骤为:

1.创建一个新的Job实例;

2.设置实例运行的主类;

3.设置程序输入输出位置;

4.设置Mapper、Reducer类

5.设置Input、OutputFormat,设置OutputKey、Value类

6.执行Job

Job变量有许多变量,当用户从命令行执行一个Hadoop Job时,他可能想传入一些额外的参数来改变Job的配置。

于是Hadoop提供Configured和Tool类来支持这些参数的识别(具体识别的类为GenericOptionsParser)。

例如:

标准运行命令:bin/hadoop jar MyJob.jar MyJob input/cite77_99.txt output

但是此时我们只想看Mapper的输出(用来Debug),这是我们可以添加这些参数

bin/haoop jar MyJob.jar MyJob -D maped.reduce.tasks=0 input/cite75_99.txt output

GenericOptionsParser支持以下的选项:

-conf <configuration file>         specify an application configuration file

-D <property=value>                use value for given property

-fs <local|namenode:port>      specify a namenode

-jt <local|jobtracker:port>         specify a job tracker

-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster

-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.

-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

抱歉!评论已关闭.