MapReduce 作业因 ExitCodeException exitCode=255 而失败
MapReduce job fails with ExitCodeException exitCode=255
我正在尝试 运行 需要共享库(.so 文件)的 MapReduce 作业。如果我使用独立 Java 程序中的共享库,我根本没有问题(该程序使用 java.library.path 来查找库),但是如果我尝试使用来自MapReduce 程序然后我获得我在下面粘贴的异常(对于我使用分布式缓存的 MapReduce 程序)。
我知道本机库实际上正在加载并且本机代码 (C++) 是从 MapReduce 调用的,因为本机函数将某些内容打印到标准输出但是在本机函数 returns 之后我看到 "Signal caught, exiting" 消息,然后应用程序日志仅提供以下信息(我认为在这种情况下 255 是 -1)但仅此而已,我不知道还能在哪里查看有关调试此问题或找出未捕获信号原因的信息。任何关于在哪里寻找 debugging/log 信息的指示都将受到赞赏。
Exception from container-launch: ExitCodeException exitCode=255:
ExitCodeException exitCode=255: at
org.apache.hadoop.util.Shell.runCommand(Shell.java:538) at
org.apache.hadoop.util.Shell.run(Shell.java:455) at
org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
at
org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195)
at
org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:300)
at
org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)
at java.util.concurrent.FutureTask.run(FutureTask.java:262) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
容器以非零退出代码 255 退出
很明显,MR 程序在运行 shell 程序时遇到了问题。请检查您的 C++ 程序是否正确。
我已经解决了我自己的问题,但我不确定如何解释这个问题。在 C++ 中,我有一个方法 returns 到 Java 作为 jlong 的指针(我将指针转换为 jlong)并且当从独立应用程序调用库时一切正常,但是相同的代码从 Yarn 调用时失败。
我写了一个自定义信号处理程序,它帮助我知道这是一个段错误,所以我对指针或内存做错了什么。当我尝试从 MapReduce (Yarn) 调用相同的库时,我遇到了之前的异常。我将指针的转换更改为 long 而不是 jlong,这就是我返回到 Java 的内容。后来,当调用本机对象的句柄时,问题没有再次发生。我不确定为什么这会有所帮助,但是 Yarn 如何操纵环境正在发生一些事情。
此致。
我正在尝试 运行 需要共享库(.so 文件)的 MapReduce 作业。如果我使用独立 Java 程序中的共享库,我根本没有问题(该程序使用 java.library.path 来查找库),但是如果我尝试使用来自MapReduce 程序然后我获得我在下面粘贴的异常(对于我使用分布式缓存的 MapReduce 程序)。
我知道本机库实际上正在加载并且本机代码 (C++) 是从 MapReduce 调用的,因为本机函数将某些内容打印到标准输出但是在本机函数 returns 之后我看到 "Signal caught, exiting" 消息,然后应用程序日志仅提供以下信息(我认为在这种情况下 255 是 -1)但仅此而已,我不知道还能在哪里查看有关调试此问题或找出未捕获信号原因的信息。任何关于在哪里寻找 debugging/log 信息的指示都将受到赞赏。
Exception from container-launch: ExitCodeException exitCode=255: ExitCodeException exitCode=255: at org.apache.hadoop.util.Shell.runCommand(Shell.java:538) at org.apache.hadoop.util.Shell.run(Shell.java:455) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702) at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:300) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
容器以非零退出代码 255 退出
很明显,MR 程序在运行 shell 程序时遇到了问题。请检查您的 C++ 程序是否正确。
我已经解决了我自己的问题,但我不确定如何解释这个问题。在 C++ 中,我有一个方法 returns 到 Java 作为 jlong 的指针(我将指针转换为 jlong)并且当从独立应用程序调用库时一切正常,但是相同的代码从 Yarn 调用时失败。
我写了一个自定义信号处理程序,它帮助我知道这是一个段错误,所以我对指针或内存做错了什么。当我尝试从 MapReduce (Yarn) 调用相同的库时,我遇到了之前的异常。我将指针的转换更改为 long 而不是 jlong,这就是我返回到 Java 的内容。后来,当调用本机对象的句柄时,问题没有再次发生。我不确定为什么这会有所帮助,但是 Yarn 如何操纵环境正在发生一些事情。
此致。