Hadoop的WordCount编写

1 hadoop的wordCount就像学编程时候的helloWord 一样,是编写程序的一个开始。

  

程序可以根据注释加以理解:

/**
* @ClassName: WordCount2 
* @Description: 执行:1 打成jar包  2 上传到hadoop服务器中  3 利用hadoop命令执行(输入和输出参数用文件夹)
* 	如: bin/hadoop jar  WordCount1.jar   /user/root/word_count_in/ /user/root/word_count_out 
* @author:root
* @date 2014年11月24日 下午4:52:30 
*
 */
public class WordCount2 {

	/** 
        
	 *   Mapper<Object, Text, Text, IntWritable> 四个参数分别为 maper的输入key类型,输入value的类型,输出key的类型,输出value的类型
         *   mapper输出的key,value类型就是reducer输入的key,value类型,默认mapper输入key为行号,value为一行的字符串
         *   reducer将mapper输出按照key分组,相同的key数据列表放到同一个列表中,一起传递给reducer处理。
	 * 1 参数类型根据TextInputFormat类来定的,输入格式化还有其他类:如  http://username2.iteye.com/blog/2159836
	 *  map[这里读入输入文件内容 以" \t\n\r\f" 进行分割
	 */
	public static class TokenizerMapper extends
			Mapper<Object, Text, Text, IntWritable> {

		private final static IntWritable one = new IntWritable(1);
		private Text word = new Text();

		public void map(Object key, Text value, Context context)
				throws IOException, InterruptedException {
			StringTokenizer itr = new StringTokenizer(value.toString());
			while (itr.hasMoreTokens()) {
				word.set(itr.nextToken());
				context.write(word, one);
			}
		}
	}

	/**
	 * IntSumReducer 继承自 Reducer<Text,IntWritable,Text,IntWritable>
	 * [不管几个Map,都只有一个Reduce,这是一个汇总]  
	 * 这里的key为Mapper设置的word[每一个key/value都会有一次reduce]
	 * 当循环结束后,最后的确context就是最后的结果.
	 */
	public static class IntSumReducer extends
			Reducer<Text, IntWritable, Text, IntWritable> {
		private IntWritable result = new IntWritable();

		public void reduce(Text key, Iterable<IntWritable> values,
				Context context) throws IOException, InterruptedException {
			int sum = 0;
			for (IntWritable val : values) {
				sum += val.get();
			}
		 
			result.set(sum);
			context.write(key, result);
		}
	}
	/**
	* @Title: main 
	* 执行命令: 
	*   命令   jar包   输入    输出 	
	*   bin/hadoop jar  WordCount1.jar   /user/root/word_count_in/ /user/root/word_count_out
	* @return void    返回类型 
	* @throws 
	 */
	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		String[] otherArgs = new GenericOptionsParser(conf, args)
				.getRemainingArgs();
		/**
		 * 这里必须有输入/输出
		 */
		if (otherArgs.length != 2) {
			System.err.println("Usage: wordcount <in> <out>");
			System.exit(2);
		}
		//构建mapreduce任务也叫mapreduce作业也叫做一个mapreduce的job
		Job job = new Job(conf, "word count");
		job.setJarByClass(WordCount2.class);// 主类
		job.setInputFormatClass( TextInputFormat.class);//文件输入的处理格式 
		job.setOutputFormatClass(TextOutputFormat.class);//文件输出的处理格式 
		
		job.setMapperClass(TokenizerMapper.class);// mapper
		job.setCombinerClass(IntSumReducer.class);// 作业合成类,可以提高运行效率
		job.setReducerClass(IntSumReducer.class);// reducer
		
		job.setOutputKeyClass(Text.class);// 设置作业输出数据的关键类
		job.setOutputValueClass(IntWritable.class);// 设置作业输出值类
		
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));// 输入文件路径
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));// 输出文件路径
		
		System.exit(job.waitForCompletion(true) ? 0 : 1);// 等待完成退出.
	}
}

  

猜你喜欢

转载自username2.iteye.com/blog/2159964