1

我有一个本地库,我需要为我的 reduce 方法加载,并将它添加到分布式缓存中,但是当我在 map 方法中调用 System.loadLibrary(mylib.so) 时,我得到一个错误并且 map 任务失败:

Error: no mylib.so in java.library.path

即使我将它添加到分布式缓存中。我错过了一步吗?在我的工作配置中,我调用:

DistributedCache.addCacheFile(uri, job.getConfiguration());

其中 uri 是 hadoop 文件系统上 mylib.so 的路径。

这个本机库依赖于许多其他库,它们都存在于我的 hadoop fs 上的 /hadoop/fs/mystuff/libs 中。我将它们全部添加到分布式缓存中,甚至尝试使用 System.loadLibrary() 调用将它们全部加载到我的 reduce 任务中。但我不断收到同样的 java.library.path 错误。我还尝试将库作为命令行参数添加到 -files 标志,但我仍然收到上述错误。

4

2 回答 2

0

您是否单独尝试我们的代码,而不是在 map-reduce 中?据我所知,System.loadLibrary 期望库名称不带“.so”或“.dll”后缀...

于 2014-10-13T18:10:30.260 回答
0

虽然不确定为什么会发生这种情况,但请查看 Cloudera 的How to Include Third-Party Libraries in Your Map-Reduce Job博客条目。

于 2012-10-19T04:08:49.147 回答