MAPREDUCE使用(整理)

来源:互联网 发布:php开源在线教育系统 编辑:程序博客网 时间:2024/06/07 04:15

copy by: czbk paper

mapreducehadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序。

import java.io.IOException;import java.util.HashMap;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;/** * KEYIN: 默认情况下,是mr框架所读到的一行文本的起始偏移量,Long, * 但是在hadoop中有自己的更精简的序列化接口,所以不直接用Long,而用LongWritable *  * VALUEIN:默认情况下,是mr框架所读到的一行文本的内容,String,同上,用Text *  * KEYOUT:是用户自定义逻辑处理完成之后输出数据中的key,在此处是单词,String,同上,用Text * VALUEOUT:是用户自定义逻辑处理完成之后输出数据中的value,在此处是单词次数,Integer,同上,用IntWritable *  * @author * */public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{/** * map阶段的业务逻辑就写在自定义的map()方法中 * maptask会对每一行输入数据调用一次我们自定义的map()方法 */@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//将maptask传给我们的文本内容先转换成StringString line = value.toString();//根据空格将这一行切分成单词String[] words = line.split(" ");//将单词输出为<单词,1>for(String word:words){//将单词作为key,将次数1作为value,以便于后续的数据分发,可以根据单词分发,以便于相同单词会到相同的reduce taskcontext.write(new Text(word), new IntWritable(1));}}}

import java.io.IOException;import java.util.Iterator;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;/** * KEYIN, VALUEIN 对应  mapper输出的KEYOUT,VALUEOUT类型对应 *  * KEYOUT, VALUEOUT 是自定义reduce逻辑处理结果的输出数据类型 * KEYOUT是单词 * VLAUEOUT是总次数 * @author * */public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{/** * <angelababy,1><angelababy,1><angelababy,1><angelababy,1><angelababy,1> * <hello,1><hello,1><hello,1><hello,1><hello,1><hello,1> * <banana,1><banana,1><banana,1><banana,1><banana,1><banana,1> * 入参key,是一组相同单词kv对的key */@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int count=0;/*Iterator<IntWritable> iterator = values.iterator();while(iterator.hasNext()){count += iterator.next().get();}*/for(IntWritable value:values){count += value.get();}context.write(key, new IntWritable(count));}}

import java.io.IOException;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;public class WordcountCombiner extends Reducer<Text, IntWritable, Text, IntWritable>{@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int count=0;for(IntWritable v: values){count += v.get();}context.write(key, new IntWritable(count));}}

import java.io.IOException;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.CombineTextInputFormat;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;/** * 相当于一个yarn集群的客户端 * 需要在此封装我们的mr程序的相关运行参数,指定jar包 * 最后提交给yarn * @author * */public class WordcountDriver {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();//是否运行为本地模式,就是看这个参数值是否为local,默认就是local/*conf.set("mapreduce.framework.name", "local");*///本地模式运行mr程序时,输入输出的数据可以在本地,也可以在hdfs上//到底在哪里,就看以下两行配置你用哪行,默认就是file:////*conf.set("fs.defaultFS", "hdfs://mini1:9000/");*//*conf.set("fs.defaultFS", "file:///");*///运行集群模式,就是把程序提交到yarn中去运行//要想运行为集群模式,以下3个参数要指定为集群上的值/*conf.set("mapreduce.framework.name", "yarn");conf.set("yarn.resourcemanager.hostname", "mini1");conf.set("fs.defaultFS", "hdfs://mini1:9000/");*/Job job = Job.getInstance(conf);//job.setJar("c:/wc.jar");//指定本程序的jar包所在的本地路径job.setJarByClass(WordcountDriver.class);//指定本业务job要使用的mapper/Reducer业务类job.setMapperClass(WordcountMapper.class);job.setReducerClass(WordcountReducer.class);//指定mapper输出数据的kv类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);//指定最终输出的数据的kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//指定需要使用combiner,以及用哪个类作为combiner的逻辑/*job.setCombinerClass(WordcountCombiner.class);*/job.setCombinerClass(WordcountReducer.class);//如果不设置InputFormat,它默认用的是TextInputformat.classjob.setInputFormatClass(CombineTextInputFormat.class);CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);CombineTextInputFormat.setMinInputSplitSize(job, 2097152);//指定job的输入原始文件所在目录FileInputFormat.setInputPaths(job, new Path(args[0]));//指定job的输出结果所在目录FileOutputFormat.setOutputPath(job, new Path(args[1]));//将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn去运行/*job.submit();*/boolean res = job.waitForCompletion(true);System.exit(res?0:1);}}


1. 将程序打包

2. 准备输入数据

hdfs上创建输入数据文件夹

hadoop   fs  mkdir  -p  /wordcount/input

words.txt上传到hdfs

hadoop  fs  –put  /home/hadoop/words.txt  /wordcount/input

 

3. 将程序jar包上传到集群的任意一台服务器上

 

4. 使用命令启动执行wordcount程序jar

$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

5. 查看执行结果

$ hadoop fs –cat /wordcount/out/part*




原创粉丝点击