Win7 Eclipse調試Centos Hadoop2.2-Mapreduce

 

一. 自己搭建開發環境

     今天自己搭建了一套Centos5.3 + Hadoop2.2 + Hbase0.96.1.1的開發環境,Win7 Eclipse調試MapReduce成功。可能是版本比較高的原因,出了問題,網上找不到完整解決方案,只能靠自己。

 

二. Hadoop安裝

     這個就不囉嗦了,網上大把文章。我下載的是hadoop-2.2.0.tar.gz

  1. http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html 很詳細的介紹了Hadoop Hdfs的安裝。它這個不是Hadoop2.2的,但配置都大同小異。
  2. MapReduce的配置可以參考http://blog.sina.com.cn/s/blog_546abd9f0101i8b8.html

     安裝成功後,能順利查看以下幾個頁面,就OK了。我的集羣環境是200master,201-203slave。

  1. dfs.http.address   192.168.1.200:50070
  2. dfs.secondary.http.address  192.168.1.200:50090
  3. dfs.datanode.http.address  192.168.1.201:50075
  4. yarn.resourcemanager.webapp.address  192.168.1.200:50030
  5. mapreduce.jobhistory.webapp.address 192.168.1.200:19888。這個好像訪問不了。需要啓動hadoop/sbin/mr-jobhistory-daemon.sh start historyserver纔可以訪問。

三. Hadoop2.x eclispe-plugin

     https://github.com/winghc/hadoop2x-eclipse-plugin

     目前這個插件還在開發中,你可以自己下載源碼編譯,網上也有人發佈編譯好的jar。

     http://blog.csdn.net/zythy/article/details/17397153 這個同學寫的很詳細了。

     需要注意一點的是,Hadoop installation directory裏填寫Win下的hadoop home地址,其目的在於創建MapReduce Project能從這個地方自動引入MapReduce需要的jar。解壓hadoop-2.2.0.tar.gz到本地即可。

 

四. 各種問題

      上面一步完成後,創建一個MapReduce Project,運行時發現出問題了。

  1.  
    Java代碼  收藏代碼
    1. java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.  
     跟代碼就去發現是HADOOP_HOME的問題。如果HADOOP_HOME爲空,必然fullExeName爲null\bin\winutils.exe。解決方法很簡單啦,乖乖的配置環境變量吧,不想重啓電腦可以在MapReduce程序里加上System.setProperty("hadoop.home.dir", "...");暫時緩緩。org.apache.hadoop.util.Shell.java
    Java代碼  收藏代碼
    1.   public static final String getQualifiedBinPath(String executable)   
    2.   throws IOException {  
    3.     // construct hadoop bin path to the specified executable  
    4.     String fullExeName = HADOOP_HOME_DIR + File.separator + "bin"   
    5.       + File.separator + executable;  
    6.   
    7.     File exeFile = new File(fullExeName);  
    8.     if (!exeFile.exists()) {  
    9.       throw new IOException("Could not locate executable " + fullExeName  
    10.         + " in the Hadoop binaries.");  
    11.     }  
    12.   
    13.     return exeFile.getCanonicalPath();  
    14.   }  
    15.   
    16. private static String HADOOP_HOME_DIR = checkHadoopHome();  
    17. private static String checkHadoopHome() {  
    18.   
    19.     // first check the Dflag hadoop.home.dir with JVM scope  
    20.     String home = System.getProperty("hadoop.home.dir");  
    21.   
    22.     // fall back to the system/user-global env variable  
    23.     if (home == null) {  
    24.       home = System.getenv("HADOOP_HOME");  
    25.     }  
    26.      ...  
    27. }  
     
  2. 這個時候得到完整的地址fullExeName,我機器上是D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe。繼續執行代碼又發現了錯誤
    Java代碼  收藏代碼
    1. Could not locate executable D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe in the Hadoop binaries.  
     就去一看,沒有winutils.exe這個東西。去https://github.com/srccodes/hadoop-common-2.2.0-bin下載一個,放就去即可。
  3. 繼續出問題
    Java代碼  收藏代碼
    1. at org.apache.hadoop.util.Shell.execCommand(Shell.java:661)  
    2. at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:639)  
    3. at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:435)  
      繼續跟代碼org.apache.hadoop.util.Shell.java
    Java代碼  收藏代碼
    1. public static String[] getSetPermissionCommand(String perm, boolean recursive,  
    2.                                                String file) {  
    3.   String[] baseCmd = getSetPermissionCommand(perm, recursive);  
    4.   String[] cmdWithFile = Arrays.copyOf(baseCmd, baseCmd.length + 1);  
    5.   cmdWithFile[cmdWithFile.length - 1] = file;  
    6.   return cmdWithFile;  
    7. }  
    8.   
    9. /** Return a command to set permission */  
    10. public static String[] getSetPermissionCommand(String perm, boolean recursive) {  
    11.   if (recursive) {  
    12.     return (WINDOWS) ? new String[] { WINUTILS, "chmod""-R", perm }  
    13.                        : new String[] { "chmod""-R", perm };  
    14.   } else {  
    15.     return (WINDOWS) ? new String[] { WINUTILS, "chmod", perm }  
    16.                      : new String[] { "chmod", perm };  
    17.   }  
    18. }  
     cmdWithFile數組的內容爲{"D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe", "chmod", "755", "xxxfile"},我把這個單獨在cmd裏執行了一下,發現
    Java代碼  收藏代碼
    1. 無法啓動此程序,因爲計算機中丟失 MSVCR100.dll  
     那就下載一個唄http://files.cnblogs.com/sirkevin/msvcr100.rar,丟到C:\Windows\System32裏面。再次cmd執行,又來了問題
    Java代碼  收藏代碼
    1. 應用程序無法正常啓動(0xc000007b)  
     下載http://blog.csdn.net/vbcom/article/details/7245186 DirectX_Repair來解決這個問題吧。記得修復完後要重啓電腦。搞定後cmd試一下,很棒。
  4. 到了這裏,已經看到曙光了,但問題又來了
    Java代碼  收藏代碼
    1. Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z  
     代碼就去
    Java代碼  收藏代碼
    1. /** Windows only method used to check if the current process has requested 
    2.  *  access rights on the given path. */  
    3. private static native boolean access0(String path, int requestedAccess);  
     顯然缺少dll文件,還記得https://github.com/srccodes/hadoop-common-2.2.0-bin下載的東西吧,裏面就有hadoop.dll,最好的方法就是用hadoop-common-2.2.0-bin-master/bin目錄替換本地hadoop的bin目錄,並在環境變量裏配置PATH=HADOOP_HOME/bin,重啓電腦。
  5. 終於看到了MapReduce的正確輸出output99。

