Behandeln verschiedener Probleme beim Apache Hive-Metastore

Problem 1: Externe Metastoretabellen nicht verfügbar

Wenn Sie die Treiberprotokolle überprüfen, wird eine Stapelüberwachung angezeigt, die den Fehler Required table missing enthält:

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)

Ursache

Die Datenbank ist vorhanden, aber es gibt keine Metastoretabellen.

Lösung

Wenn die externe Metastoreversion Hive 2.0 oder höher ist, verwenden Sie das Hive-Schematool zum Erstellen der Metastoretabellen. Fügen Sie für Versionen unter Hive 2.0 die Metastoretabellen mit den folgenden Konfigurationen in Ihrem Initialisierungsskript hinzu:

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

Sie können diese Konfigurationen auch direkt in der Apache Spark-Konfiguration festlegen:

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

Problem 2: Fehler bei Überprüfung des Hive-Metastores

Wenn Sie die Treiberprotokolle überprüfen, wird eine Stapelüberwachung angezeigt, die einen Fehler wie den folgenden enthält:

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)

Ursache

Die Tabelle VERSION im Metastore ist leer.

Lösung

Führen Sie eines der folgenden Verfahren aus:

  • Füllen Sie die Tabelle VERSION mithilfe einer INSERT-Abfrage mit den richtigen Versionswerten auf.

  • Legen Sie die folgenden Konfigurationen fest, um die Metastore-Überprüfung in der Spark-Konfiguration des Clusters zu deaktivieren:

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

Problem 3: Überschreitung des Grenzwerts für Metastoreverbindungen

Befehle, die auf dem Cluster ausgeführt werden, schlagen mit der folgenden Stapelüberwachung in den Treiberprotokollen fehl:

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)

Ursache

Die Metastorekonfiguration lässt nur 100 Verbindungen zu. Wenn das Verbindungslimit erreicht ist, sind neue Verbindungen nicht zulässig, und bei Befehlen tritt dieser Fehler auf. Jeder Cluster im Azure Databricks-Arbeitsbereich stellt eine Verbindung mit dem Metastore her. Wenn eine große Anzahl von Clustern ausgeführt wird, kann dieses Problem auftreten. Darüber hinaus können falsche Konfigurationen einen Verbindungsverlust verursachen. Dies führt dazu, dass die Anzahl der Verbindungen so lange zunimmt, bis der Grenzwert erreicht ist.

Lösung

Beheben Sie das Problem mit einer der folgenden Aktionen:

  • Wenn Sie einen externen Metastore verwenden und eine große Anzahl von Clustern ausgeführt wird, erhöhen Sie das Verbindungslimit in Ihrem externen Metastore.
  • Wenn Sie keinen externen Metastore verwenden, stellen Sie sicher, dass es in Ihrem Cluster keine benutzerdefinierten Hive-Metastorekonfigurationen gibt. Wenn Sie den von Azure Databricks bereitgestellten Metastore verwenden, sollten Sie die Standardkonfigurationen im Cluster für den Hive-Metastore verwenden.
  • Wenn Sie die Standardkonfiguration verwenden und dieses Problem weiterhin auftritt, wenden Sie sich an den Azure Databricks-Support. Abhängig von der Konfiguration Ihres Azure Databricks-Arbeitsbereichs ist es vielleicht möglich, die Anzahl der Verbindungen zu erhöhen, die für den internen Metastore zulässig sind.

Problem 4: Tabellenaktionen schlagen fehl, weil die Spalte zu viele Metadaten enthält

Wenn die Menge der Metadaten für eine einzelne Spalte 4.000 Zeichen überschreitet, tritt bei Tabellenaktionen ein Fehler wie dieser auf:

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_

Ursache

Dies ist ein Fehler, der in Hive-Metastore, Version 2.3.0, (HIVE-12274) behoben wurde. Weil Azure Databricks eine frühere Version von Hive-Metastore (Version 0.13) verwendet, tritt dieser Fehler auf, wenn es zu viele Metadaten für eine Spalte, z. B. ein importiertes JSON-Schema, gibt.

Lösung

Richten Sie zur Umgehung dieses Problems einen externen Hive-Metastore ein, der Version 2.3.0 oder höher verwendet Löschen Sie dann die vorhandene Tabelle mit dem folgenden Befehl:

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