背景
OBServerがJNIフレームワークを導入し、現在の外部データレイクとの接続を橋渡しするフレームワークとしたことで、環境初期化に関連する多くの問題に直面することがあります。
問題1:HDFS/ODPS JNI外部テーブルの作成時にエラーが表示される
エラー1: ERROR 11056: JNI env could not be found
原因
JNI Envの環境初期化が失敗する原因は以下の可能性があります:
ob_java_homeの設定が誤っており、libjvm.soダイナミックライブラリを正常にロードできません。このダイナミックライブラリは、環境初期化でJVMを起動するための重要なライブラリです。ob_java_optsの設定が誤っています。現在、CPPフレームワークとJNIフレームワークの連携には一定の制限があるため、多くの設定上の問題を避けるために、JVMプロセスを起動するための関連パラメータを強制的に設定する必要があります。パラメータの設定については、ob_java_optsを参照してください。JNI Env環境が依存する
libhdfs.soライブラリファイル(OceanBaseデータベースとJVM間の通信を橋渡しするもの)の配置パスと_ob_additional_lib_pathが一致しないため、正確に設定する必要があります。
解決策
現在の
java home設定が存在するか手動で確認し、特に現在のユーザーがそのパスへのアクセス権限を持っているかどうかを確認します。java homeは存在するものの、OBServerの起動ユーザーがそのパスへのアクセス権限を持っていない場合があります。ob_java_optsを参照し、
ob_java_optsに必須の項目が欠落していないか確認します。_ob_additional_lib_pathの設定パスが存在するか、およびOBServerの起動ユーザーがそのパスへのアクセス権限を持っているか確認します。
エラー2: ERROR 11032: HDFS: path not found
原因
HDFS: path not found エラーが発生する一般的なシナリオは以下のとおりです:
Kerberos認証を有効にしたHDFS環境で、特定のHDFS外部テーブルにアクセスする際、権限不足でアクセスできない場合、-11032エラーが発生します。
Kerberos認証の設定が正しいにもかかわらず、HDFS: path not found が発生する場合、外部テーブル作成ステートメントで指定された外部テーブルのパスが誤っており、存在しないパスを指している可能性があります。
外部テーブルへのアクセスは初期段階では正常だったが、クエリ実行後しばらくして11032エラーが発生する場合、HDFSの対応する外部テーブルパス配下のファイルに不良ブロックが発生している可能性があります。つまり、HDFSのDataNodeがそのデータブロックにエラーがあり、アクセスできないと報告し、それによってエラーがトリガーされるということです。
解決策
Kerberos認証のkeytabとprincipalが有効であり、対応するユーザーがHDFSクラスタへのアクセス権限を持っていることを確認し、外部テーブルの権限を再設定してKerberos認証を設定します。
対応するHDFSパスが正しく存在することを確認し、外部テーブルのHDFSパスマッピングを再構築します。
顧客の運用保守チームにフィードバックし、データの不良ブロック状況を確認した上で、不良ブロックの調整または環境の変更を選択して検証を続けることができます。
エラー3: ERROR 4016: Internal Error
原因
Internal Errorが発生する原因は以下の可能性があります:
- 外部テーブルクエリの実行時にInternal Errorが発生した場合、外部テーブルの実際の設定型と期待が一致しないためである可能性があります。例えば、
String型の列をInt型にマッピングしたことで、一部のフィールドデータの変換に失敗した場合などです。 - その他の予期しないプログラム実行パスがInternal Errorをトリガーした場合。
解決策
外部テーブル作成ステートメントおよび対応する外部テーブルデータファイルのメタデータ型マッピングが正しいか確認します。
関連するログを確認し、エラーログのスタックを取得して、エラーが発生した具体的な詳細を確認します。