**呼叫MapReduce對檔案中各個單詞出現的次數進行統計**

金豈發表於2020-12-20

把本地檔案系統的“/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資料夾
在這裡插入圖片描述
在這裡插入圖片描述

感謝您能看到這裡,日後也會更新更多這方面的知識;博主也會更深入去學習,日後能更好地和大家進行交流哦!

相關文章