1. 程式人生 > >windows 環境下Eclipse開發MapReduce環境設定

windows 環境下Eclipse開發MapReduce環境設定

1、Hadoop開發環境簡介

1.1 Hadoop叢集簡介

Java版本:jdk-6u31-linux-i586.bin

Linux系統:CentOS6.0

Hadoop版本:hadoop-1.0.0.tar.gz

1.2 Windows開發簡介

Java版本:jdk-6u31-windows-i586.exe

Win系統:Windows 7 旗艦版

Eclipse軟體:eclipse-jee-indigo-SR1-win32.zip | eclipse-jee-helios-SR2-win32.zip

Hadoop軟體:hadoop-1.0.0.tar.gz

Hadoop Eclipse 外掛:hadoop-eclipse-plugin-1.0.0.jar

下載地址:http://downloa

1、Hadoop開發環境簡介

1.1 Hadoop叢集簡介

Java版本:jdk-6u31-linux-i586.bin

Linux系統:CentOS6.0

Hadoop版本:hadoop-1.0.0.tar.gz

1.2 Windows開發簡介

Java版本:jdk-6u31-windows-i586.exe

Win系統:Windows 7 旗艦版

Eclipse軟體:eclipse-jee-indigo-SR1-win32.zip | eclipse-jee-helios-SR2-win32.zip

Hadoop軟體:hadoop-1.0.0.tar.gz

Hadoop Eclipse 外掛:hadoop-eclipse-plugin-1.0.0.jar

下載地址:http://download.csdn.net/detail/xia520pi/4113746

備註:下面是網上收集的收集的"hadoop-eclipse-plugin-1.0.0.jar",除"版本2.0"是根據"V1.0"按照"常見問題FAQ_1"改的之外,剩餘的"V3.0"、"V4.0"和"V5.0"和"V2.0"一樣是別人已經弄好的,而且我已經都測試過,沒有任何問題,可以放心使用。我們這裡選擇第"V5.0"使用。記得在使用時重新命名為"hadoop-eclipse-plugin-1.0.0.jar"。

2、Hadoop Eclipse簡介和使用

2.1 Eclipse外掛介紹

Hadoop是一個強大的並行框架,它允許任務在其分散式叢集上並行處理。但是編寫、除錯Hadoop程式都有很大難度。正因為如此,Hadoop的開發者開發出了Hadoop Eclipse外掛,它在Hadoop的開發環境中嵌入了Eclipse,從而實現了開發環境的圖形化,降低了程式設計難度。在安裝外掛,配置Hadoop的相關資訊之後,如果使用者建立Hadoop程式,外掛會自動匯入Hadoop程式設計介面的JAR檔案,這樣使用者就可以在Eclipse的圖形化介面中編寫、除錯、執行Hadoop程式(包括單機程式和分散式程式),也可以在其中檢視自己程式的實時狀態、錯誤資訊和執行結果,還可以檢視、管理HDFS以及檔案。總地來說,Hadoop Eclipse外掛安裝簡單,使用方便,功能強大,尤其是在Hadoop程式設計方面,是Hadoop入門和Hadoop程式設計必不可少的工具。

2.2 Hadoop工作目錄簡介

為了以後方便開發,我們按照下面把開發中用到的軟體安裝在此目錄中,JDK安裝除外,我這裡把JDK安裝在C盤的預設安裝路徑下,下面是我的工作目錄:

系統磁碟(E:)

|---HadoopWorkPlat

|--- eclipse

|--- hadoop-1.0.0

|--- workplace

|---……

按照上面目錄把Eclipse和Hadoop解壓到"E:\HadoopWorkPlat"下面,並建立"workplace"作為Eclipse的工作空間。

備註:大家可以按照自己的情況,不一定按照我的結構來設計。

2.3 修改系統管理員名字

