このトピックでは、Hive ジョブに関連する問題のトラブルシューティング方法について説明します。
例外の特定
Hive クライアントでジョブを実行したときに、パフォーマンスの例外などの例外が発生した場合は、次の手順を実行して例外を特定できます。
Hive クライアントのログを表示します。
Hive CLI を使用して送信されたジョブのログは、クラスタまたはゲートウェイノードの /tmp/hive/$USER/hive.log または /tmp/$USER/hive.log ディレクトリに保存されます。
Hive Beeline または Java Database Connectivity ( JDBC ) を使用して送信されたジョブのログは、HiveServer ログが保存されているディレクトリに保存されます。ほとんどの場合、ディレクトリは /var/log/emr/hive または /mnt/disk1/log/hive です。
Hive ジョブによって送信された YARN アプリケーションのログを表示します。yarn コマンドを実行してログを取得できます。
yarn logs -applicationId application_xxx_xxx -appOwner userName
メモリ関連の問題
コンテナのメモリ不足が原因でメモリ不足 ( OOM ) エラーが発生する
エラーメッセージ: java.lang.OutOfMemoryError: GC overhead limit exceeded または java.lang.OutOfMemoryError: Java heap space
解決策: コンテナのメモリを増やします。MapReduce ( MR ) で実行される Hive ジョブの場合、Java 仮想マシン ( JVM ) のヒープメモリも増やす必要があります。
MR で実行される Hive ジョブ: YARN サービスページの [構成] タブで、[mapred-site.xml] タブをクリックし、次のマッパーとレデューサーのメモリパラメータの値を増やします。
mapreduce.map.memory.mb=4096 mapreduce.reduce.memory.mb=4096-Xmxmapreduce.map.java.opts パラメータと mapreduce.reduce.java.opts パラメータの JVM mapreduce.map.memory.mbmapreduce.reduce.memory.mb 値を、それぞれ パラメータと パラメータに指定した値の 80% に変更する必要もあります。mapreduce.map.java.opts=-Xmx3276m (パラメータの他のオプションの値は保持します。) mapreduce.reduce.java.opts=-Xmx3276m (パラメータの他のオプションの値は保持します。)Tez で実行される Hive ジョブ
Tez コンテナのメモリが不足している場合は、Hive サービスページの [構成] タブで [hive-site.xml] タブをクリックし、hive.tez.container.size パラメータの値を増やします。
hive.tez.container.size=4096Tez AppMaster のメモリが不足している場合は、Tez サービスページの [構成] タブで [tez-site.xml] タブをクリックし、tez.am.resource.memory.mb パラメータの値を増やします。
tez.am.resource.memory.mb=4096
Spark で実行される Hive ジョブ: Spark サービスページの [構成] タブで、
spark-defaults.confタブをクリックし、spark.executor.memory パラメータの値を増やします。spark.executor.memory=4g
メモリ使用量が多すぎるため、コンテナが YARN によって強制終了される
エラーメッセージ: Container killed by YARN for exceeding memory limits
原因: Hive タスクで使用されるメモリが、ジョブが YARN から要求するメモリを超えています。メモリには、JVM ヒープメモリ、JVM オフヒープメモリ、および子プロセスで使用されるメモリが含まれます。たとえば、MR で実行される Hive ジョブの Map タスク JVM プロセスのヒープサイズが 4 GB ( mapreduce.map.java.opts=-Xmx4g ) で、ジョブが YARN から要求したメモリが 3 GB ( mapreduce.map.memory.mb=3072 ) の場合、コンテナは YARN NodeManager によって強制終了されます。
解決策:
MR で実行される Hive ジョブの場合、mapreduce.map.memory.mb パラメータと mapreduce.reduce.memory.mb パラメータの値を増やします。パラメータの値が、
-Xmxmapreduce.map.java.opts パラメータと mapreduce.reduce.java.opts パラメータの JVM 値の少なくとも 1.25 倍であることを確認してください。Spark で実行される Hive ジョブの場合、spark.executor.memoryOverhead パラメータの値を増やします。パラメータの値が、spark.executor.memory パラメータの値の少なくとも 25% であることを確認してください。
ソートバッファサイズが大きすぎるため、OOM エラーが発生する
エラーメッセージ:
Error running child: java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:986)原因: ソートバッファサイズが、Hive タスクによってコンテナに割り当てられたメモリサイズを超えています。たとえば、コンテナのメモリサイズが 1300 MB ですが、ソートバッファサイズが 1024 MB です。
解決策: コンテナのメモリサイズを増やすか、ソートバッファサイズを減らします。
tez.runtime.io.sort.mb (Tez 上の Hive) mapreduce.task.io.sort.mb (MR 上の Hive)
GroupBy 文が原因で OOM エラーが発生する
エラーメッセージ:
22/11/28 08:24:43 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 0) java.lang.OutOfMemoryError: GC overhead limit exceeded at org.apache.hadoop.hive.ql.exec.GroupByOperator.updateAggregations(GroupByOperator.java:611) at org.apache.hadoop.hive.ql.exec.GroupByOperator.processHashAggr(GroupByOperator.java:813) at org.apache.hadoop.hive.ql.exec.GroupByOperator.processKey(GroupByOperator.java:719) at org.apache.hadoop.hive.ql.exec.GroupByOperator.process(GroupByOperator.java:787) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897) at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897) at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:130) at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:148) at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:547)原因: GroupBy 文によって生成されたハッシュテーブルが過剰なメモリを占有しています。
解決策:
分割サイズを 128 MB、64 MB 以下に減らすか、ジョブの同時実行性を高めます。たとえば、
mapreduce.input.fileinputformat.split.maxsizeパラメータを134217728または 67108864 に設定できます。マッパーとレデューサーの同時実行性を高めます。
コンテナのメモリを増やします。詳細については、「コンテナのメモリ不足が原因でメモリ不足 ( OOM ) エラーが発生する」をご参照ください。
Snappy ファイルの読み取り時に OOM エラーが発生する
原因: Log Service などのサービスによって書き込まれる標準 Snappy ファイルの形式は、Hadoop Snappy ファイルの形式とは異なります。デフォルトでは、EMR は Hadoop Snappy ファイルを処理します。その結果、EMR が標準 Snappy ファイルを処理するときに OOM エラーが報告されます。
解決策: Hive ジョブに次のパラメータを構成します。
set io.compression.codec.snappy.native=true;
メタデータ関連のエラー
パーティション数が大きいテーブルの削除操作がタイムアウトした
エラーメッセージ:
FAILED: Execution ERROR, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timeout原因: パーティションテーブルに含まれるパーティションが多すぎます。その結果、削除操作に時間がかかり、Hive クライアントが Metastore サービスにアクセスしたときにネットワークがタイムアウトしました。
解決策:
EMR コンソールの Hive サービスページの [構成] タブで、[hive-site.xml] タブをクリックし、Hive クライアントが Metastore サービスにアクセスするためのタイムアウト期間を増やします。
hive.metastore.client.socket.timeout=1200s複数のパーティションをバッチで削除します。たとえば、特定の条件を満たすパーティションを削除する文を繰り返し実行できます。
alter table [TableName] DROP IF EXISTS PARTITION (ds<='20220720')
insert overwrite 文を実行して動的パーティションにデータを挿入すると、ジョブが失敗する
エラーメッセージ: ジョブで
insert overwrite文を実行して動的パーティションにデータを挿入するか、insert overwrite文を含む同様のジョブを実行すると、「Exception when loading xxx in table」というエラーが発生します。HiveServer のログに次のエラーメッセージが表示されます。Error in query: org.apache.hadoop.hive.ql.metadata.HiveException: Directory oss://xxxx could not be cleaned up.;原因: メタデータがデータと一致していません。メタデータにはパーティションに関する情報が含まれていますが、データストレージシステムでパーティションのディレクトリが見つかりません。その結果、クリーンアップ操作の実行時にエラーが発生します。
解決策: メタデータの問題をトラブルシューティングし、ジョブを再実行します。
Hive ジョブがテーブルを読み取るか削除するときに、「java.lang.IllegalArgumentException: java.net.UnknownHostException: emr-header-1.xxx」というエラーが発生する
原因: EMR クラスタが Data Lake Formation ( DLF ) または統合メタデータベース (以前の EMR コンソールでサポート) をストレージバックエンドとして使用している場合、作成するデータベースの初期パスは、EMR クラスタの HDFS パスです。例:
hdfs://master-1-1.xxx:9000/user/hive/warehouse/test.dbまたはhdfs://emr-header-1.cluster-xxx:9000/user/hive/warehouse/test.db。この場合、データベースに作成する Hive テーブルも HDFS パスに保存されます。例:hdfs://master-1-1.xxx:9000/user/hive/warehouse/test.db/test_tbl。新しい EMR コンソールのクラスタで Hive を使用して、以前の EMR コンソールのクラスタによって作成された Hive テーブルまたはデータベースからデータを読み取るか、またはデータに書き込む場合、新しいクラスタは以前のクラスタに接続できない可能性があります。また、以前のクラスタが解放されている場合、「java.net.UnknownHostException」というエラーが返されます。解決策:
解決策 1: 以前の EMR クラスタの Hive テーブルのデータが一時データまたはテストデータである場合、Hive テーブルのパスを Object Storage Service ( OSS ) パスに変更し、drop table コマンドまたは drop database コマンドを再実行して、Hive テーブルまたはデータベースを削除します。
-- Hive SQL alter table test_tbl set location 'oss://bucket/not/exists' drop table test_tbl; alter table test_pt_tbl partition (pt=xxx) set location 'oss://bucket/not/exists'; alter table test_pt_tbl drop partition pt=xxx); alter database test_db set location 'oss://bucket/not/exists' drop datatabase test_db解決策 2: 以前の EMR クラスタの Hive テーブルのデータが有効であるが、新しいクラスタからアクセスできない場合、データは HDFS に保存されます。この場合、データを OSS に移行し、テーブルを作成します。
hadoop fs -cp hdfs://emr-header-1.xxx/old/path oss://bucket/new/path hive -e "create table new_tbl like old_tbl location 'oss://bucket/new/path'"
Hive UDF およびサードパーティパッケージに関連する問題
Hive lib ディレクトリに配置されたサードパーティパッケージが原因で競合が発生する
原因: Hive のサードパーティパッケージが $HIVE_HOME/lib ディレクトリに配置されているか、元の Hive JAR パッケージが置き換えられています。
解決策: Hive のサードパーティパッケージが $HIVE_HOME/lib ディレクトリに配置されている場合は、ディレクトリからサードパーティパッケージを削除します。元の Hive JAR パッケージが置き換えられている場合は、元の Hive JAR パッケージをディレクトリに戻します。
Hive が reflect 関数を使用できない
原因: Ranger 認証が有効になっています。
解決策:
hive-site.xmlファイルで構成されているブラックリストから reflect 関数を削除します。hive.server2.builtin.udf.blacklist=empty_blacklist
カスタム UDF が原因でジョブの実行が遅い
原因: ジョブの実行が遅いにもかかわらずエラーログが返されない場合、問題はカスタム Hive UDF のパフォーマンスが低いことが原因である可能性があります。
解決策: Hive タスクのスレッドダンプを使用してパフォーマンスの問題を特定し、カスタム Hive UDF を最適化します。
Hive が grouping() 関数を解析するときに例外が発生する
現象: SQL 文で
grouping()関数を使用すると、次のエラーメッセージが報告されます。grouping() requires at least 2 argument, got 1このエラーメッセージは、
grouping()関数の引数の解析で例外が発生したことを示しています。原因: この問題は、オープンソース Hive の既知のバグが原因です。Hive での
grouping()関数の解析では、大文字と小文字が区別されます。GROUPING()ではなくgrouping()を使用すると、Hive が関数を認識できず、引数解析エラーが発生する可能性があります。解決策: SQL 文の
grouping()をGROUPING()に変更します。
エンジンの互換性に関連する問題
Hive のタイムゾーンが Spark のタイムゾーンと異なるため、実行結果が異なる
現象: Hive は UTC を使用し、Spark はローカルタイムゾーンを使用します。その結果、実行結果が異なります。
解決策: Spark のタイムゾーンを UTC に変更します。次のサンプルコードを Spark SQL に挿入します。
spark.sql.session.timeZone=UTCまた、Spark の構成ファイルに次の構成を追加することもできます。
spark.sql.session.timeZone=UTC
Hive のバージョンに関連する問題
動的リソース割り当てが有効になっているため、Hive ジョブが Spark で低速で実行される (既知の不具合)
原因: オープンソース Hive には不具合があり、Beeline を使用して Spark に接続するときに spark.dynamicAllocation.enabled パラメータが true に設定されています。その結果、シャッフルパーティションの数が 1 としてカウントされます。
解決策: Spark で実行される Hive ジョブの動的リソース割り当てを無効にします。または、Tez で Hive ジョブを実行します。
spark.dynamicAllocation.enabled=false
hive.optimize.dynamic.partition.hashjoin パラメータが true に設定されていると、Tez が例外をスローする (既知の不具合)
エラーメッセージ:
Vertex failed, vertexName=Reducer 2, vertexId=vertex_1536275581088_0001_5_02, diagnostics=[Task failed, taskId=task_1536275581088_0001_5_02_000009, diagnostics=[TaskAttempt 0 failed, info=[Error: Error while running task ( failure ) : attempt_1536275581088_0001_5_02_000009_0:java.lang.RuntimeException: java.lang.RuntimeException: cannot find field _col1 from [0:key, 1:value] at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:296) at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:250)原因: オープンソース Hive には不具合があります。
解決策: hive.optimize.dynamic.partition.hashjoin パラメータを false に設定します。
hive.optimize.dynamic.partition.hashjoin=false
MapJoinOperator が NullPointerException 例外をスローする (既知の不具合)
エラーメッセージ:

原因: hive.auto.convert.join.noconditionaltask パラメータが true に設定されています。
解決策: hive.auto.convert.join.noconditionaltask パラメータを false に設定します。
hive.auto.convert.join.noconditionaltask=false
Hive ジョブが Tez で実行されるときに、Hive が IllegalStateException 例外をスローする (既知の不具合)
エラーメッセージ:
java.lang.RuntimeException: java.lang.IllegalStateException: Was expecting dummy store operator but found: FS[17] at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:296) at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:250) at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:374) at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:73) at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:61) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37) at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)原因: オープンソース Hive には不具合があります。この問題は、tez.am.container.reuse.enabled パラメータが true に設定されている場合に発生します。
解決策: Hive ジョブの tez.am.container.reuse.enabled パラメータを false に設定します。
set tez.am.container.reuse.enabled=false;
その他の問題
select count(1) 文を実行して取得された結果が 0 である
原因:
select count(1)文は Hive テーブルの統計を使用しますが、このテーブルの統計が正しくありません。解決策: hive.compute.query.using.stats パラメータを false に設定します。
hive.compute.query.using.stats=falseanalyze コマンドを実行して、Hive テーブルの統計を再収集することもできます。
analyze table <table_name> compute statistics;
セルフマネージド Elastic Compute Service ( ECS ) インスタンスで Hive ジョブを送信するときにエラーが発生する
セルフマネージド ECS インスタンスで Hive ジョブを送信すると、エラーが発生します。EMR ゲートウェイクラスタで、または EMR CLI を使用して Hive ジョブを送信します。詳細については、「EMR-CLI を使用してゲートウェイをデプロイする」をご参照ください。
データスキューが原因でジョブで例外が発生する
現象:
シャッフルデータによってディスク容量が不足しています。
一部のタスクの実行に時間がかかります。
一部のタスクまたはコンテナで OOM エラーが発生します。
解決策:
Hive のスキュー結合最適化を有効にします。
set hive.optimize.skewjoin=true;マッパーとレデューサーの同時実行性を高めます。
コンテナのメモリを増やします。詳細については、「コンテナのメモリ不足が原因でメモリ不足 ( OOM ) エラーが発生する」をご参照ください。
「Too many counters: 121 max=120」というエラーが発生する
現象: Tez エンジンまたは MR エンジンで Hive SQL を使用してジョブを実行すると、エラーが報告されます。
原因: 現在のジョブのカウンター数がデフォルトの上限を超えています。
解決策: EMR コンソールの YARN サービスページの [構成] タブで、mapreduce.job.counters.max パラメータを検索し、パラメータの値を増やしてから、Hive ジョブを再送信します。Beeline または JDBC を使用してジョブを送信する場合は、HiveServer を再起動する必要があります。