在Hadoop上运行Java Native库

时间:2014-06-18 15:29:20

标签: java hadoop java-native-interface

我正试图在当地的hadoop上运行Gurobi优化器。 Gurobi使用JNI。为了测试如何在hadoop上运行它,我已经编写了以下代码。

  public static void main(String[] args) throws Exception {
    try {
      GRBEnv env2 = new GRBEnv();
      env2.set(GRB.IntParam.OutputFlag, 0);
    } catch (Exception e) {
      e.printStackTrace();
    }

    Configuration conf = new Configuration();
    int res = ToolRunner.run(conf, new GurobiTest(), args);
    System.exit(res);
}

在使用之前,Gurobi需要设置一些环境变量(LD_LIBRARY_PATH指向Gurobi本地库):

export LD_LIBRARY_PATH=/home/username/System/gurobi563/linux64/lib
export GRB_LICENSE_FILE=/home/username/gurobi.lic

当我打包我的项目并使用jvm

运行它时
java -cp ./target/GurobiOnHadoop-0.0.1-SNAPSHOT-jar-with-dependencies.jar mpi.de.test.GurobiTest
一切似乎都运转良好

但是当我试图在hadoop上运行它时

hadoop jar ./target/GurobiOnHadoop-0.0.1-SNAPSHOT-jar-with-dependencies.jar mpi.de.test.GurobiTest -libjars ./target/GurobiOnHadoop-0.0.1-SNAPSHOT-jar-with-dependencies.jar

我收到错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no GurobiJni56 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at gurobi.GurobiJni.<clinit>(GurobiJni.java:193)
    at gurobi.GRBEnv.<init>(GRBEnv.java:16)
    at gurobi.GRBEnv.<init>(GRBEnv.java:11)
    at mpi.de.test.GurobiTest.main(GurobiTest.java:89)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:197)

我尝试过很多不同的事情。我已将&#34; -Djava.library.path = / home / username / System / gurobi563 / linux64 / lib&#34; 添加到hadoop running命令中。我已在 hadoop-env.sh 中设置了所需的环境变量。我尝试从代码级别加载* .so文件(使用例如 ystem         .load(&#34; /home/username/System/gurobi563/linux64/lib/libGurobiJni56.so"); )。我还尝试将这些库发送到hadoop分布式文件系统,从该位置加载文件或将环境变量指向该位置。

我正在使用:

java version&#34; 1.7.0_60&#34;

的hadoop-0.20.2-cdh3u6

Debian 7.5 wheezy

1 个答案:

答案 0 :(得分:0)

事实证明我在hadoop-env.sh中设置了JAVA_LIBRARY_PATH错误。