經過兩天多次探索,為了使Eclipse能正常對Hadoop叢集的HDFS上的檔案能進行修改和刪除,所以修改你工作時所用的Win7系統管理員名字,預設一般為"Administrator",把它修改為"hadoop",此使用者名稱與Hadoop叢集普通使用者一致,大家應該記得我們Hadoop叢集中所有的機器都有一個普通使用者——hadoop,而且Hadoop執行也是用這個使用者進行的。為了不至於為許可權苦惱,我們可以修改Win7上系統管理員的姓名,這樣就避免出現該使用者在Hadoop叢集上沒有許可權等都疼問題,會導致在Eclipse中對Hadoop叢集的HDFS建立和刪除檔案受影響。

你可以做一下實驗,檢視Master.Hadoop機器上"/usr/hadoop/logs"下面的日誌。發現許可權不夠,不能進行"Write"操作,網上有幾種解決方案,但是對Hadoop1.0不起作用,詳情見"常見問題FAQ_2"。下面我們進行修改管理員名字。

首先"右擊"桌面上圖示"我的電腦",選擇"管理",彈出介面如下:

接著選擇"本地使用者和組",展開"使用者",找到系統管理員"Administrator",修改其為"hadoop",操作結果如下圖:

最後,把電腦進行"登出"或者"重啟電腦",這樣才能使管理員才能用這個名字。

2.4 Eclipse外掛開發配置

第一步:把我們的"hadoop-eclipse-plugin-1.0.0.jar"放到Eclipse的目錄的"plugins"中,然後重新Eclipse即可生效。

系統磁碟(E:)

|---HadoopWorkPlat

|--- eclipse

|--- plugins

|--- hadoop-eclipse-plugin-1.0.0.jar

上面是我的"hadoop-eclipse-plugin"外掛放置的地方。重啟Eclipse如下圖:

細心的你從上圖中左側"Project Explorer"下面發現"DFS Locations",說明Eclipse已經識別剛才放入的Hadoop Eclipse外掛了。

第二步:選擇"Window"選單下的"Preference",然後彈出一個窗體,在窗體的左側,有一列選項,裡面會多出"Hadoop Map/Reduce"選項,點選此選項,選擇Hadoop的安裝目錄(如我的Hadoop目錄:E:\HadoopWorkPlat\hadoop-1.0.0)。結果如下圖:

第三步:切換"Map/Reduce"工作目錄,有兩種方法:

1)選擇"Window"選單下選擇"Open Perspective",彈出一個窗體,從中選擇"Map/Reduce"選項即可進行切換。

2)在Eclipse軟體的右上角,點選圖示""中的"",點選"Other"選項,也可以彈出上圖,從中選擇"Map/Reduce",然後點選"OK"即可確定。

切換到"Map/Reduce"工作目錄下的介面如下圖所示。

第四步:建立與Hadoop叢集的連線,在Eclipse軟體下面的"Map/Reduce Locations"進行右擊,彈出一個選項,選擇"New Hadoop Location",然後彈出一個窗體。

注意上圖中的紅色標註的地方,是需要我們關注的地方。

  • Location Name:可以任意其,標識一個"Map/Reduce Location"

  • Map/Reduce Master
    Host:192.168.1.2(Master.Hadoop的IP地址)
    Port:9001

  • DFS Master
    Use M/R Master host:前面的勾上。(因為我們的NameNode和JobTracker都在一個機器上。)
    Port:9000

  • User name:hadoop(預設為Win系統管理員名字,因為我們之前改了所以這裡就變成了hadoop。)

備註:這裡面的Host、Port分別為你在mapred-site.xml、core-site.xml中配置的地址及埠。不清楚的可以參考"Hadoop叢集_第5期_Hadoop安裝配置_V1.0"進行檢視。

接著點選"Advanced parameters"從中找見"hadoop.tmp.dir",修改成為我們Hadoop叢集中設定的地址,我們的Hadoop叢集是"/usr/hadoop/tmp",這個引數在"core-site.xml"進行了配置。

點選"finish"之後,會發現Eclipse軟體下面的"Map/Reduce Locations"出現一條資訊,就是我們剛才建立的"Map/Reduce Location"。

第五步:檢視HDFS檔案系統,並嘗試建立資料夾和上傳檔案。點選Eclipse軟體左側的"DFS Locations"下面的"Win7ToHadoop",就會展示出HDFS上的檔案結構。

