我正在尝试运行需要共享库(.so文件)的MapReduce作业。如果我使用独立Java程序中的共享库,我根本就没有问题(这个程序使用java.library.path来查找库),但是如果我尝试使用MapReduce程序中的相同本机方法然后我获得了下面粘贴的异常(对于我正在使用分布式缓存的MapReduce程序)。
我知道实际上正在加载本机库,并且从MapReduce调用本机代码(C ++),因为本机函数会将某些内容打印到标准输出,但在本机函数返回后,我会看到" Signal抓住,退出" 消息然后应用程序日志只提供下面的信息(我认为255在这种情况下是-1)但是那个,我不知道在哪里否则寻找信息来调试这个问题或弄清楚为什么有一个未被捕获的信号。关于在哪里查找调试/日志信息的任何指示都表示赞赏。
容器启动的异常: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) 在 org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195) 在 org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:300) 在 org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81) 在java.util.concurrent.FutureTask.run(FutureTask.java:262)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)
使用非零退出代码255退出的容器
答案 0 :(得分:1)
显然,MR程序在运行shell程序时遇到问题。请检查C ++程序的正确性。
答案 1 :(得分:0)
我已经解决了自己的问题,但我不确定如何解释这个问题。在C ++中,我有一个方法,将指针作为jlong返回给Java(我正在将指针转换为jlong),当从独立应用程序调用库时,一切正常,但是当从Yarn调用时,相同的代码失败。
我编写了一个自定义信号处理程序,这帮助我知道这是一个段错误错误,所以我对指针或内存做错了。当我尝试从MapReduce(Yarn)调用同一个库时,我遇到了上一个异常。我将指针的转换更改为long而不是jlong,这就是我返回Java的内容。稍后,当调用本机对象的句柄时,问题不会再次发生。我不确定为什么这会有所帮助,但Yarn如何操纵环境会发生一些事情。
最好的问候。