所以我们编写了一个 JNI,然后我们编写了一个 UDF,以便能够从 Apache Pig 调用我们的 JNI。现在的问题是我们得到了这个错误,但只有当我们使用多张地图运行它时(只有一张地图一切正常):
Native code library failed to load. java.lang.UnsatisfiedLinkError:
Can't load library: /usr/lib/libdclassjni.so
用户遇到的一个问题是,当他们假设其 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
感谢您对此的任何见解
更新:
固定的