Behandeln verschiedener Probleme mit dem Apache Hive-Metastore

Problem 1: Externe Metastore-Tabellen 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 sind keine Metastoretabellen vorhanden.

Lösung

Wenn die externe Metastore-Version Hive 2.0 oder höher ist, verwenden Sie das Hive-Schematool, um die Metastore-Tabellen zu erstellen. Fügen Sie für Versionen unter Hive 2.0 die Metastore-Tabellen mit den folgenden Konfigurationen in Ihrem vorhandenen Init-Skript 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 der Ü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 VERSION Tabelle im Metastore ist leer.

Lösung

Führen Sie eines der folgenden Verfahren aus:

  • Füllen Sie VERSION die Tabelle mit den richtigen Versionswerten mithilfe einer Abfrage INSERT 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: Metastore-Verbindungslimit überschritten

Befehle, die auf dem Cluster ausgeführt werden, führen zu einem Fehler mit der folgenden Stapelüberwachung in den Treiberprotokollen:

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 Metastore-Konfiguration 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 stellt eine Verbindung mit dem Metastore ein. Wenn eine große Anzahl von Clustern ausgeführt wird, kann dieses Problem auftreten. Darüber hinaus können falsche Konfigurationen zu einem Verbindungsverlust führen, was dazu führt, dass die Anzahl der Verbindungen weiter 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 für Ihren externen Metastore.
  • Wenn Sie keinen externen Metastore verwenden, stellen Sie sicher, dass In Ihrem Cluster keine benutzerdefinierten Hive-Metastore-Konfigurationen verfügbar sind. Wenn Sie den von Azure Databricks metastore bereitgestellten Metastore verwenden, sollten Sie die Standardkonfigurationen im Cluster für den Hive-Metastore verwenden.
  • Wenn Sie die Standardkonfiguration verwenden und dieses Problem weiterhin auft kommt, wenden Sie sich an Azure Databricks Support. Abhängig von der Konfiguration Ihres Azure Databricks Arbeitsbereichs ist es möglicherweise möglich, die Anzahl der Verbindungen zu erhöhen, die mit dem internen Metastore zulässig sind.

Problem 4: Tabellenaktionen können nicht durchgeführt werden, 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 der folgende 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. Azure Databricks eine frühere Version von Hive Metastore (Version 0.13) verwendet, tritt dieser Fehler auf, wenn zu viele Metadaten für eine Spalte, z. B. ein importiertes JSON-Schema, verfügbar sind.

Lösung

Um dieses Problem zu umgehen, richten Sie 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)