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

Posted 金豈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了**调用MapReduce对文件中各个单词出现的次数进行统计**相关的知识,希望对你有一定的参考价值。

把本地文件系统的“/home/hadoop/ljk.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:

  1. ./bin/hdfs dfs -put /home/hadoop/ljk.txt  input
    

可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:

  1. ./bin/hdfs dfs –ls input
    

首先,启动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 <in> [<in>...] <out>");
    
  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<Object, Text, Text, IntWritable> 
    
  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<Object, Text, Text, IntWritable>.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<Text, IntWritable, Text, IntWritable> 
    
  51.     private IntWritable result = new IntWritable();
    
  52.     public IntSumReducer() 
    
  53.     
    
  54.     public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.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
可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个WordCount.jar文件。
在运行程序之前,需要启动Hadoop,命令如下:

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

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

然后把ljk.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命令运行程序,命令如下:

上面命令执行以后,当运行顺利结束时,屏幕上会显示类似如下的信息:

词频统计结果已经被写入了HDFS的“/user/hadoop/output”目录中,可以执行如下命令查看词频统计结果:

上面命令执行后,会在屏幕上显示如下词频统计结果:

把统计结果下载保存到output文件夹

感谢您能看到这里,日后也会更新更多这方面的知识;博主也会更深入去学习,日后能更好地和大家进行交流哦!

以上是关于**调用MapReduce对文件中各个单词出现的次数进行统计**的主要内容,如果未能解决你的问题,请参考以下文章

通过 MapReduce 读取与特定模式匹配的目录中的文件并输出各个文件的名称

理解MapReduce计算构架

理解Mapreduce

理解MapReduce

理解MapReduce

理解MapReduce