WordCount程序详解

  1. 输入:hellohadoop
  1. helloword

下面是map函数

  1. importjava.io.IOException;
  2. importjava.util.StringTokenizer;
  3. importorg.apache.hadoop.io.IntWritable;
  4. importorg.apache.hadoop.io.Text;
  5. importorg.apache.hadoop.mapreduce.Mapper;
  6. publicclassMapperClassextendsMapper<Object,Text,Text,IntWritable>{//四个参数的含义,前两个输入,后两个输出
  7. ,类型需一致
  8. publicTextkeytext=newText("text");//定义一个text对象,用来充当中间变量,存储词
  9. publicIntWritableintvalue=newIntWritable(1);//词的个数,刚开始都为1,也可以不定义,直接context.write(keytext,1);
  10. @Override
  11. protectedvoidmap(Objectkey,Textvalue,
  12. Contextcontext)//key即行偏移量,作用不大,主要是value,根据value进行拆分
  13. throwsIOException,InterruptedException{
  14. //获取值
  15. Stringstr=value.toString();
  16. //分隔
  17. StringTokenizerstringTokenizer=newStringTokenizer(str);//StringTokenizer根据空格等分隔字符串到stringTokenizer
  18. while(stringTokenizer.hasMoreElements()){//返回是否还有分隔符,判断是否还有单词
  19. keytext.set(stringTokenizer.nextToken());//nextToken():返回从当前位置到下一个分隔符的字符串。
  20. context.write(keytext,intvalue);//context.write("hello",1)
  21. }
  22. }
  23. }

reduce函数

  1. importjava.io.IOException;
  2. importjava.util.Iterator;
  3. importorg.apache.hadoop.io.IntWritable;
  4. importorg.apache.hadoop.io.Text;
  5. importorg.apache.hadoop.mapreduce.Reducer;
  6. publicclassReducerClassextendsReducer<Text,IntWritable,Text,IntWritable>{//前两个输入:例:(hello,1),后两个输出(hello,2)
  7. publicIntWritableintValue=newIntWritable(0);
  8. @Override
  9. protectedvoidreduce(Textkey,Iterable<IntWritable>values,//这里声明了一个实现Iterator接口的匿名内部类,并返回了内部类的实例
  10. Contextcontext)//它用来与MapReduce系统进行通信,如把map的结果传给reduce处理
  11. throwsIOException,InterruptedException{
  12. //step1
  13. intsum=0;
  14. Iterator<IntWritable>itr=values.iterator();//迭代器,访问容器中的元素,为容器而生
  15. while(itr.hasNext()){
  16. sum+=itr.next().get();//如果有,则加入迭代器中的个数
  17. }
  18. intValue.set(sum);//对于hello,sum是2
  19. context.write(key,intValue);//hello,2
  20. }
  21. }

主函数:

  1. importorg.apache.hadoop.conf.Configuration;
  2. importorg.apache.hadoop.fs.Path;
  3. importorg.apache.hadoop.io.IntWritable;
  4. importorg.apache.hadoop.io.Text;
  5. importorg.apache.hadoop.mapreduce.Job;
  6. importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  7. importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  8. importorg.apache.hadoop.util.GenericOptionsParser;
  9. publicclassWordCount{
  10. publicstaticvoidmain(String[]args)throwsException{
  11. Configurationconf=newConfiguration();//指定作业执行规范
  12. String[]otherArgs=newGenericOptionsParser(conf,args).getRemainingArgs();
  13. if(otherArgs.length!=2)
  14. {
  15. System.err.println("Usage:wordcount<in><out>");
  16. System.exit(2);
  17. }
  18. Jobjob=newJob(conf,"wordcount");//指定job名称,及运行对象
  19. job.setJarByClass(WordCount.class);
  20. job.setMapperClass(MapperClass.class);//指定map函数
  21. job.setCombinerClass(ReducerClass.class);//是否需要conbiner整合
  22. job.setReducerClass(ReducerClass.class);//指定reduce函数
  23. job.setOutputKeyClass(Text.class);//输出key格式
  24. job.setOutputValueClass(IntWritable.class);//输出value格式
  25. FileInputFormat.addInputPath(job,newPath(otherArgs[0]));//处理文件路径
  26. FileOutputFormat.setOutputPath(job,newPath(otherArgs[1]));//结果输出路径
  27. System.exit(job.waitForCompletion(true)?0:1);
  28. }
  29. }


小结:Hadoop程序处理流程

(1)将文件拆分为splits,并由MapReduce框架自动完成分割,将每一个split分割为<key,value>对

(2)每一<key,value>调用一次map函数,处理后生产新的<key,value>对,由Context传递给reduce处理

(3)Mapper对<key,value>对进行按key值进行排序,并执行Combine过程,将key值相同的value进行合并。最后得到Mapper的最终输出结果

(4)reduce处理,处理后将新的<key,value>对输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值