断続的な hive ステージングの FileNotFoundException が原因で Amazon EMR の Hive クエリが失敗する

最終更新日: 2020 年 8 月 28 日

Amazon EMR クラスターを使用して Amazon Simple Storage Service (Amazon S3) バケットにある Apache Hive テーブルにデータを書き込もうとすると、クエリが以下のエラーのいずれかで失敗します。

  • java.io.FileNotFoundException File s3://awsdoc-example-bucket/.hive-staging_hive_xxx_xxxx does not exist.
  • java.io.IOException: rename for src path ERROR

簡単な説明

INSERT INTO、INSERT OVERWRITE、またはその他の PARTITION コマンドを実行すると、Hive がテーブルと同じ S3 バケットにステージングディレクトリを作成します。ステージングクエリデータをその S3 バケットに書き込むために、Hive は RENAME 操作を実行します。

RENAME 操作には、HEAD、GET、および PUT などの低レベルの S3 API コールが含まれます。ファイルを作成する前に Hive がキー名に HEAD または GET リクエストを行うと、Amazon S3 はリードアフターライトに結果整合性を提供します。この状況が発生すると、Hive は一時的なディレクトリの名前を最終出力ディレクトリに変更できません。これが原因で、java.io.IOException または java.io.FileNotFoundException などのエラーが発生します。詳細については、「Amazon S3 のデータ整合性モデル」を参照してください。

解決方法

注意: 次の手順は、Amazon EMR のリリースバージョン 3.2.1 以降に適用されます。クラスターが 5.7.0 以前の Amazon EMR バージョンを使用している場合は、バージョン 5.8.0 以降へのアップグレードをお勧めします。5.8.0 以降のバージョンには Hive 2.3.x が含まれています。java.io.IOException および java.io.FileNotFoundException エラーは Hive 2.3.x でも発生する場合がありますが、発生するのは Amazon S3 に保存されるテーブルのみです。これらのエラーは HDFS テーブルでは発生しません。これは、Hive がクエリ対象のテーブルと同じディレクトリではなく、強力な整合性を備えた HDFS ロケーションにステージングディレクトリを作成するからです。

1.    SSH を使用してマスターノードに接続します

2.    /mnt/var/log/hive/user/hadoop/hive.log ディレクトリ、または以下の例のような Amazon S3 ログの URI にある YARN アプリケーションコンテナログで Hive エラーログを見つけます。詳細については、「View log files」を参照してください。

s3://awsdoc-example-bucket/elasticmapreduce/j-3ABCDEF2BALUG5/Containers/application_11234567890654_0001/

3.    以下のようなエラーメッセージを探します。

2020-08-27T11:53:28,837 ERROR [HiveServer2-Background-Pool: Thread-64([])]: ql.Driver (SessionState.java:printError(1097)) - FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 6, vertexId=vertex_1525862550243_0001_1_03, diagnostics=[Vertex vertex_1525862550243_0001_1_03 [Map 6] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: r initializer failed, vertex=vertex_1525862550243_0001_1_03 [Map 6], java.io.FileNotFoundException: File s3://awsdoc-example-bucket/folder/subfolder/subfolder/.hive-staging_hive_2020-08-25_09-36-30_835_6368934499747071892-1 does not exist. at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:972)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to rename output from: s3://awsdoc-example-bucket/demo.db/folder/ingestion_date=20200827/.hive-staging_hive_2020-08-27_13-52-51_942_3098569974412217069-5/_task_tmp.-ext-10000/_tmp.000000_2 to: s3://awsdoc-example-bucket/demo.db/folder/ingestion_date=20200827/.hive-staging_hive_2019-10-27_13-52-51_942_3098569974412217069-5/_tmp.-ext-10000/000000_2  at org.apache.hadoop.hive.ql.exec.FileSinkOperator$FSPaths.commit(FileSinkOperator.java:247)

4.    これらのエラーのいずれかがログにある場合は、ファイルが作成される前の時点で Hive が RENAME 操作中に HEAD リクエストを行ったことを意味します。これらのエラーを解決するには、EMRFS の整合ビューを有効化します。詳細については、「Consistent view」を参照してください。

ログの中にこれらのエラーのどちらもないという場合は、ログを使用して Amazon EMR における Hive クエリの問題をトラブルシューティングする方法を教えてくださいを参照してください。

5.    整合ビューを有効にした後もこれらのエラーが発生する場合は、整合ビューに追加の設定を行います。例えば、Amazon DynamoDB が EMRFS テーブルをスロットルしている場合、emrfs-site.xml にある以下のパラメータを変更して、テーブルの読み込みおよび書き込みのキャパシティーユニットを増やします。

fs.s3.consistent.metadata.read.capacity

fs.s3.consistent.metadata.write.capacity

java.io.FileNotFoundException または java.io.IOException が原因でリクエストが失敗する場合、EMRFS は emrfs-site.xml のデフォルト値を使用してリクエストを再試行します。EMRFS は、Amazon S3 が整合的になる、または fs.s3.consistent.retryCount で定義されている値に到達するまでリクエストの再試行を継続します。操作が成功する前に EMRFS が再試行上限に達すると、ConsistencyException が発生します。この問題を解決するには、fs.s3.consistent.retryCount を増やします。