在hadoop上运行java本机库

3npbholx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(418)

我正在尝试在本地运行的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\u library\u 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)

我试过很多不同的方法。我在hadoop运行命令中添加了“-djava.library.path=/home/username/system/gurobi563/linux64/lib”。我已经在hadoop-env.sh中设置了所需的环境变量。我尝试从代码级别加载*.so文件(例如使用system.load(“/home/username/system/gurobi563/linux64/lib/libgurobijni56.so”);)。我还尝试将这些库发送到hadoop分布式文件系统,从该位置加载文件或将环境变量指向该位置。
我正在使用:
java版本“1.7.0\U 60”
hadoop-0.20.2-cdh3u6
debian 7.5喘息

gywdnpxw

gywdnpxw1#

结果证明,我在hadoop-env.sh中设置了java\ library\路径的方法不正确。

相关问题