0
我有一個問題出現在僞分佈式模式,但不是在獨立模式下,我希望能夠抓住一些關於如何調試的想法。使用Eclipse調試多個hadoop jvms
我的一些mapper任務返回代碼143。我很想在System.exit()上放一個斷點,看看誰在調用這個原因,但我必須讓調試器在那個mapper上運行。
我可以修改我的斌/ Hadoop的腳本和遠程連接到本地主機獲得任務跟蹤了在調試器:5000:
...
elif [ "$COMMAND" = "tasktracker" ] ; then
CLASS=org.apache.hadoop.mapred.TaskTracker
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_TASKTRACKER_OPTS"
# TBMark!
HADOOP_OPTS="$HADOOP_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=n"
...我能得到第一映射器(或由小調整,減速機)到Eclipse加入到這一點我的conf/mapred-site.xml中和遠程連接到本地主機:5001:
<property>
<name>mapred.map.child.java.opts</name>
<value>-Xdebug -Xrunjdwp:transport=dt_socket,address=5001,server=y,suspend=y</value>
</property>
我的問題是,故障發生在隨機的,不是第一次映射。
浮現在腦海中的想法不滿意包括:
- 不知怎的,用我自己的方法,做一個堆棧跟蹤取代System.exit()的。 (如何掛鉤系統調用?)
- 只要繼續嘗試逐個調試映射器並在調試下一個之前運行每個映射器即可完成。 (它可能可能工作...)
- 跟蹤hadoop中調用System.exit()的每一個最後的地方,並寫一個獨特的簽名到日誌。 (Yuck)
- 使調試器端口號變量,如果我能猜測哪一個將會失敗,並且延遲不會導致錯誤消失,我可以附加到該jvm並調試它。 (許多if,我不知道用什麼方法在.xml文件中生成這個變量)
- 如果某個嘗試失敗可能會發生,那麼在jvm啓動和手動編輯之前打破任務跟蹤器腳本文件。 (絕望的時代需要絕望的措施)
任何關於如何使我的不良想法上面的工作建議或想法?