五. 總結 

  1.  hadoop eclipse插件不是必須的,其作用在我看來就是如下三點(這個是一個錯誤的認識,具體請參考http://zy19982004.iteye.com/blog/2031172)。study-hadoop是一個普通project,直接運行(不通過Run on Hadoop這隻大象),一樣可以調試到MapReduce。
      1. 對hadoop中的文件可視化。
      2. 創建MapReduce Project時幫你引入依賴的jar。
      3. Configuration conf = new Configuration();時就已經包含了所有的配置信息。
  2. 還是自己下載hadoop2.2的源碼編譯好,應該是不會有任何問題的(沒有親測)。

 

六. 其它問題

 還是
Java代碼  收藏代碼
  1. Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z  
代碼跟到org.apache.hadoop.util.NativeCodeLoader.java去看
Java代碼  收藏代碼
  1. static {  
  2.   // Try to load native hadoop library and set fallback flag appropriately  
  3.   if(LOG.isDebugEnabled()) {  
  4.     LOG.debug("Trying to load the custom-built native-hadoop library...");  
  5.   }  
  6.   try {  
  7.     System.loadLibrary("hadoop");  
  8.     LOG.debug("Loaded the native-hadoop library");  
  9.     nativeCodeLoaded = true;  
  10.   } catch (Throwable t) {  
  11.     // Ignore failure to load  
  12.     if(LOG.isDebugEnabled()) {  
  13.       LOG.debug("Failed to load native-hadoop with error: " + t);  
  14.       LOG.debug("java.library.path=" +  
  15.           System.getProperty("java.library.path"));  
  16.     }  
  17.   }  
  18.     
  19.   if (!nativeCodeLoaded) {  
  20.     LOG.warn("Unable to load native-hadoop library for your platform... " +  
  21.              "using builtin-java classes where applicable");  
  22.   }  
  23. }  
 這裏報錯如下
Java代碼  收藏代碼
  1. DEBUG org.apache.hadoop.util.NativeCodeLoader - Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: HADOOP_HOME\bin\hadoop.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform  
 懷疑是32位jdk的問題,替換成64位後,沒問題了
Java代碼  收藏代碼
  1. 2014-03-11 19:43:08,805 DEBUG org.apache.hadoop.util.NativeCodeLoader - Trying to load the custom-built native-hadoop library...  
  2. 2014-03-11 19:43:08,812 DEBUG org.apache.hadoop.util.NativeCodeLoader - Loaded the native-hadoop library  
 這裏也解決了一個常見的警告
Java代碼  收藏代碼
  1. WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 






轉載 http://zy19982004.iteye.com/blog/2024467

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