Map Reduce WordCount入门全过程

最近我们team做了一个推荐系统,整个系统分为算法和平台两部分,而算法又分为hive sql算法和map reduce算法,因此,近几个月都在学这些东东,感觉分布式的计算还是蛮强的,hive就不说了,这里把map reduce的入门例子记录一下入门过程。

 

一.编写main方法

 

package com.taobao.aladdin.biz.core.mapreduce.test;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;

/*
 *@author huangdou
 *created on 2011-4-1下午03:20:11
 */
public class WordCount2 {


	public static void main(String[] args) throws Exception {
		//不配置一个入口类会导致底层无法调用setJarByClass方法,运行时ClassNotFound
		JobConf conf = new JobConf(WordCount2.class);	
		//设置map类
		conf.setMapperClass(WordCountMapper.class);
		//设置reduce类
		conf.setReducerClass(WordCountReducer.class);
		//设置输出类型
		conf.setOutputKeyClass(Text.class);
		conf.setOutputValueClass(IntWritable.class);

		//输入参数除最后一个外都是input path,最后一个是output path
		for (int i = 0; i < args.length - 1; i++) {
			FileInputFormat.addInputPath(conf, new Path(args[i]));
		}

		FileOutputFormat.setOutputPath(conf, new Path(args[args.length - 1]));

		JobClient.runJob(conf);
	}
}

 

二.编写Map方法,输入来自文件.

package com.taobao.aladdin.biz.core.mapreduce.test;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;

/*
 *@author huangdou
 *created on 2011-4-1上午10:50:54
 */
public class WordCountMapper extends MapReduceBase implements
		Mapper<LongWritable, Text, Text, IntWritable> {

	private IntWritable one = new IntWritable(1);
	
	@Override
	public void map(LongWritable key, Text value,
			OutputCollector<Text, IntWritable> output, Reporter reporter)
			throws IOException {
		//StringTokenizer 就是一个用来拆字符串的,默认是/t/n/f/r,也可自定义
		StringTokenizer st = new StringTokenizer(value.toString());
		Text text = new Text();
		while (st.hasMoreTokens()) {
			text.set(st.nextToken());
			//把每个单词以1记数
			output.collect(text, one);
		}

	}
}
 

  其实map的输入来源就是input path指定的文件

 

三.编写Reduce方法,输入来自Map,输出即为最终结果

package com.taobao.aladdin.biz.core.mapreduce.test;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;

/*
 *@author huangdou
 *created on 2011-4-1上午10:51:53
 */
public class WordCountReducer extends MapReduceBase implements Reducer<Text,IntWritable,Text,IntWritable>{

	
	@Override
	public void reduce(Text key, Iterator<IntWritable> values,
			OutputCollector<Text, IntWritable> output, Reporter reporter)
			throws IOException {
		Integer sum = 0;
		while (values.hasNext()){
			//map的输出其实会在每一个map中汇总,即同一个map如果出现"word"2次,那么map的输出就是word 2
			//然后在进入reduce前会进行一个排序,即各个map的word统计会排在一起,同key的结果进入同一个reduce
			sum += values.next().get();
		}
		//最终结果
		output.collect(key, new IntWritable(sum));
	}
}

 

 

 

 

四.安装hadoop

    hadoop可以在本地windows装个测试环境,不过是单机的,也可以直接使用公司的集群,至于安装我下1篇再写,这里直接用公司的吧,但要先把文件传上去。rz,选择文件

 

 

 

 

 

五.编译该java文件

    因为编译的时候需要用hadoop下的包,所以这里classpath打一下hadoop的core包,这个core包其实就在你的hadoop安装路径下。        我这里是javac -classpath /home/hadoop/hadoop-0.19.2/hadoop-0.19.2-core.jar -d . *.java      ,编译完后,当前目录会出现一个com包

 

 

 

 

六.打成jar文件

     jar -cvf wc14.jar com/          打包后会出现一个wc.jar文件

 

 

七.运行map reduce

    进入hadoop的bin目录下,运行.

    这里需要说一下,我第一个main方法里写过,最后一个参数是输出路径,而前面的多个参数都是输入路径,因此命令如下:

    ./hadoop jar wc14.jar com.taobao.aladdin.biz.core.mapreduce.test.WordCount2  /group/aladdin/huangdou/huangdou1.txt /group/aladdin/huangdou/huangdou2.txt /group/aladdin/huangdou/huangdou14

 

  这里huangdou1.txt和huangdou2.txt都是input path,而huangdou3为output path,值得注意的是,huangdou3只是一个路径,在它的下面存在一些文件碎片,这个碎片才是最终结果,可以查看一下。

  ./hadoop dfs -cat /group/aladdin/huangdou/huangdou3/part-00000

 

八.最后,如果下次还要运行这个map reduce,需要把原来的huangdou3这个路径干掉,否则会提示输出路径已存在的异常

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值