1. 程式人生 > >MapReduce 程式在 Windows 本地模式下執行報錯問題的解決

MapReduce 程式在 Windows 本地模式下執行報錯問題的解決

一、報錯資訊

第一種:

Exception in thread "main" java.lang.RuntimeException: 
Error while running command to get file permissions : 
java.io.IOException: (null) entry in command string: 
null ls -F G:\hadooptest\input\order.txt

第二種:

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

第三種:

Exception in thread "main" java.io.IOException: 
(null) entry in command string: null chmod 0700 F:\tmp\hadoop-
ThinPeng\mapred\staging\ThinPeng1488563454\.staging

二、錯誤原因

以上錯誤出現的原因都是 MapReduce 在 Windows 環境下,bin 目錄缺少某些檔案導致(如 winutils.exe、hadoop.dll 等)

三、解決方法

1、到 hadoop 官網下載壓縮包後解壓,然後去網上搜索別人提供的相應版本的windows所需補充檔案放到 bin 目錄下。

(或者自己下載原始碼進行編譯)

(我也上傳了一個適合win10的 hadoop 完整包,2.7.6版本,下載地址:hadoop-2.7.6 for win10

2、配置環境變數:

HADOOP_HOME : E:\haoop-2.7.6

PATH 新增: %HADOOP_HOME%\bin

3、如果以上還不能解決問題,嘗試把你的 input 路徑寫到具體檔案試試?網上看到的,我沒重現出這個問題。

如:·

四、問題查詢分析

我一開始遇到的是第三種報錯,後來發現玩了那麼久,竟然是自己本地沒安裝 hadoop 環境,然後想起來之前可能一直是在虛擬機器叢集環境下執行的。雖然自己也網上搜索了一下解決方法,但是感覺有點亂,最後乾脆自己通過原始碼跟蹤,尋找問題所在。

本來想寫一段具體的原始碼分析的,結果不知道如何下手,直接上關鍵程式碼吧,具體可以自己手動斷點嘗試下,還是挺簡單的。

1、MapReduce 在執行過程中,需要操作 windows 檔案系統,在這個過程需要去獲取相關的執行命令,如下圖,發現這裡的 WINUTILS 為 null,後面的程式碼會對這個 String[] 進行檢查,如果存在為 null 的成員,就會報錯,這下知道錯誤資訊中 “null chmod 0700” 是怎麼來的了吧!

2、這個 WINUTILS 是怎麼來的呢?直接上圖了:

3、由上圖的 fullExeName 可知,這裡容易導致獲取檔案失敗的就是兩個地方:

(1)HADOOP_HOME_DIR 是否正確,即是否安裝了 HADOOP 並配置了環境變數“HADOOP_HOME”;

(2)bin 目錄下是否存在 winutils.exe。

4、對於其他兩種報錯,大概也都是跟第三種一樣的原因,說白了都是執行環境的問題。

五、擴充套件

其實,如果有配置好 log4j,也不需要上面的原始碼分析,從列印的錯誤日誌就能看出來具體是什麼問題了。可能許多人跟我一樣,只是想寫個小的程式體驗一下,就沒去配置日誌,導致沒能看到詳細的錯誤資訊。

具體如何配置,其實網上搜一下就有了,還是很簡單的,只是添加個配置檔案而已。

最終打印出來的日誌如下圖,是不是很清楚?就是跟你說 bin 目錄下找不到 winutils.exe~ :