源碼追蹤,解決Could not locate executable null\bin\winutils.exe in the Hadoop binaries.問題


在windows系統本地運行spark的wordcount程序,會出現一個異常,但不影響現有程序運行。

>>提君博客原創  http://www.cnblogs.com/tijun/  <<

總歸是一個異常,老是爆紅,看着心煩,下面是異常信息

提君博客原創

讓我們源碼追蹤一下,看看到底是什么原因導致,點擊第一行爆紅的異常信息提示,就是(shell.java:355)

看到我的截圖提示,大概了解什么原因了。發現HADOOP_HOME_DIR為null,右邊outline里面找到一個私有靜態變量叫HADOOP_HOME_DIR,

點擊看看是如何賦值的,

HADOOP_HOME_DIR他的初始化應該是調用了一個checkHadoopHome()的方法,找到這個方法的實現

在checkHadoopHome()這個方法實現里面,真相已經大白於天下了,方法里面需要找到一些系統配置信息,而我們程序里或系統里沒有給到。

提君博客原創

這就針對的解決就可以了。而且根據checkHadoopHome()這個方法的實現過程,我們可以得出兩種解決這個問題的方法。

>>提君博客原創  http://www.cnblogs.com/tijun/  <<

兩種方法的前提都是需要在本地解壓hadoop的安裝包的。

提君博客原創

我這里的解壓的是hadoop-common-2.2.0-bin-master.zip。

 

這里主要的還是需要在bin目錄下找winutils.exe。

第一種方法,

我們看到源碼292行,他是先從System.getProperty("hadoop.home.dir");這里獲得信息,

從他的注釋信息看

 // first check the Dflag hadoop.home.dir with JVM scope

首先檢查的應該是java虛擬機里面的這個hadoop.home.dir,

那我們就可以直接在程序開始執行出手動添加

System.setProperty("hadoop.home.dir", "D:\\Programe\\hadoop-common-2.2.0-bin-master");

注意:這段代碼要加到程序的開頭第一行

運行程序,剛剛的異常爆紅就不會出現了。

第二種方法,

從源碼296行的System.getenv("HADOOP_HOME");,不難看出,如果在虛擬機里面沒有找到hadoop.home.dir

那就從這行代碼獲得,從注釋信息來看

// fall back to the system/user-global env variable

那就是從系統的用戶全局變量里面找HADOOP_HOME這個配置。

那我們直接在Windows的系統變量里面配置HADOOP_HOME,然后在PATH里面配置HADOOP_HOME/bin

這種方法需要重啟計算機,運行程序,剛剛的異常爆紅就不會出現了。

至此,兩種方法任選其一,都是可以解決問題的

>>提君博客原創  http://www.cnblogs.com/tijun/  <<

提君博客原創

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM