0

所以我们编写了一个 JNI,然后我们编写了一个 UDF,以便能够从 Apache Pig 调用我们的 JNI。现在的问题是我们得到了这个错误,但只有当我们使用多张地图运行它时(只有一张地图一切正常):

Native code library failed to load. java.lang.UnsatisfiedLinkError:
Can't load library: /usr/lib/libdclassjni.so

我认为这与Apache Pig 手册中的以下部分有关:

用户遇到的一个问题是,当他们假设其 UDF 的构造函数被调用了多少次时。例如,他们可能在 store 函数中创建辅助文件,并在构造函数中创建似乎是个好主意。这种方法的问题在于,在大多数情况下,Pig 在客户端实例化函数以检查数据的模式。

用户不应假设函数被实例化了多少次;相反,他们应该使他们的代码能够适应多个实例化。例如,他们可以在创建文件之前检查文件是否存在。

在 UDF 内部,我们有一个构造函数,它依次实例化另一个类,而那个类确实

System.load("/usr/lib/libdclassjni.so").

我可以保证我们在所有节点上都安装了 lidbclassjni.so。所以主要问题是为什么 Apache Pig 不能加载共享对象。而且,UDF 应该如何看待才能避免这个问题。

TL;DR =>

在 hadoop 上的 Apahce Pig UDF 中使用 JNI。在一张地图上工作正常,但在多张地图上我得到

本机代码库无法加载。java.lang.UnsatisfiedLinkError:无法加载库:/usr/lib/libdclassjni.so

感谢您对此的任何见解

更新:

固定的

4

1 回答 1

2

[已修复] 结果发现 .so 并不存在于所有 hadoop 节点上。

于 2013-01-25T16:43:10.157 回答