java - Hadoop 使用 JNI 运行 java 时出错

标签 java hadoop java-native-interface gpu

我尝试在 Hadoop 2.3.0 中运行一个利用 jni 调用 GPU 程序的 Java 程序,但出现以下错误:

java.lang.Exception: java.lang.UnsatisfiedLinkError: affy.qualityControl.PLM.wlsAcc([D[D[DII)V
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:529)
Caused by: java.lang.UnsatisfiedLinkError: affy.qualityControl.PLM.wlsAcc([D[D[DII)V
    at affy.qualityControl.PLM.wlsAcc(Native Method)
    at affy.qualityControl.PLM.rlm_fit_anova(PLM.java:141)
    at affy.qualityControl.PLM.PLMsummarize(PLM.java:31)
    at affy.qualityControl.SummarizePLMReducer.reduce(SummarizePLMReducer.java:59)
    at affy.qualityControl.SummarizePLMReducer.reduce(SummarizePLMReducer.java:12)
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171)
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$ReduceTaskRunnable.run(LocalJobRunner.java:319)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    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)

我猜这个错误是在 JNI 上引起的。我写了一个小的测试 Java 代码来通过 JNI 调用我的 GPU 代码 (wlsAcc),它工作正常。我还 ldd 我的 GPU 共享库,每个库都是链接的。我还在我的 MapReduce 代码中添加了以下代码(我的 GPU 代码在 Reducer 中调用):

    setInputParameters(conf, args);
    DistributedCache.createSymlink(conf);
    DistributedCache.addCacheFile(new URI("/user/sniu/libjniWrapper.so#libjniWrapper.so"), conf);
    conf.set("mapred.reduce.child.java.opts", "-Djava.library.path=.");

我还将 libjniWrapper.so 复制到/user/sniu/目录下的 HDFS。我仍然不明白为什么 hadoop 找不到我的本地共享库。有谁知道我的问题在哪里?

最佳答案

现在问题解决了,问题是对于原生C代码,原来我是这样写的:

JNIEXPORT void JNICALL Java_jniWrapper_wlsAcc

相反,正确的方法应该是:

JNIEXPORT void JNICALL Java_affy_qualityControl_jniWrapper_wlsAcc

关于java - Hadoop 使用 JNI 运行 java 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23743860/

相关文章:

hadoop - 如何使用配置单元从文件中删除 ^A 和\N

java - 我无法使用 JNA 访问 Java 代码中的 Visual Basic DLL 方法

android - 在 Linux 桌面上运行 Android NDK 二进制文件

java - 如何在没有新数组的情况下对数组进行排序?

java - JTable 列标题本地化

java - HTML for Java 组件应该如何引用资源?

java - 从 jSF 中的 ActionListener 重定向

java - Hadoop mapReduce 如何在 HDFS 中只存储值

hadoop - Hadoop WikipediaPageInputFormat

java - Eclipse - 加载 JNI 共享库失败