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 threads backtrace quit
(注明:如果要正确执行以上的脚本,必须让程序能输出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的信息了。