【发布时间】:2012-07-16 07:22:16
【问题描述】:
我有一个问题出现在伪分布式模式下,但不是在独立模式下,我希望就如何调试它提出一些想法。
我的一些映射器任务返回代码 143。我很想在 System.exit() 上放置一个断点,看看是谁在调用它,但我必须让调试器在该映射器上运行。
我可以通过修改我的 bin/hadoop 脚本并远程连接到 localhost: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"
...我可以通过将它添加到我的 conf/mapred-site.xml 并远程连接到 localhost:5001 来将第一个映射器(或通过小调整,reducer)放入 Eclipse:
<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() 的最后每个位置,并将不同的签名写入日志。 (呸)
- 使调试器端口号可变,这样,如果我能猜到哪个会失败并且延迟不会使错误消失,我可以附加到该 jvm 并对其进行调试。 (很多 if,我不知道有什么方法可以在 .xml 文件中创建这个变量。)
- 如果可以预测在某次尝试中会发生故障,请在 jvm 启动之前中断任务跟踪器并手动编辑脚本文件。 (危急时刻需要采取危急措施)
关于如何让我上面的坏主意发挥作用有什么建议或想法吗?
【问题讨论】:
标签: java eclipse hadoop multiprocessing