標籤:
劉勇 Email: [email protected]
本部落格記錄作者在工作與研究中所經曆的點滴,一方面給自己的工作與生活留下印記,另一方面若是能對大家有所協助,則幸甚至哉矣!
簡介
鑒於最近在研究Hadoop編程時,為考慮編程的方便,在Windows本地編譯來源程式,然後直接存取Hadoop叢集,這樣給廣大編程人員提供了極大的便利。在這個過程中積累了一些實際經驗,並針對在該過程中(初級階段)可能會遇到的問題,提供一些解決方案,希望對大家有所協助。
環境介紹
Hadoop 叢集:hadoop 2.7.1, Cent OS 6.5,jdk 1.7
eclipse 環境:Windows 7, eclipse LUNA,jdk 1.8
環境搭建
1) 安裝eclipse hadoop 外掛程式
從網路上下載與hadoop 版本相同的外掛程式,如hadoop-eclipse-plugin-2.7.1.jar, 並將其拷貝至eclipse 安裝目錄中plugins,如D:\Program\eclipse\plugins,然後重啟eclipse。
2) 配置mapreduce外掛程式
Windows—>Preference—>Hadoop Map/Reduce,本文配置Hadoop處理目錄在D:\hadoop。需要指出,該目錄指出後續編譯來源程式所需的相關jar包以及所需的庫檔案(Windows編譯所需)。
3) 切換視角
Windows—>Open Perspective—>Other。
4) 配置Map/Reduce Locations
該部分配置在Windows下訪問hadoop 叢集的位置及相關資訊。點擊Map/Reduce Locations—>New Hadoop Locations—>General。參數配置過程中,需要關心方框中的Host 與Port,必須與Hadoop叢集中Master與DFS配置保持一致。至於User name一般建議採用hadoop 叢集安裝的使用者名稱hadoop,並在Windows使用者與組中將administrator修改為hadoop能省掉很多不必要的麻煩。本文採用Windows下使用者名稱root,後續將針對問題介紹(見FAQ 5)。
Map/Reduce Locations—>New Hadoop Locations—>Advanced parameters。配置過程中,只需關心方框中hadoop.tmp.dir 必須與hadoop叢集core-site.xml配置一致。至此,eclipse Hadoop 外掛程式已安裝完畢。
5) 測試與驗證
在工程導覽列,展開DFS Locations,若能看到使用者通過hadoop fs 操作命令在hadoop叢集上對檔案做出的操作,則該外掛程式安裝完成。
編程異常與解決方案
經本文作者在編程過程中實際經驗,寫好的程式在hadoop 叢集下(Linux環境中叢集本地)能夠訪問,但是為編程的方便,將其編寫於Windows下時可能會出現問題,下面結合作者的實際經驗,給出相應解決方案。
1) FAQ:java.lang.NullPointerException
出現該異常是因為,在Windows下編譯時間會有hdfs臨時檔案存在,因此造成無法辨識該檔案系統類型。
解決方案:從網路上下載與hadoop 版本號碼相同的hadoop.lib、winutils.exe等檔案,並將其拷貝至hadoop 目錄bin,如D:\hadoop\bin,以及Windows系統中,如C:\Windows\System32,同時需要注意下載的檔案需要與CPU位元對應,即32位或64位。本文作者曾因CPU位元的問題折騰了許久。此外,本文作者給出一個最為保險的建議,採用Windows SDK將Hadoop 源碼在Windows 本地編譯一下,然後提取上述lib、exe檔案,則該問題迎刃而解。
2) FAQ:java.lang.UnsatisfiedLinkError:
進一步分析,出現該異常是因為,在Windows中無合適的解析hdfs臨時檔案的問題,因此出現該情況,可能是hadoop.lib與hadoop叢集版本不對,另一方面,可能是與CPU位元不一致。
解決方案:從網路上找到正確的版本檔案,或者在本地重新編譯hadoop 源碼。
3) FAQ:org.apache.hadoop.mapreduce.lib.input.InvalidInputException
出現該異常是因為對hdfs檔案系統目錄的組織,不明確所致,若不指明hdfs,則以Windows下路徑作為其預設路徑名。
解決方案:在eclipse 工程目錄欄中展開DFS Locations,逐級寫出最終檔案的位置,如test檔案,則為hdfs://192.168.101.244:9000/user/root/input,需要加上hdfs://ip:port。
4) FAQ:java.lang.UnsupportedClassVersionError
出現該異常,則因為在Windows上編譯的Hadoop程式與Hadoop叢集上採用的JDK版本不一致。
解決方案:先查看Hadoop叢集上jdk版本,然後在Windows上安裝相同版本的即可。如本文Window上採用jdk 1.8,而hadoop 叢集上採用jdk1.7,則在Windows上安裝jdk 1.7,並對所需執行的工程,修改Build Path 和Compeler,並將其設為Java SE 1.7,之後重新編譯即可。
5) FAQ:org.apache.hadoop.security.AccessControlException: Permission denied
程式運行後異常停止,無任何輸出結果,出現該異常,則因為在本地訪問hadoop hdfs時沒有許可權,因此在許可權部分拒絕訪問而退出,如,本文的root沒有配置許可權訪問hdfs,故而看不到資料結果,此外,很多使用者不太喜歡預設的使用者名稱hadoop, 因此設定許可權顯得比較重要。
解決方案:本文基於測試環境,為圖簡便,修改叢集的core-site.xml,如所示,將hdfs檔案系統的訪問許可檢查關閉。但是,在實際應用中,則根據應用情境進行設定。
Windows下Hadoop編程環境配置指南