右擊"Win7ToHadoopàuseràhadoop"可以嘗試建立一個"資料夾--xiapi",然後右擊重新整理就能檢視我們剛才建立的資料夾。

建立完之後,並重新整理,顯示結果如下:

用SecureCRT遠端登入"Master.Hadoop"伺服器,用下面命令檢視是否已經建立一個"xiapi"的資料夾。

hadoop fs -ls

到此為止,我們的Hadoop Eclipse開發環境已經配置完畢,不盡興的同學可以上傳點本地檔案到HDFS分散式檔案上,可以互相對比意見檔案是否已經上傳成功。

3、Eclipse執行WordCount程式

3.1 配置Eclipse的JDK

如果電腦上不僅僅安裝的JDK6.0,那麼要確定一下Eclipse的平臺的預設JDK是否6.0。從"Window"選單下選擇"Preference",彈出一個窗體,從窗體的左側找見"Java",選擇"Installed JREs",然後新增JDK6.0。下面是我的預設選擇JRE。

下面是沒有新增之前的設定如下:

下面是新增完JDK6.0之後結果如下:

接著設定Complier。

3.2 設定Eclipse的編碼為UTF-8

3.3 建立MapReduce專案

從"File"選單,選擇"Other",找到"Map/Reduce Project",然後選擇它。

接著,填寫MapReduce工程的名字為"WordCountProject",點選"finish"完成。

目前為止我們已經成功建立了MapReduce專案,我們發現在Eclipse軟體的左側多了我們的剛才建立的專案。

3.4 建立WordCount類

選擇"WordCountProject"工程,右擊彈出選單,然後選擇"New",接著選擇"Class",然後填寫如下資訊:

因為我們直接用Hadoop1.0.0自帶的WordCount程式,所以報名需要和程式碼中的一致為"org.apache.hadoop.examples",類名也必須一致為"WordCount"。這個程式碼放在如下的結構中。

hadoop-1.0.0

|---src

|---examples

|---org

|---apache

|---hadoop

|---examples

從上面目錄中找見"WordCount.java"檔案,用記事本開啟,然後把程式碼複製到剛才建立的java檔案中。當然原始碼有些變動,變動的紅色已經標記出。

package org.apache.hadoop.examples;
 
import java.io.IOException;
import java.util.StringTokenizer;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
 
public class WordCount {
 
  public static class TokenizerMapper 
       extends Mapper<Object, Text, Text, IntWritable>{
     
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
       
    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);      }
    }
  }
   
  public static class IntSumReducer 
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();
 
    public void reduce(Text key, Iterable values, 
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }
 
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    conf.set("mapred.job.tracker", "192.168.1.2:9001");
    String[] ars=new String[]{"input","newout"};
    String[] otherArgs = new GenericOptionsParser(conf, ars).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount  ");
      System.exit(2);
    }
    Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

備註:如果不加"conf.set("mapred.job.tracker", "192.168.1.2:9001");",將提示你的許可權不夠,其實照成這樣的原因是剛才設定的"Map/Reduce Location"其中的配置不是完全起作用,而是在本地的磁碟上建立了檔案,並嘗試執行,顯然是不行的。我們要讓Eclipse提交作業到Hadoop叢集上,所以我們這裡手動新增Job執行地址。詳細參考"常見問題FAQ_3"。

3.5 執行WordCount程式

選擇"Wordcount.java"程式,右擊一次按照"Run ASàRun on Hadoop"執行。然後會彈出如下圖,按照下圖進行操作。

執行結果如下:

從上圖中我們得知我們的程式已經執行成功了。

3.6 檢視WordCount執行結果

檢視Eclipse軟體左側,右擊"DFS LocationsàWin7ToHadoopàuseràhadoop",點選重新整理按鈕"Refresh",我們剛才出現的資料夾"newoutput"會出現。記得"newoutput"資料夾是執行程式時自動建立的,如果已經存在相同的的資料夾,要麼程式換個新的輸出資料夾,要麼刪除HDFS上的那個重名資料夾,不然會出錯。

