0

我有一个问题出现在伪分布式模式下,但不是在独立模式下,我希望能就如何调试它提出一些想法。

我的一些映射器任务返回代码 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>

我的问题是失败是随机发生的,而不是在第一个映射器上。

不满意的想法包括:

  1. 不知何故,用我自己的方法替换 System.exit() 进行堆栈跟踪。(如何挂钩系统调用?)
  2. 只需继续尝试一个一个地调试映射器,并在调试下一个之前运行每个映射器以完成。(它可能会工作......)
  3. 跟踪 hadoop 中调用 System.exit() 的每个最后一个位置,并将不同的签名写入日志。(
  4. 使调试器端口号变量,这样,如果我能猜出哪个会失败并且延迟不会使错误消失,我可以附加到该 jvm 并对其进行调试。(很多 if,我不知道有什么方法可以在 .xml 文件中创建这个变量。)
  5. 如果可以预测在某次尝试时会发生故障,请在 jvm 启动之前中断任务跟踪器并手动编辑脚本文件。(危急时刻需要绝招)

关于如何使我的坏主意发挥作用的任何建议或想法?

4

1 回答 1

0

您可以尝试使用IsolationRunner重新运行失败的地图任务

如果它再次失败,您应该能够添加调试选项!

于 2013-07-18T08:32:58.153 回答