我正在尝试在本地运行的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喘息
1条答案
按热度按时间gywdnpxw1#
结果证明,我在hadoop-env.sh中设置了java\ library\路径的方法不正确。