Så här felsöker du Apache Hive problem med metaarkivet

Problem 1: Externa metaarkivtabeller är inte tillgängliga

När du inspekterar drivrutinsloggarna visas en stackspårning som innehåller felet 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)

Orsak

Databasen finns, men det finns inga metaarkivtabeller.

Lösning

Om den externa metaarkivversionen är Hive 2.0 eller senare använder du Hive-schemaverktyget för att skapa metaarkivtabellerna. För versioner under Hive 2.0 lägger du till metaarkivtabellerna med följande konfigurationer i ditt befintliga init-skript:

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

Du kan också ange dessa konfigurationer direkt i Apache Spark-konfigurationen:

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

Problem 2: Verifieringen av Hive-metaarkiv misslyckades

När du inspekterar drivrutinsloggarna visas en stackspårning som innehåller ett fel som liknar följande:

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)

Orsak

Tabellen VERSION i metaarkivet är tom.

Lösning

Gör något av följande:

  • Fyll i tabellen VERSION med rätt versionsvärden med hjälp av en INSERT fråga.

  • Ange följande konfigurationer för att stänga av metaarkivverifieringen i Spark-konfigurationen för klustret:

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

Problem 3: Metaarkivanslutningsgränsen har överskridits

Kommandon som körs i klustret misslyckas med följande stackspårning i drivrutinsloggarna:

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)

Orsak

Metaarkivkonfigurationen tillåter endast 100 anslutningar. När anslutningsgränsen har nåtts tillåts inte nya anslutningar och kommandona misslyckas med det här felet. Varje kluster i Azure Databricks upprättar en anslutning till metaarkivet. Om du har ett stort antal kluster som körs kan det här problemet uppstå. Felaktiga konfigurationer kan dessutom orsaka en anslutningsläcka, vilket gör att antalet anslutningar fortsätter att öka tills gränsen nås.

Lösning

Åtgärda problemet med någon av följande åtgärder:

  • Om du använder ett externt metaarkiv och du har ett stort antal kluster som körs ökar du anslutningsgränsen för ditt externa metaarkiv.
  • Om du inte använder ett externt metaarkiv ska du se till att du inte har några anpassade Hive-metaarkivkonfigurationer i klustret. När du använder metaarkivet som tillhandahålls Azure Databricks bör du använda standardkonfigurationerna i klustret för Hive-metaarkivet.
  • Om du använder standardkonfigurationen och fortfarande stöter på det här problemet kontaktar du Azure Databricks supporten. Beroende på konfigurationen av Azure Databricks arbetsyta kan det vara möjligt att öka antalet anslutningar som tillåts till det interna metaarkivet.

Problem 4: Tabellåtgärder misslyckas eftersom kolumnen har för mycket metadata

När mängden metadata för en enskild kolumn överskrider 4 000 tecken misslyckas tabellåtgärderna med ett fel som liknar följande:

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_

Orsak

Det här är en bugg som har åtgärdats i Hive-metaarkiv version 2.3.0 (HIVE-12274). Azure Databricks använder en tidigare version av Hive-metaarkiv (version 0.13), så den här buggen uppstår när det finns för mycket metadata för en kolumn, till exempel ett importerat JSON-schema.

Lösning

En tillfällig lösning är att konfigurera ett externt Hive-metaarkiv som använder version 2.3.0 eller senare. Ta sedan bort den befintliga tabellen med följande kommando:

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