最近我试图在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
相关网站:
答案 0 :(得分:0)
首先将库复制到HDFS:
bin / hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
工作启动计划应包含以下内容:
DistributedCache.createSymlink(CONF);
DistributedCache.addCacheFile(" hdfs:// host:port / libraries / mylib.so.1#mylib.so",conf);
MapReduce任务可以包含:
System.load((新文件(" mylib.so"))。getAbsolutePath());
第三点与官方文档不同