Apache Hive Metastore に関するいくつかの問題をトラブルシューティングする方法How to Troubleshoot Several Apache Hive Metastore Problems

問題 1: 外部の metastore テーブルを使用できないProblem 1: External metastore tables not available

ドライバーログを調べると、次のエラー Required table missing を含むスタックトレースが表示されます。When you inspect the driver logs, you see a stack trace that includes the error Required table missing:

WARN Query: Query for candidates of org.apache.hadoop.hive.metastore.model.MDatabase and subclasses resulted in no possible candidates

Required table missing: "DBS" in Catalog "" Schema "". DataNucleus requires this table to perform its
persistence operations. Either your MetaData is incorrect, or you need to enable
"datanucleus.schema.autoCreateTables"

org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : "DBS" in Catalog ""  Schema "". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable
"datanucleus.schema.autoCreateTables"

   at

org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:606)

   at

org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:33
85)

原因Cause

データベースは存在しますが、metastore テーブルがありません。The database is present, but there are no metastore tables.

ソリューションSolution

External metastore のバージョンが Hive 2.0 以上の場合は、 Hive スキーマツールを使用して metastore テーブルを作成します。If the external metastore version is Hive 2.0 or above, use the Hive Schema Tool to create the metastore tables. Hive 2.0 以降のバージョンでは、既存の init スクリプトで次の構成の metastore テーブルを追加します。For versions below Hive 2.0, add the metastore tables with the following configurations in your existing init script:

spark.hadoop.datanucleus.autoCreateSchema=true
spark.hadoop.datanucleus.fixedDatastore=false

これらの構成は、Apache Spark 構成で直接設定することもできます。You can also set these configurations in the Apache Spark configuration directly:

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

問題 2: Hive metastore の検証に失敗しましたProblem 2: Hive metastore verification failed

ドライバーログを調べると、次のようなエラーを含むスタックトレースが表示されます。When you inspect the driver logs, you see a stack trace that includes an error like the following:

18/09/24 14:51:07 ERROR RetryingHMSHandler: HMSHandler Fatal error:
MetaException(message:Version information not found in metastore. )

   at
org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore
.java:7564)

   at
org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.
java:7542)

   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

原因Cause

Metastore の VERSION テーブルが空です。The VERSION table in the metastore is empty.

ソリューションSolution

次のいずれかを実行します。Do one of the following:

  • INSERT クエリを使用して、VERSION テーブルに正しいバージョン値を設定します。Populate the VERSION table with the correct version values using an INSERT query.

  • クラスターの Spark 構成で metastore 検証をオフにするには、次の構成を設定します。Set the following configurations to turn off the metastore verification in the Spark configuration of the cluster:

    hive.metastore.schema.verification false
    hive.metastore.schema.verification.record.version false
    

問題 3: Metastore 接続の上限を超えましたProblem 3: Metastore connection limit exceeded

クラスターで実行されるコマンドは、次のスタックトレースで失敗し、ドライバーログに記録されます。Commands run on the cluster fail with the following stack trace in the driver logs:

Unable to open a test connection to the given
database. JDBC url =
jdbc:<jdbcURL>?trustServerCertificate=true&useSS
L=true, username = <REDACTED>. Terminating
connection pool (set lazyInit to true if you
expect to start your database after your app).
Original Exception: ------

java.sql.SQLSyntaxErrorException: User
'<userId>' has exceeded the
'max_user_connections' resource (current value:
100)
at
org.mariadb.jdbc.internal.util.exceptions.Except
ionMapper.get(ExceptionMapper.java:163)
at
org.mariadb.jdbc.internal.util.exceptions.Except
ionMapper.getException(ExceptionMapper.java:106)
at
org.mariadb.jdbc.internal.protocol.AbstractConne
ctProtocol.connectWithoutProxy(AbstractConnectPr
otocol.java:1036)

原因Cause

Metastore 構成では、100接続のみが許可されます。The metastore configuration allows only 100 connections. 接続の上限に達すると、新しい接続は許可されず、コマンドは失敗し、このエラーが発生します。When the connection limit is reached, new connections are not allowed, and commands fail with this error. Azure Databricks ワークスペースの各クラスターは、metastore との接続を確立します。Each cluster in the Azure Databricks workspace establishes a connection with the metastore. 多数のクラスターが実行されている場合、この問題が発生する可能性があります。If you have a large number of clusters running, then this issue can occur. また、構成が正しくないと接続リークが発生し、接続数が上限に達するまで増加し続けます。Additionally, incorrect configurations can cause a connection leak, causing the number of connections to keep increasing until the limit is reached.

ソリューションSolution

問題を修正するには、次のいずれかの操作を実行します。Correct the problem with one of the following actions:

  • 外部の metastore を使用していて、多数のクラスターを実行している場合は、外部の metastore の接続数の上限を増やします。If you are using an external metastore and you have a large number of clusters running, then increase the connection limit on your external metastore.
  • 外部 metastore を使用していない場合は、クラスターにカスタム Hive metastore 構成がないことを確認してください。If you are not using an external metastore, ensure that you do not have any custom Hive metastore configurations on your cluster. Azure Databricks によって提供される metastore を使用する場合は、Hive metastore のクラスターで既定の構成を使用する必要があります。When using the metastore provided by Azure Databricks, you should use the default configurations on the cluster for the Hive metastore.
  • 既定の構成を使用していてもこの問題が発生する場合は、Azure Databricks サポートにお問い合わせください。If you are using the default configuration and still encounter this issue, contact Azure Databricks Support. Azure Databricks ワークスペースの構成によっては、内部 metastore に対して許可される接続の数を増やすことができる場合があります。Depending on the configuration of your Azure Databricks workspace, it might be possible to increase the number of connections allowed to the internal metastore.

問題 4: 列に含まれるメタデータの量が多すぎるため、テーブルアクションが失敗するProblem 4: Table actions fail because column has too much metadata

1つの列のメタデータの量が4000文字を超えると、テーブルアクションは次のようなエラーで失敗します。When the quantity of metadata for a single column exceeds 4000 characters, table actions fail with an error like this:

Error in SQL statement: IllegalArgumentException:
Error: type expected at the position 3998 of 'struct<num_ad_accounts:bigint,num_benchmarks:bigint,num_days_range:string,num_days_in_history:string,num_fb_pages:bigint,num_g_profiles:bigint,num_ga_views:bigint,num_groups:bigint,num_ig_profiles:bigint,num_li_pages:bigint,num_labels:string,num_labels_added:bigint,num_labels_

原因Cause

これは、Hive Metastore version 2.3.0 (hive-12274) で修正されたバグです。This is a bug that was fixed in Hive Metastore version 2.3.0 (HIVE-12274). Azure Databricks では、以前のバージョンの Hive Metastore (バージョン 0.13) を使用するため、インポートされた JSON スキーマなど、列のメタデータが多すぎると、このバグが発生します。Azure Databricks uses an earlier version of Hive Metastore (version 0.13), so this bug occurs when there is too much metadata for a column, such as an imported JSON schema.

ソリューションSolution

回避策として、バージョン2.3.0 以上を使用する外部 Hive metastoreを設定します。As a workaround, set up an external Hive metastore that uses version 2.3.0 or above. 次に、次のコマンドを使用して、既存のテーブルを削除します。Then delete the existing table with the following command:

%scala
spark.sessionState
  .catalog
  .externalCatalog
  .dropTable("default", "test_table_tabledrop_1", ignoreIfNotExists = false, purge = false)