在Hadoop Mapreduce中使用本机共享库:java.library.path中没有XXX

时间:2015-03-12 02:49:20

标签: hadoop mapreduce

最近我试图在hadoop Map任务中使用本机共享库,但是hadoop总是无法加载它。 我像这样运行我的hadoop jar:

hadoop jar my.jar -files libMylib.so

在Map任务中,我尝试这样做:

System.loadLibrary("Mylib"); // have tried to ues "libMylib.so" too

我总是得到以下错误:

no Mylib in java.library.path

我在应用程序(main函数)中打印java.library.path:

System.out.println(System.getProperty("java.library.path"));

得到这个:

/usr/local/hadoop/libexec/../lib/native/Linux-amd64-64

但是在官方文档中,我读到了这个

  

child-jvm总是将其当前工作目录添加到   java.library.path和LD_LIBRARY_PATH。

为什么java.library.path只包含一个路径? 我将lib'libMylib.so'复制到每个节点,并且hadoop能够加载它。但是将每个本机共享库复制到每个节点似乎不是一个好主意。

我只想通过使用参数'-files libMylib.so'将我的lib分发到每个节点,并将其加载到Map任务中。我该怎么做?

A related question I asked 7 days ago

相关网站:

MapReduce Tutorial

Native Shared Libraries

1 个答案:

答案 0 :(得分:0)

  1. 首先将库复制到HDFS:
    bin / hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1

  2. 工作启动计划应包含以下内容:
    DistributedCache.createSymlink(CONF);
    DistributedCache.addCacheFile(" hdfs:// host:port / libraries / mylib.so.1#mylib.so",conf);

  3. MapReduce任务可以包含:
    System.load((新​​文件(" mylib.so"))。getAbsolutePath());

  4. 第三点与官方文档不同

    官方文件:Native Shared Libraries