设为首页 收藏本站
查看: 1991|回复: 0

[经验分享] Hadoop示例程序WordCount运行及详解

[复制链接]

尚未签到

发表于 2018-10-31 12:12:39 | 显示全部楼层 |阅读模式

  最近在学习云计算,研究Haddop框架,费了一整天时间将Hadoop在Linux下完全运行起来,看到官方的map-reduce的demo程序WordCount,仔细研究了一下,算做入门了。
  运行方法:
  假设:

  •   /home/cq/wordcount/input - 是 HDFS 中的输入路径
  •   /home/cq/wordcount/output - 是 HDFS 中的输出路径
  用示例文本文件做为输入:
  $ bin/hadoop fs -ls /home/cq/wordcount/input/
  /home/cq /wordcount/input/file01
  /home/cq /wordcount/input/file02
  $ bin/hadoop fs -cat /home/cq/wordcount/input/file01
  Hello World Bye World
  $ bin/hadoop dfs -cat /home/cq/wordcount/input/file02
  Hello Hadoop Goodbye Hadoop
  运行应用程序:
  $ bin/hadoop jar /*/WordCount  /home/cq/wordcount/input /home/cq/wordcount/output
  输出是:
  $ bin/hadoop dfs -cat /home/cq/wordcount/output/part-00000
  Bye 1
  Goodbye 1
  Hadoop 2
  Hello 2
  World 2
  详解:
  其实WordCount并不难,只是一下子接触到了很多的API,有一些陌生,还有就是很传统的开发相比,map-reduce确实是一种新的编程理 念,为了让各位新手少走弯路,我将WordCount中的很多API都做了注释,其实这些方法搞明白了以后程序就很简单了,无非就是将一句话分词,先用 map处理再用reduce处理,最后再main函数中设置一些信息,然后run(),程序就结束了。好了,不废话,直接上代码:
Java代码

  •   package  com.felix;

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

  •   import  org.apache.hadoop.fs.Path;
  •   import  org.apache.hadoop.io.IntWritable;
  •   import  org.apache.hadoop.io.LongWritable;
  •   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;
  •   import  org.apache.hadoop.mapred.MapReduceBase;
  •   import  org.apache.hadoop.mapred.Mapper;
  •   import  org.apache.hadoop.mapred.OutputCollector;
  •   import  org.apache.hadoop.mapred.Reducer;
  •   import  org.apache.hadoop.mapred.Reporter;
  •   import  org.apache.hadoop.mapred.TextInputFormat;
  •   import  org.apache.hadoop.mapred.TextOutputFormat;
  •   /**
  •   *
  •   * 描述:WordCount explains by Felix
  •   * @author Hadoop Dev Group
  •   */
  •   publicclass  WordCount
  •   {

  •   /**
  •   * MapReduceBase类:实现了Mapper和Reducer接口的基类(其中的方法只是实现接口,而未作任何事情)
  •   * Mapper接口:
  •   * WritableComparable接口:实现WritableComparable的类可以相互比较。所有被用作key的类应该实现此接口。
  •   * Reporter 则可用于报告整个应用的运行进度,本例中未使用。
  •   *
  •   */
  •   publicstaticclass  Map  extends  MapReduceBase  implements
  •   Mapper
  •   {
  •   /**
  •   * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,
  •   * 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为long,int,String 的替代品。
  •   */
  •   privatefinalstatic  IntWritable one =  new  IntWritable( 1 );
  •   private  Text word =  new  Text();

  •   /**
  •   * Mapper接口中的map方法:
  •   * void map(K1 key, V1 value, OutputCollector output, Reporter reporter)
  •   * 映射一个单个的输入k/v对到一个中间的k/v对
  •   * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。
  •   * OutputCollector接口:收集Mapper和Reducer输出的对。
  •   * OutputCollector接口的collect(k, v)方法:增加一个(k,v)对到output
  •   */
  •   publicvoid  map(LongWritable key, Text value,
  •   OutputCollector output, Reporter reporter)
  •   throws  IOException
  •   {
  •   String line = value.toString();
  •   StringTokenizer tokenizer = new  StringTokenizer(line);
  •   while  (tokenizer.hasMoreTokens())
  •   {
  •   word.set(tokenizer.nextToken());
  •   output.collect(word, one);
  •   }
  •   }
  •   }

  •   publicstaticclass  Reduce  extends  MapReduceBase  implements
  •   Reducer
  •   {
  •   publicvoid  reduce(Text key, Iterator values,
  •   OutputCollector output, Reporter reporter)
  •   throws  IOException
  •   {
  •   int  sum =  0 ;
  •   while  (values.hasNext())
  •   {
  •   sum += values.next().get();
  •   }
  •   output.collect(key, new  IntWritable(sum));
  •   }
  •   }

  •   publicstaticvoid  main(String[] args)  throws  Exception
  •   {
  •   /**
  •   * JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作
  •   * 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等
  •   */

  •   JobConf conf = new  JobConf(WordCount.>
  •   conf.setJobName("wordcount" );            //设置一个用户定义的job名称

  •   conf.setOutputKeyClass(Text.class );     //为job的输出数据设置Key类
  •   conf.setOutputValueClass(IntWritable.class );    //为job输出设置value类

  •   conf.setMapperClass(Map.class );          //为job设置Mapper类
  •   conf.setCombinerClass(Reduce.class );       //为job设置Combiner类
  •   conf.setReducerClass(Reduce.class );         //为job设置Reduce类

  •   conf.setInputFormat(TextInputFormat.class );     //为map-reduce任务设置InputFormat实现类
  •   conf.setOutputFormat(TextOutputFormat.class );   //为map-reduce任务设置OutputFormat实现类

  •   /**
  •   * InputFormat描述map-reduce中对job的输入定义
  •   * setInputPaths():为map-reduce job设置路径数组作为输入列表
  •   * setInputPath():为map-reduce job设置路径数组作为输出列表
  •   */
  •   FileInputFormat.setInputPaths(conf, new  Path(args[ 0 ]));
  •   FileOutputFormat.setOutputPath(conf, new  Path(args[ 1 ]));

  •   JobClient.runJob(conf);         //运行一个job
  转载自http://hi.baidu.com/whyang2006/item/436a720c4e15a013addc70c4


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-628957-1-1.html 上篇帖子: Hadoop运维记录系列(十) 下篇帖子: 配置hadoop集群
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表