Java 使用Eclipse调试多个hadoop JVM

Java 使用Eclipse调试多个hadoop JVM,java,eclipse,hadoop,multiprocessing,Java,Eclipse,Hadoop,Multiprocessing,我有一个问题出现在伪分布式模式下,但不是在独立模式下,我希望能对如何调试这个问题有一些想法 我的一些映射程序任务返回代码143。我想在System.exit()上放置一个断点,看看是谁在调用它,为什么,但我必须让调试器在该映射器上运行 通过修改bin/hadoop脚本并远程连接到localhost:5000,我可以在调试器中启动任务跟踪器: ... elif [ "$COMMAND" = "tasktracker" ] ; then CLASS=org.apache.hadoop.mapre

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

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

<property>
  <name>mapred.map.child.java.opts</name>
  <value>-Xdebug -Xrunjdwp:transport=dt_socket,address=5001,server=y,suspend=y</value>
</property>

mapred.map.child.java.opts
-Xdebug-Xrunjdwp:transport=dt_套接字,地址=5001,服务器=y,挂起=y
我的问题是失败是随机发生的,而不是在第一个映射器上

脑海中浮现的不令人满意的想法包括:

  • 以某种方式将System.exit()替换为我自己的进行堆栈跟踪的方法。(如何钩住系统调用?)
  • 只需一个接一个地调试映射程序,并在调试下一个映射程序之前将每个映射程序运行到完成。(可能有用…)
  • 追踪hadoop中调用System.exit()的最后一个位置,并将不同的签名写入日志。(恶心)
  • 将调试器端口号设置为变量,这样,如果我能猜出哪一个会失败,并且延迟不会使错误消失,我就可以连接到该jvm并对其进行调试。(很多if,我不知道如何在.xml文件中创建这个变量。)
  • 如果可以预测某次尝试会发生失败,请在jvm启动之前中断任务跟踪器并手动编辑脚本文件。(绝望的时刻需要采取绝望的措施)

  • 关于如何让我的坏主意在上面发挥作用,有什么建议或想法吗?

    您可以尝试使用重新运行失败的映射任务

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