021_在Eclipse Indigo中安裝插件hadoop-eclipse-plugin-1.2.1.jar,直接運行wordcount程序

1、工具介紹

 Eclipse Idigo、JDK1.7-32bit、hadoop1.2.1、hadoop-eclipse-plugin-1.2.1.jar(自己網上下載)

2、插件安裝步驟

  1)將hadoop-eclipse-plugin-1.2.1.jar放到eclipse安裝目錄的plugins文件夾中,重新啓動eclipse。

  
  2)打開Window-->Preferens,發現Hadoop Map/Reduce選項,說明插件安裝成功,配置Hadoop installation directory爲本地Hadoop 安裝解壓的目錄。此處選擇是hadoop1.2.1軟件包在windows中的文件夾,其中的各種文件可以都不用配置,與Linux中的hadoop沒有什麼特殊的聯繫,原生態的hadoop1.2.1.tar.gz解壓的就行。

  
  3)選擇window -> open perspective  -> Other... , 選擇有大象圖標的 Map/Reduce,打開Map/Reduce的開發環境,右下角多了一個Map/Reduce Locations的框。

  

4)選擇Map/Reduce Locations 標籤,點擊標籤最右邊的大象圖標,即齒輪狀圖標右側的大象圖標,打開參數設置頁面。

 Location Name : 參數設置名稱
 Map/Reduce Master :Hadoop集羣的Map/Reduce地址,應與mapredsite.xml中的mapred.job.tracker設置相同
 Host: hadoop-master.dragon.org
 port: 9001
 DFS Master :Hadoop的master服務器地址,應與core-site.xml中的 fs.default.name 設置相同
 Host: hadoop-master.dragon.org
 Port: 9000
設置完成後,點擊Finish

5)接着點擊 【Advanced parameters】從中找見【hadoop.tmp.dir】,修改爲Hadoop集羣【core-site.xml】中配置的值

6)重啓hadoop配置一下兩步(若不重啓能找到的話也可以直接配置,本次測試時重啓了,否則找不到)

配置【dfs.permissions】,修改爲Hadoop集羣【hdfs-site.xml】中配置的值【false】
配置【dfs.replication】,修改爲Hadoop集羣【hdfs-site.xml】中配置的值【1】

3、跑wordcount程序測試

因爲本人已經測試完成,這個是後期整理,借用幾張夢琪老師的圖用一下,不影響運行,節省時間;

1)使用Eclipse  創建MapReduce工程,你會發現多了好多配置的jar文件,自動導入到項目中了。

