0

JNI を作成したら、Apache Pig から JNI を呼び出せるように UDF を作成しました。ここでの問題は、このエラーが発生することですが、これは複数のマップで実行した場合に限られます (マップが 1 つだけの場合はすべて正常に動作します)。

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

これは、Apache Pig のマニュアルの次の部分に関連していると思います。

ユーザーが遭遇する問題の 1 つは、UDF のコンストラクターが呼び出される回数を想定する場合です。たとえば、ストア関数でサイド ファイルを作成している可能性があり、コンストラクターでそれを行うのは良い考えのようです。このアプローチの問題点は、ほとんどの場合、Pig がクライアント側で関数をインスタンス化して、たとえばデータのスキーマを調べることです。

ユーザーは、関数が何回インスタンス化されるかについて推測するべきではありません。代わりに、複数のインスタンス化に対してコードを回復力のあるものにする必要があります。たとえば、ファイルを作成する前にファイルが存在するかどうかを確認できます。

UDF 内には、別のクラスをインスタンス化するコンストラクターがあります。

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

すべてのノードにlidbclassjni.soがインストールされていることを確認できます。したがって、主な問題は、なぜ Apache Pig が共有オブジェクトを読み込めないのかということです。また、この問題を回避するには、UDF をどのように表示する必要がありますか。

TL;DR =>

Hadoop の Apache Pig UDF 内で JNI を使用する。1 つのマップでは問題なく動作しますが、複数のマップでは取得できます

ネイティブ コード ライブラリを読み込めませんでした。java.lang.UnsatisfiedLinkError: ライブラリを読み込めません: /usr/lib/libdclassjni.so

これについての洞察をありがとう

アップデート:

修繕

4

1 に答える 1

2

[修正済み] .so がすべての Hadoop ノードに存在しないことが判明しました。

于 2013-01-25T16:43:10.157 に答える