[关闭]
@linux1s1s 2018-02-07T02:48:01.000000Z 字数 3755 阅读 847

Hadoop入门-自写实例 wordcount

Big-Data 2018-02


本文自写wordcount实例,以期熟悉Hadoop操作,以下为详细记录.

自写wordcount

新建wordcount目录,并在该目录下新建两个子目录分别为src和classes.分别存放源码和编译结果.
最简单的MapReduce程序,只需要三个Java文件即可

WordMapper

  1. package com.linroid.hadoop;
  2. import java.io.IOException;
  3. import java.util.StringTokenizer;
  4. import org.apache.hadoop.io.IntWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7. public class WordMapper extends Mapper<Object, Text, Text, IntWritable> {
  8. /**
  9. * IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,
  10. * 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为int,String 的替代品。
  11. * 声明one常量和word用于存放单词的变量
  12. */
  13. IntWritable one = new IntWritable(1);
  14. Text word = new Text();
  15. /**
  16. * Mapper中的map方法:
  17. * void map(K1 key, V1 value, Context context)
  18. * 映射一个单个的输入k/v对到一个中间的k/v对
  19. * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。
  20. * Context:收集Mapper输出的<k,v>对。
  21. * Context的write(k, v)方法:增加一个(k,v)对到context
  22. * 程序员主要编写Map和Reduce函数.这个Map函数使用StringTokenizer函数对字符串进行分隔,通过write方法把单词存入word中
  23. * write方法存入(单词,1)这样的二元组到context中
  24. */
  25. public void map(Object key, Text value, Context context) throws IOException,InterruptedException {
  26. StringTokenizer itr = new StringTokenizer(value.toString());
  27. while(itr.hasMoreTokens()) {
  28. word.set(itr.nextToken());
  29. context.write(word, one);
  30. }
  31. }
  32. }

WordReduce

  1. package com.linroid.hadoop;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Reducer;
  6. public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  7. IntWritable result = new IntWritable();
  8. /**
  9. * Reducer类中的reduce方法:
  10. * void reduce(Text key, Iterable<IntWritable> values, Context context)
  11. * 中k/v来自于map函数中的context,可能经过了进一步处理(combiner),同样通过context输出
  12. */
  13. public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,InterruptedException {
  14. int sum = 0;
  15. for(IntWritable val:values) {
  16. sum += val.get();
  17. }
  18. result.set(sum);
  19. context.write(key,result);
  20. }
  21. }

WordCount

  1. package com.linroid.hadoop;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IntWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  9. import org.apache.hadoop.util.GenericOptionsParser;
  10. public class WordCount {
  11. public static void main(String[] args) throws Exception {
  12. /**
  13. * Configuration:map/reduce的j配置类,向hadoop框架描述map-reduce执行的工作
  14. */
  15. Configuration conf = new Configuration();
  16. String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  17. if(otherArgs.length != 2) {
  18. System.err.println("Usage: wordcount <in> <out>");
  19. System.exit(2);
  20. }
  21. Job job = new Job(conf, "wordcount"); //设置一个用户定义的job名称
  22. job.setJarByClass(WordCount.class);
  23. job.setMapperClass(WordMapper.class); //为job设置Mapper类
  24. job.setCombinerClass(WordReducer.class); //为job设置Combiner类
  25. job.setReducerClass(WordReducer.class); //为job设置Reducer类
  26. job.setOutputKeyClass(Text.class); //为job的输出数据设置Key类
  27. job.setOutputValueClass(IntWritable.class); //为job输出设置value类
  28. FileInputFormat.addInputPath(job, new Path(otherArgs[0])); //为job设置输入路径
  29. FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); //为job设置输出路径
  30. System.exit(job.waitForCompletion(true)?0:1);
  31. }
  32. }

理解MapReduce工作过程

此处输入图片的描述

此处输入图片的描述

编译

Hadoop2.x 版本编译不再集中到一个hadoop-core-*.jar中,而是需要多个jar,如下图找到这些jar的目录

此处输入图片的描述

然后使用javac命令进行编译

  1. javac -classpath /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.5.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.5.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar -d classes/ src/*.java

如图所示:

此处输入图片的描述

  • classpath,设置源代码里使用的各种类库所在的路径,多个路径用":"隔开。
  • d,设置编译后的 class 文件保存的路径。
  • src/*.java,待编译的源文件。

打包

  1. jar -cvf wordcount.jar classes

如图所示:

此处输入图片的描述

执行

  1. su - hadoop #输入密码
  2. start-all.sh #启动hadoop
  1. hadoop jar /home/mutex/word-count/wordcount.jar com.linroid.hadoop.WordCount /input /otput

此处输入图片的描述

然后再otput目录中查看结果

  1. hdfs dfs -cat /otput/part-r-00000

如图所示:
此处输入图片的描述

参考:初学Hadoop之图解MapReduce与WordCount示例分析

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注