2)將wordcount程序拷貝到該工程目錄src文件夾下;程序同上一篇博客的wordcount程序。

  1 package org.dragon.hadoop.mr;
  2 
  3 import java.io.IOException;
  4 import java.util.StringTokenizer;
  5 
  6 import org.apache.hadoop.conf.Configuration;
  7 import org.apache.hadoop.fs.Path;
  8 import org.apache.hadoop.io.IntWritable;
  9 import org.apache.hadoop.io.LongWritable;
 10 import org.apache.hadoop.io.Text;
 11 import org.apache.hadoop.mapreduce.Job;
 12 import org.apache.hadoop.mapreduce.Mapper;
 13 import org.apache.hadoop.mapreduce.Reducer;
 14 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 15 
 16 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 17 import org.apache.hadoop.util.GenericOptionsParser;
 18 
 19 import com.sun.accessibility.internal.resources.accessibility;
 20 import com.sun.org.apache.xpath.internal.Arg;
 21 
 22 /**
 23  * 
 24  * @author ZhuXY  
 25  * @time   2016-3-7 下午3:37:54
 26  * 
 27  * MapReduce 初級案例 wordcount程序
 28  */
 29 public class MyWorldCount {
 30     
 31     //Mapper 區域
 32     /**
 33      * <KEYIN,         VALUEIN,         KEYOUT,         VALUEOUT>
 34      * 輸入key類型    輸入value類型    輸出key類型        輸出value類型
 35      *
 36      */
 37     
 38     /**
 39      * WordCount程序map類
 40      *
 41      */
 42     static  class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
 43         
 44         private Text word=new Text();
 45         private final static IntWritable one=new IntWritable(1);
 46         
 47         //快捷鍵alt+shift+s
 48         //map方法每次只讀取一行數據,換句話說就是每行啓動一個map函數
 49         @Override
 50         protected void map(LongWritable key, Text value, Context context)
 51                 throws IOException, InterruptedException {
 52             
 53             //獲取每行數據的值
 54             String lineValue=value.toString();
 55             
 56             //進行分割
 57             StringTokenizer stringTokenizer=new StringTokenizer(lineValue);
 58             
 59             //遍歷
 60             while (stringTokenizer.hasMoreElements()) {
 61                 
 62                 //獲取每個值
 63                 String worldValue=stringTokenizer.nextToken();
 64                 
 65                 //設置map, 輸入的key值
 66                 word.set(worldValue);
 67                 context.write(word, one); //如果出現就出現一次,存在每行出現幾次,這時候鍵的值一樣,多個鍵值對
 68             }
 69         }
 70     }
 71     
 72     //Reducer 區域
 73     /**
 74      * <KEYIN, VALUEIN, KEYOUT, VALUEOUT>
 75      * KEYIN key, Iterable<VALUEIN> values, Context context
 76      */
 77     
 78     /**
 79      * WordCount程序reduce類
 80      *
 81      */
 82     static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
 83 
 84         private IntWritable resultIntWritable=new IntWritable();
 85         //這裏key還是key。但是value變成了values
 86         @Override
 87         protected void reduce(Text key, Iterable<IntWritable> values,
 88                 Context context)
 89                 throws IOException, InterruptedException {
 90             //用於累加的變量
 91             
 92             int sum=0;
 93             //循環遍歷Interable
 94             for(IntWritable value:values)
 95             {
 96                 //累加
 97                 sum+=value.get();
 98             }
 99             
100             //設置總次數
101             resultIntWritable.set(sum);
102             context.write(key, resultIntWritable);
103         }
104     }
105     
106     //Client  區域
107     public static void main(String[] args) throws Exception {
108         
109         //方便起見直接在此處寫死了,可以在run as的配置中配置參數
110         args=new String[]{
111                 "hdfs://hadoop-master.dragon.org:9000/wc/wcinput/",
112                 "hdfs://hadoop-master.dragon.org:9000/wc/wcoutput/"            
113         };
114         
115         //獲取配置文件信息
116         Configuration configuration=new Configuration();
117         
118         //當命令格式不正確的時候,提示,類似於shell中的命令提示
119 //        String[] otherArgs = new GenericOptionsParser(configuration, 
120 //                args).getRemainingArgs();
121 //                if (otherArgs.length != 2) {
122 //                System.err.println("Usage: wordcount <in> <out>");
123 //                System.exit(2);
124 //                }
125         
126         //創建job。設置配置文件信息和Job名稱
127         Job job=new Job(configuration,"wc");
128         
129         //1、設置Job運行的類
130         job.setJarByClass(MyWorldCount.class);
131         
132         //2、設置Mapper類和Reducer類
133         job.setMapperClass(MyMapper.class);
134         job.setReducerClass(MyReducer.class);
135         
136         //3、設置輸入文件的目錄和輸出文件目錄
137         FileInputFormat.addInputPath(job, new Path(args[0]));
138         FileOutputFormat.setOutputPath(job, new Path(args[1]));
139         
140         //4、設置輸出結果的key和value的類型
141         job.setOutputKeyClass(Text.class);
142         job.setOutputValueClass(IntWritable.class);
143         
144         //5、提交Job等待運行結果,並在客戶端顯示運行信息
145         boolean isSuccess=job.waitForCompletion(true);
146         
147         //6、結束程序
148         System.exit(isSuccess?0:1);
149     }
150 }
View Code

 

   3)直接在類中右擊-->Run on hadoop

  4)報錯如下;Hadoop PriviledgedActionException

  解決方案:

  a、簡稱“修改源碼”——找到hadoop1.2.1的源碼,就是你第二步添加的源碼,

修改%HADOOP_HOME%/src/core/org/apache/hadoop/fs/FileUtil.java裏面checkReturnValue方法,註釋掉方法內容:

  b、簡稱“導入包修改”。顯然第一種辦法不是很合適。

  到源碼中找到該java文件,在該項目中建立與該文件所在的packet相同的packet,然後將FileUtils.java拷貝到該packet下面,註釋掉上述註釋掉的內容。

  原因:Eclipse對packet的加載規則是先用本項目下面的,在用庫中的。

  5)再次運行wordcount程序沒有問題了。

  6)備註:如還有問題參考下面一張圖片:

到此結束,以後插件就可以用了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章