我正试图在当地的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
答案 0 :(得分:0)
事实证明我在hadoop-env.sh中设置了JAVA_LIBRARY_PATH错误。