**调用MapReduce对文件中各个单词出现的次数进行统计**

调用MapReduce对文件中各个单词出现的次数进行统计
首先,启动Eclipse
直接采用默认的设置“/home/hadoop/workspace”,工作空间目录位于hadoop用户目录“/home/hadoop”下。
Eclipse启动以后,创建一个Java工程。
在“Project name”后面输入工程名称“WordCount”,选中“Use default location”,让这个Java工程的所有文件都保存在“/home/hadoop/workspace/WordCount”目录下。
需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了与Hadoop相关的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮。
为了编写一个MapReduce程序,一般需要向Java工程中添加以下JAR包:
(1)“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有JAR包,但是,不包括lib、lib-examples和sources目录
(4)“/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有JAR包。
比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar添加到当前的Java工程中,可以在界面中点击相应的目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容。
最后把所需的jar导入,按下finish
找到开始创建好的工程名称“WordCount”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New–>Class”菜单。

在该文件中输入完整的词频统计程序代码:

  1. import java.io.IOException;
  2. import java.util.Iterator;
  3. import java.util.StringTokenizer;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. import org.apache.hadoop.util.GenericOptionsParser;
  14. public class WordCount {
  15. public WordCount() {
    
  16. }
    
  17.  public static void main(String[] args) throws Exception {
    
  18.     Configuration conf = new Configuration();
    
  19.     String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
    
  20.     if(otherArgs.length < 2) {
    
  21.         System.err.println("Usage: wordcount  [...] ");
    
  22.         System.exit(2);
    
  23.     }
    
  24.     Job job = Job.getInstance(conf, "word count");
    
  25.     job.setJarByClass(WordCount.class);
    
  26.     job.setMapperClass(WordCount.TokenizerMapper.class);
    
  27.     job.setCombinerClass(WordCount.IntSumReducer.class);
    
  28.     job.setReducerClass(WordCount.IntSumReducer.class);
    
  29.     job.setOutputKeyClass(Text.class);
    
  30.     job.setOutputValueClass(IntWritable.class); 
    
  31.     for(int i = 0; i < otherArgs.length - 1; ++i) {
    
  32.         FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
    
  33.     }
    
  34.     FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
    
  35.     System.exit(job.waitForCompletion(true)?0:1);
    
  36. }
    
  37. public static class TokenizerMapper extends Mapper {
    
  38.     private static final IntWritable one = new IntWritable(1);
    
  39.     private Text word = new Text();
    
  40.     public TokenizerMapper() {
    
  41.     }
    
  42.     public void map(Object key, Text value, Mapper.Context context) throws IOException, InterruptedException {
    
  43.         StringTokenizer itr = new StringTokenizer(value.toString()); 
    
  44.         while(itr.hasMoreTokens()) {
    
  45.             this.word.set(itr.nextToken());
    
  46.             context.write(this.word, one);
    
  47.         }
    
  48.     }
    
  49. }
    
  50. public static class IntSumReducer extends Reducer {
  51.     private IntWritable result = new IntWritable();
    
  52.     public IntSumReducer() {
    
  53.     }
    
  54.     public void reduce(Text key, Iterable values, Reducer.Context context) throws IOException, InterruptedException {
    
  55.         int sum = 0;
    
  56.         IntWritable val;
    
  57.         for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
    
  58.             val = (IntWritable)i$.next();
    
  59.         }
    
  60.         this.result.set(sum);
    
  61.         context.write(key, this.result);
    
  62.     }
    
  63. }
    
  64. }
    在弹出的菜单中选择“Run as”,继续在弹出来的菜单中选择“Java Application”。

点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息。

下面就可以把Java应用程序打包生成JAR包,部署到Hadoop平台上运行。现在可以把词频统计程序放在“/usr/local/hadoop/myapp”目录下。如果该目录不存在,可以使用如下命令创建:

首先,请在Eclipse工作界面左侧的“Package Explorer”面板中,在工程名称“WordCount”上点击鼠标右键,在弹出的菜单中选择“Export”。
在该界面中,选择“Runnable JAR file”,然后,点击“Next>”按钮。
点击finish后全点ok
已经顺利把WordCount工程打包生成了WordCount.jar。可以到Linux系统中查看一下生成的WordCount.jar文件,可以在Linux的终端中执行如下命令:在这里插入图片描述

可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个WordCount.jar文件。

在运行程序之前,需要启动Hadoop,命令如下:
**调用MapReduce对文件中各个单词出现的次数进行统计**_第1张图片

在启动Hadoop之后,需要首先删除HDFS中与当前Linux用户hadoop对应的input和output目录(即HDFS中的“/user/hadoop/input”和“/user/hadoop/output”目录),这样确保后面程序运行不会出现问题,具体命令如下:
在这里插入图片描述

然后,再在HDFS中新建与当前Linux用户hadoop对应的input目录,即“/user/hadoop/input”目录,具体命令如下:
在这里插入图片描述

然后把lgw.txt,上传到HDFS中的“/user/hadoop/input”目录下,命令如下:
在这里插入图片描述

如果HDFS中已经存在目录“/user/hadoop/output”,则使用如下命令删除该目录(因为我没创建过output所以不需要删除,此处为资料密令):

  1. cd /usr/local/hadoop
  2. ./bin/hdfs dfs -rm -r /user/hadoop/output
    现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下:
    **调用MapReduce对文件中各个单词出现的次数进行统计**_第2张图片

上面命令执行以后,当运行顺利结束时,屏幕上会显示类似如下的信息:
**调用MapReduce对文件中各个单词出现的次数进行统计**_第3张图片

词频统计结果已经被写入了HDFS的“/user/hadoop/output”目录中,可以执行如下命令查看词频统计结果:
在这里插入图片描述
上面命令执行后,会在屏幕上显示如下词频统计结果:
**调用MapReduce对文件中各个单词出现的次数进行统计**_第4张图片

把统计结果下载保存到output文件夹
在这里插入图片描述
**调用MapReduce对文件中各个单词出现的次数进行统计**_第5张图片

你可能感兴趣的:(mapreduce)