Hadoop下遠程調試Child子進程 --- 原創

在網上想找Hadoop遠程調試Child子進程的文章,但是都沒有見到具體步驟是如何操作的,對於初學者來說,要想真正理解MapReduce的shuffle的過程,對Child子進程的調試是必不可少的一項任務,至少對我來說是這樣。費了九牛二虎之力,最後終於調試成功,在這裏寫下經驗,分享給後面的hadoop學習愛好者。


我的環境:hadoop-0.20.2

                    ubuntu 11.04

                   在eclipse下安裝了hadoop插件進行調試

                   這裏要說一下,我的eclipse版本是很老的eclipse3.3.1,hadoop插件版本是hadoop-0.20.2中自帶的插件,路徑:/hadoop-0.20.2/contrib/eclipse-plugin/hadoop-0.20.2-eclipse-plugin.jar,直接這個插件拷貝到eclipse的plugin目錄後重啓eclipse就可。之所以使用eclipse3.3.1版本的eclipse是因爲,hadoop-0.20.2的eclipse插件對eclipse版本要求較高,需要版本匹配才能運行,我試過在eclipse helio中安裝這個插件,但是不能使用,其他版本的eclipse我暫時還沒試過,不好意思。


前言

1、hadoop的安裝和啓動過程我在這裏就不詳述了,可以參考官方文檔 http://hadoop.apache.org/common/docs/r0.19.2/cn/quickstart.html

2、hadoop的eclipse插件的安裝和使用過程我這裏也不詳述了,可以參考網上的很多文章,比如:http://blog.sina.com.cn/s/blog_537770820100byho.html


一、tasktracker的debug模式配置和Chlid子進程的debug模式配置

1.1  先對tasktracker進行debug,在hadoop.sh中找到 elif [ "$COMMAND" = "tasktracker" ] ,並添加tasktracker的調試端口如下:

elif [ "$COMMAND" = "tasktracker" ] ; then
  CLASS=org.apache.hadoop.mapred.TaskTracker
  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_TASKTRACKER_OPTS
    -agentlib:jdwp=transport=dt_socket,address=8200,server=y,suspend=y"

1.2  看下圖,在eclipse hadoop插件的參數配置中,修改mapred.child.java.opts的參數值爲(紅線部分):-Xmx 200m -agentlib:jdwp=transport=dt_socket,address=8883,server=y,suspend=y

紅線部分表示Child子進程的啓動端口爲8883,這裏的suspend=y是必須的,表示Child子進程啓動後會等待遠程的debug信息發送過來後再執行代碼,因此在發送debug信息之前我們可以在eclipse中下斷點,這一點很重要。


二、debug模式啓動程序和斷點

2.1  我使用的是最簡單的WordCount例子來進行講解,如下圖


Run on Hadoop後出來的結果如下,讓你選擇你自己的配置信息,這裏要保證1.2節中配置的項處在第一個選擇,這樣當你要debug代碼的時候,可以選擇你配置過的那個,默認是第一個配置項。


2.2   在JvmManager類的第249行和250行各下一個斷點,如下圖

spawnNewJvm表示重啓一個Child子進程,這裏是重點。在ubuntu控制檯中執行如下命令:ps -aux | grep java,會發現有一個child子進程啓動了,如下圖


 attempt_201201272353_0003_m_000005_0 -1032262400 這是進程號,在eclipse的debug窗口下,也可以看到這個進程

這時候,進程啓動了,但是還沒執行代碼。在通過eclipse的遠程調試鏈接到我們剛啓動的Child子進程之前我們要先在Child.java的代碼中下斷點,如下:


在113行下個斷點,下完斷點後我們在我們在eclipse下遠程調試,鏈接到這個進程,我們之前設定的端口是8883,如下圖:



注意,按上面的步驟走的話務必在113行這裏下斷點,JvmTask myTask = umbilical.getTask(jvmId);這段代碼是通過taskTracker獲取對應的Map任務,但是別忘記我們之前在taskTracker上下了斷點,taskTracker正處於debug模式,這時候執行這段代碼,Child進程會被阻塞。按F6讓debug往下走,Child進程阻塞在了taskTracker處,這時候我們回到eclipse的debug窗口,找到taskTracker進程並選中(如下圖),按F5讓taskTracker往下走,這時候Child子進程就會解除阻塞走過113行就OK了。


繼續在MapTask的run(final JobConf job, final TaskUmbilicalProtocol umbilical)方法裏面下斷點,Child子進程就能調試到MapReduce的Shffle階段了。


以上是自己在學習過程中的調試經驗,希望對大家有幫助,語言和圖解都比較粗糙,有些地方難免有遺漏,還望多多指正。






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