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 }
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)備註:如還有問題參考下面一張圖片:
到此結束,以後插件就可以用了