Java 无法从分布式缓存Hadoop加载库

Java 无法从分布式缓存Hadoop加载库,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在这样做: DistributedCache.createSymlink(job.getConfiguration()); DistributedCache.addCacheFile(new URI ("hdfs:/user/hadoop/harsh/libnative1.so"),job.getConfiguration()); 在地图绘制程序中: System.loadLibrary("libnative1.so"); (我也试过 系统加载库(“libnative1”);

我正在这样做:

DistributedCache.createSymlink(job.getConfiguration()); 
DistributedCache.addCacheFile(new URI   
("hdfs:/user/hadoop/harsh/libnative1.so"),job.getConfiguration()); 
在地图绘制程序中:

System.loadLibrary("libnative1.so");
(我也试过 系统加载库(“libnative1”); 系统加载库(“native1”)

但我得到了这个错误:

java.lang.UnsatisfiedLinkError: no libnative1.so in java.library.path
我完全不知道应该将java.library.path设置为什么。。 我尝试将其设置为/home并复制了每个。因此,从分布式缓存复制到/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负责