點擊查看原文
Hadoop提供若干種在調試HadoopStreaming的方法,供你使用,方便你快速定位問題。
- 讓HadoopStreaming程式跑在開發機上。(推薦在開發時使用)
在jobconf中加上mapred.job.tracker=local。資料的輸入和輸出都是來自HDFS
此時,HadoopStreaming會在本地運行程式
- 保留出錯的現場(推薦在跑大資料量時使用)
通過設定jobconf參數keep.failed.task.files=true,當程式出錯時,可以保留現以供
Debug。可以通過GUI查到到具體是在哪個節點運行失敗,然後登陸到該節點<local>/taskTracker/<taskid>/work/ ,查看core檔案。
- 通過script程式收集資訊來偵錯工具(推薦在開發時使用)
編寫調試指令碼程式,通過指令碼,可以把程式執行過程中任何現場都保留下來,比如
Core檔案的堆棧資訊,這樣可以確定程式具體是在什麼地方出錯。
指令碼的調用方式如下:$script $stdout $stderr $syslog $jobconf 程式名
(註:在官方文檔
http://wiki.apache.org/hadoop/HowToDebugMapReducePrograms 描述中程式名會通過第5個參數返回,但筆者在Hadoop 0.19的測試環境中,得到這個參數是空的。)
指令碼樣本:
core=`find . -name 'core*'`;cp $core /home/admin/gdb -quiet ./a.out -c $core -x ./pipes-default-gdb-commands.txt
pipes-default-gdb-commands.txt註明了執行的gdb命令
info threadsbacktracequit
(註明:如果要正確執行以上的指令碼,必須讓程式能輸出core檔案,可以在程式中加入如下程式碼片段)
struct rlimit limit;limit.rlim_cur = 65535;limit.rlim_max = 65535;if (setrlimit(RLIMIT_CORE, &limit) != 0) { printf("setrlimit() failed with errno=%s\n", strerror(errno)); exit(1);}然後在jobconf中,把要執行的script賦給變數”mapred.map.task.debug.script”或”mapred.reduce.task.debug.script”。 這樣當HadoopStreaming執行過程發生core dump,就可以通過JobTracker的GUI介面看到GDB的資訊了。