hadoop的第一个程序WordCount

来源:互联网 发布:中山大学软件学院 编辑:程序博客网 时间:2024/04/29 23:53

伪代码分析:

执行步骤:

 1. map任务处理

1.1读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。

1.2写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

1.3对输出的key、value进行分区。

1.4对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。

1.5(可选)分组后的数据进行归约。

2.reduce任务处理

2.1对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。

2.2对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

2.3把reduce的输出保存到文件中。

例子:实现WordCount

WCMapper继承Mapper

package com.herers.rm;import java.io.IOException;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {//接收数据V1String line = value.toString();//切分数据String[] words = line.split(" ");//循环for(String w:words){//出现一次,记一个1,输出context.write(new Text(w), new LongWritable(1));}}}
WCReducer继承Reducer

package com.herers.rm;import java.io.IOException;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {@Overrideprotected void reduce(Text k2, Iterable<LongWritable> v2s,Context context)throws IOException, InterruptedException {//接收数据Text k3 = k2;//定义一个计算器long counter = 0;for(LongWritable i:v2s){counter += i.get();}//输出context.write(k2, new LongWritable(counter));}}

WordCount主函数类:

package com.herers.rm;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;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;/** *  * @author vinsuan *1.根据具体的业务逻辑,确定输入输出数据的样式(根据结果) *2.自定义一个类,这个类继承org.apache.hadoop.mapreduce.Mapper,重写mapper方法,在其中实现具体的业务逻辑,在将新的key-value输出 *3.自定义一个类,这个类继承org.apache.hadoop.mapreduce.Reducer,重写reducer方法,在其中实现具体的业务逻辑,在将新的key-value输出 *4.将自定义的mapper和reducer对象组装起来 */public class WordCount {public static void main(String[] args) throws Exception {//构建Job对象Job job = Job.getInstance(new Configuration());//注意:main方法所在的类job.setJarByClass(WordCount.class);//设置Mapper相关属性job.setMapperClass(WCMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);FileInputFormat.setInputPaths(job, new Path("/words.text"));//设置reduce相关属相job.setReducerClass(WCReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);FileOutputFormat.setOutputPath(job, new Path("/wcount0307"));job.waitForCompletion(true);}}


执行分两种情况:

第一种:

1.将程序打包成Runnerable jar file,并指定函数执行入口

2.上传至linux

3.用java -jar jar路径

第二种:

1.将程序打包成 jar file,并指定函数执行入口

2.上传至linux

3.hadoop jar <jar在linux的路径> <main方法所在的类的全类名>

注意:

1.编程时,注意导包错误。




0 0
原创粉丝点击