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



我正在这样做:

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负责。

相关内容

  • 没有找到相关文章

最新更新