我正在这样做:
DistributedCache.createSymlink(job.getConfiguration());
DistributedCache.addCacheFile(new URI
("hdfs:/user/hadoop/harsh/libnative1.so"),job.getConfiguration());
在映射器中:
System.loadLibrary("libnative1.so");
(我也试过System.loadLibrary("libnative1");System.loadLibrary("native1");
但是我收到此错误:
java.lang.UnsatisfiedLinkError: no libnative1.so in java.library.path
我完全不知道我应该将java.library.path设置为..我尝试将其设置为/home 并将每个 .so 从分布式缓存复制到/home/但仍然无法正常工作:(
请问有什么建议/解决方案吗?
使用 Hadoop ToolRunner 接口;这将使您能够通过命令行参数将共享库添加到分布式缓存中,并在映射器启动之前在任务节点上正确设置 Java 库路径。这就是我设置映射器以使用共享库的方式:
让作业类(包含main()方法)实现org.apache.hadoop.util.Tool接口。 像这样:
public class Job extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
/* create the Hadoop Job here */
}
public static void main(String[] args) {
int ret;
try {
ret = ToolRunner.run(new Job(), args);
} catch (Exception e) {
e.printStackTrace();
ret = -1;
}
System.exit(ret);
}
}
运行 hadoop 作业时,将所有共享库(本地副本)作为命令行参数。确保也列出实际文件(如果这些是符号链接)。Hadoop 会在启动作业之前将 -files 参数中给出的所有文件复制到分布式缓存中。
hadoop jar Job.jar -files libnative1.so,libnative1.so.0,libnative1.so.0.1
Mapper不需要任何特殊的调用来设置java.library.path;它由hadoop负责。