在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/ <<