1

我正在这样做:

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/ 但它仍然不起作用:(

请问有什么建议/解决方案吗?

4

1 回答 1

3

使用 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 处理。

于 2012-04-20T20:29:38.877 回答