MapReduce 单词统计

                                                                       使用hadoop2.7.4

1,首先准备数据,在网上随便抄了一段文章

有一天,
一个外来的僧人要到对面村庄去,
临行前村民反复叮嘱他说:
路途中如若看到路标被风刮倒或被掩埋,
要重新树立起来,以免后面的人迷失方向。
僧人刚上路时,
牢牢记着村民嘱咐,
丝毫不敢马虎,
只要看到有路牌倒地或有歪斜就马上扶好,
深怕不牢固有时还用脚踹踹四周的沙土。
但当走了一段路后,
僧人就揣摩着距离目的地不会太远了,
而且一路上风平浪静,
根本没有村民们说得那样玄乎,
况且,
自己只走一次,
路标对自己也没有什么意义了。
有了这种想法后,他便只管前行,
遇到倒地的路标,
也视而不见。
正应了一句老话:
天有不测风云,
人有旦夕祸福。
没想到刚刚还晴空万里,
但突然间就风沙骤起。
前方倒地的路标被风刮走大部分,
致使僧人不敢贸然前行,
他便想着原路返回,
日后再做打算。
但由于他刚才没有往回走的思想淮备,
加上萌发私心,
没有按照村民吩咐行事,
回去的路也被他堵死。
结果他前进不能,
后退不得,
在茫茫沙海中转悠了半天,
最后筋疲力尽,
被困死沙漠。
现实生活中又何尝不是如此呢?
当我们只图自己方便,
没有认真替别人考虑时,
回头时却发现反而自己没有了退路。
可见,
方便自己的同时,
又时刻不忘想着别人的人,
才能一生顺遂,
前进路上畅通无阻。

2,在eclipse创建maven项目,导入依赖

<dependencies>
   <dependency>
       <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.4</version>
        </dependency>
        <dependency>
        	<groupId>junit</groupId>
        	<artifactId>junit</artifactId>
        	<version>4.10</version>
        </dependency>
  </dependencies>

3,编写map端(需要继承Mapper类,重写map方法)

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MyMap extends Mapper<LongWritable, Text, Text, IntWritable> {
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
        //转成String类型
		String line = value.toString();
        //把每行的字段拆成一个个字符在转成Text类型,每个单词统计为一个
		for (int i = 0; i < line.length(); i++) {
             context.write(new Text(line.charAt(i)+""), new IntWritable(1));
		}
	}
}

4,编写reduce端

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MyReduce  extends Reducer<Text, IntWritable, Text, IntWritable>{
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
               //首先创建一个统计变量为0
	           int count=0;
               //遍历value,把每个值相加给count
	           for (IntWritable i : values) {
				    count=count+i.get();
				}
             //把统计好的count写入提交
    	context.write(key, new IntWritable(count));
	}
}

5.编写执行job类

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class APP {
public static void main(String[] args) throws Exception {
    判断给出的参数必须的2个,如果不是直接退出
	if(args.length<2) {
		System.out.println("your param error");
	System.exit(0);	
	}
	 //创建Configuration对象,来设置属性给他
	Configuration conf=new Configuration();
     //利用反射输入configuration对象来创建Job对象
	Job job=Job.getInstance(conf);
    //设置作业名
	job.setJobName("world count");
	
    //设置搜索jar包的类
	job.setJarByClass(APP.class);
	
    //添加输入路径,可多个
	FileInputFormat.addInputPath(job, new Path(args[0]));
	//设置输出路径
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
	//设置输出类型的key
    job.setOutputKeyClass(Text.class);
    //设置输入类型的value
    job.setOutputValueClass(IntWritable.class);
    
    //设置Map类
    job.setMapperClass(MyMap.class);
    //设置reduce类
    job.setReducerClass(MyReduce.class);
    
    //等待提交
    System.exit(job.waitForCompletion(true) ? 0:1);
}
}

6,点击项目右键选择run里面有一个maven install 进行打包

7,把上图打包后的jar包放到你的集群中

8,开启hadoop (start-all.sh)

9,把之前的数据上传到hdfs上(hdfs dfs -put data.txt /user/had/hadoop/)

10,找到你jar包的位置进行如下操作

hadoop jar myMapReduce_day01-0.0.1-SNAPSHOT.jar com.zxz.wc.APP /user/had/hadoop/data.txt hadoop/out2/

hadoop jar (hadoop执行jar包命令)
myMapReduce_day01-0.0.1-SNAPSHOT.jar(刚才打包的jar包)
com.zxz.wc.APP(job类的完整类名)
/user/had/hadoop/data.txt(输入路径)
hadoop/out2/(输出路径)

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值