最簡單的調試學習Hadoop Examples的方法

Hadoop Examples

Hadoop 自帶了MapReduce 的 Examples 等程序(hadoop-mapreduce-examples), 當下載 hadoop源碼 後,網上有很多介紹搭建環境並進行調試的文章。但大部分是將 WordCount.java 等程序打包成 jar 文件後,通過 org.apache.hadoop.util.Runjar 類運行並調試。

但實際上,hadoop-mapreduce-examples 中提供的每個示例程序都有main函數,而且通過pom.xml已經設置好了依賴關係,如果能直接調試運行那些程序,豈不是最方便。

問題分析和解決步驟(授人以漁)

使用 Idea 打開 hadoop-mapreduce-examples 或 hadoop 的POM工程後,打開 hadoop-mapreduce-project/hadoop-mapreduce-examples/src/main/java/org/apache/hadoop/examples/WordCount.java 文件,直接點擊main函數前面表示運行 “>” 的 Gutter Icons(如圖1):
運行程序

通常,這個時候不會運行成功,會提示如圖2所示的“NoClassDefFoundError”等錯誤,很多人就認爲Map/Reduce 程序只能在Hadoop框架中運行,直接放棄。
NoClassDefFoundError

仔細分析一下 hadoop-mapreduce-examples 中的依賴關係,可以發現 WordCount.java 運行時需要的 hadoop-common 庫的Scope是 “Provided” 方式(如圖3),檢查一下其pom.xml 文件(如圖4),確實如此:
依賴關係
pom.xml

這個時候立刻知道,將Scope刪除或改爲默認的compile有可能就能解決這個問題(具體原因,如果不清楚的建議學習以下Maven的Scope概念)。更改後重新運行 WordCount.java 程序,發現錯誤日誌果然不一樣(提示運行時參數不滿足需求),已經能夠進入main了。
能進入main

最後,對項目進行最後的改動:
1.通過命令行的方式提供 args 參數 – 這樣方便在代碼中隨時更改;
2.通過 FileSystem 來自動刪除輸出目錄 – 避免每次運行前都要手動刪除或可能的報錯
3.建立resource目錄,並拷貝進log4j.properties,這樣可以顯示日誌信息
4.在項目的根目錄下建立輸入目錄(input – 具體目錄位置可通過 new File(“”).getAbsolutePath() 獲得)和輸出目錄,並拷貝進需要測試的文件。
此時重新運行程序,沒有問題的話,即可順利運行了。然後可用同樣的方式調試 hadoop-mapreduce-examples 中的所有示例來學些Hadoop的使用了。
最後的改動

注意事項

本方法可以很容易的調試MapReduce程序,但由於默認使用的是單機模式,因此不能直接調試 HDFS 相關的代碼.
後續如果研究出簡易調試HDFS方法的話,再進行共享.

總結

綜上所述,下載hadoop源碼後,更改 hadoop-mapreduce-examples 項目pom.xml 中的scope,即可很方便的調試其程序了,而其最方便的地方在於,可以隨時更改並測試Hadoop的源碼,大大提高學習Hadoop的效率。

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