Map/Reduce Task 遠端除錯詳解
MapTask和ReduceTask都是TaskTracker的Child程序,MapTask, ReduceTask和 TaskTracker是彼此完全獨立的JVM。
在MapReduce任務執行過程中他們之間由兩個RPC協議進行通訊,分別是TaskUmbilicalProtocol(Map/Reduce Task與TaskTracker之間通訊)與InterTrackerProtocol(TaskTracker與JobTracker之間通訊)。
首先在啟動MapReduce服務的時候,TaskTracker與JobTracker兩個JVM就已經啟動了。執行一個Job的時候,TaskTracker會啟動相應的JVM來執行Map/Reduce Task。
一. 關於除錯 Map/Reduce Task:
有三個與此相關的屬性,分別是:(1) mapred.child.java.opts (2) mapred.map.child.java.opts (3) mapred.reduce.child.java.opts 在conf/mapred-site.xml中新增相應的屬性就可以進行對Map/Reduce Task的遠端除錯。
Step 1. 首先作為遠端除錯的第一步就是將hadoop的程式碼匯入eclipse。
Step 2. 配置Hadoop遠端除錯
2.1. 如果希望遠端除錯MapTask:
在conf/mapred-site.xml檔案中加入以下配置,一定要放在<configuration></configuration>之間。
之後提交job,job就會在map 0% reduce 0%的時刻停下來等待遠端除錯的debugger。
這時候在eclipse中設定相應斷點和遠端除錯,對localhost的8883埠進行遠端除錯。
2.2. 如果希望遠端除錯ReduceTask:
在conf/mapred-site.xml檔案中加入以下配置,一定要放在<configuration></configuration>之間。
之後提交job,job就會在map 100% reduce 0%的時刻停下來等待遠端除錯的debugger。
這時候在eclipse中設定相應斷點和遠端除錯,對localhost的8884埠進行遠端除錯。
如果成功,程式的控制權則會進入相應的斷點。之後就可以進行單步跟蹤除錯Task了。
二. 關於除錯 JobTracker/TaskTracker:
對於 TaskTracker, 修改 $HADOOP_HOME/conf/hadoop-env.sh 檔案,在其中新增
之後執行 $HADOOP_HOME/bin/stop-mapred.sh,$HADOOP_HOME/bin/start-mapred.sh 重啟MapReduce服務就可以對TaskTracker進行設斷點除錯了。
同樣的,對於 JobTracker, 修改 $HADOOP_HOME/conf/hadoop-env.sh 檔案,在其中新增
之後執行 $HADOOP_HOME/bin/stop-mapred.sh, $HADOOP_HOME/bin/start-mapred.sh 重啟MapReduce服務就可以對JobTacker進行設斷點除錯了。
需要注意的是,如果希望讓Task(MapTask或者ReduceTask)暴露遠端除錯埠的話,那麼在這個node上任意時刻必須只有一個Task在執行,否則在一個node上會有多個並行的Task同時監聽同一個遠端除錯埠,將會產生埠錯誤並導致Task以及整個Job失敗。 可以通過修改mapred.tasktracker.map.tasks.maximum和 mapred.tasktracker.reduce.tasks.maximum 屬性為1,來強制控制單個node並行的Task數量為1 。
三. 在Hadoop-2.2.0及以上版本中,由於不再有JobTracker以及TaskTracker的概念和角色(已經替換成ResourceManager和NodeManager),所以在這些版本中已經不再存在 mapred.tasktracker.map.tasks.maximum 和mapred.tasktracker.reduce.tasks.maximum 這兩個屬性。那麼如何強制設定並行的Task數量為1來進行遠端除錯呢?
在Hadoop-2.2.0中,現在可以通過修改 yarn-site.xml 這個檔案中的屬性來控制並行的Task數量。
上面這個屬性設定單個node擁有的可分配的記憶體數量為4GB。
上面這個屬性設定單個container最少獲得的記憶體數量為2GB。
執行stop-yarn.sh和start-yarn.sh來重啟yarn服務,之後執行job就會發現任意時刻一個node上只有一個Task在執行。