開啟"newoutput"資料夾,開啟"part-r-00000"檔案,可以看見執行後的結果。

到此為止,Eclipse開發環境設定已經完畢,並且成功執行Wordcount程式,下一步我們真正開始Hadoop之旅。

4、常見問題FAQ

4.1 "error: failure to login"問題

下面以網上找的"hadoop-0.20.203.0"為例,我在使用"V1.0"時也出現這樣的情況,原因就是那個"hadoop-eclipse-plugin-1.0.0_V1.0.jar",是直接把原始碼編譯而成,故而缺少相應的Jar包。具體情況如下

在我實踐嘗試中,發現hadoop-0.20.203.0版本的該包如果直接複製到eclipse的外掛目錄中,在連線DFS時會出現錯誤,提示資訊為: "error: failure to login"。

彈出的錯誤提示框內容為"An internal error occurred during: "Connecting to DFS hadoop".org/apache/commons/configuration/Configuration". 經過察看Eclipse的log,發現是缺少jar包導致的。進一步查詢資料後,發現直接複製hadoop-eclipse-plugin-0.20.203.0.jar,該包中lib目錄下缺少了jar包。

經過網上資料蒐集,此處給出正確的安裝方法:

首先要對hadoop-eclipse-plugin-0.20.203.0.jar進行修改。用歸檔管理器開啟該包,發現只有commons-cli-1.2.jar 和hadoop-core.jar兩個包。將hadoop/lib目錄下的:

  • commons-configuration-1.6.jar ,

  • commons-httpclient-3.0.1.jar ,

  • commons-lang-2.4.jar ,

  • jackson-core-asl-1.0.1.jar

  • jackson-mapper-asl-1.0.1.jar

一共5個包複製到hadoop-eclipse-plugin-0.20.203.0.jar的lib目錄下,如下圖:

然後,修改該包META-INF目錄下的MANIFEST.MF,將classpath修改為一下內容:

Bundle-ClassPath:classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-httpclient-3.0.1.jar,lib/jackson-core-asl-1.0.1.jar,lib/jackson-mapper-asl-1.0.1.jar,lib/commons-configuration-1.6.jar,lib/commons-lang-2.4.jar

這樣就完成了對hadoop-eclipse-plugin-0.20.203.0.jar的修改。

最後,將hadoop-eclipse-plugin-0.20.203.0.jar複製到Eclipse的plugins目錄下。

備註:上面的操作對"hadoop-1.0.0"一樣適用。

4.2 "Permission denied"問題

網上試了很多,有提到"hadoop fs -chmod 777 /user/hadoop ",有提到"dfs.permissions 的配置項,將value值改為 false",有提到"hadoop.job.ugi",但是通通沒有效果。

參考文獻:

錯誤型別:org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=*********, access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x

解決方案:

我的解決方案直接把系統管理員的名字改成你的Hadoop叢集執行hadoop的那個使用者。

4.3 "Failed to set permissions of path"問題

 錯誤資訊如下:

ERROR security.UserGroupInformation: PriviledgedActionException as: hadoop cause:java.io.IOException Failed to set permissions of path:\usr\hadoop\tmp\mapred\staging\hadoop753422487\.staging to 0700 Exception in thread "main" java.io.IOException: Failed to set permissions of path: \usr\hadoop\tmp \mapred\staging\hadoop753422487\.staging to 0700

 解決方法:

Configuration conf = new Configuration();

conf.set("mapred.job.tracker", "[server]:9001");

"[server]:9001"中的"[server]"為Hadoop叢集Master的IP地址。

4.4 "hadoop mapred執行目錄檔案權"限問題

 錯誤資訊如下:

 job Submission failed with exception 'java.io.IOException(The ownership/permissions on the staging directory /tmp/hadoop-hadoop-user1/mapred/staging/hadoop-user1/.staging is not as expected. It is owned by hadoop-user1 and permissions are rwxrwxrwx. The directory must be owned by the submitter hadoop-user1 or by hadoop-user1 and permissions must be rwx------)

 修改許可權: