Comment résoudre les problèmes liés à plusieurs Apache Hive dans le magasin de clésHow to troubleshoot several Apache Hive metastore problems

Problème 1 : tables de la Banque externe non disponiblesProblem 1: External metastore tables not available

Lorsque vous examinez les journaux du pilote, vous voyez une trace de la pile qui comprend l’erreur 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)

CauseCause

La base de données est présente, mais il n’existe aucune table de restauration.The database is present, but there are no metastore tables.

SolutionSolution

Si la version du magasin externe est Hive 2,0 ou version ultérieure, utilisez l' outil de schéma Hive pour créer les tables de la table de stockage.If the external metastore version is Hive 2.0 or above, use the Hive Schema Tool to create the metastore tables. Pour les versions inférieures à Hive 2,0, ajoutez les tables de la table de stockage avec les configurations suivantes dans votre script init existant :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

Vous pouvez également définir ces configurations dans la configuration Apache Spark directement :You can also set these configurations in the Apache Spark configuration directly:

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

Problème 2 : échec de la vérification de metastore HiveProblem 2: Hive metastore verification failed

Lorsque vous examinez les journaux du pilote, vous voyez une trace de la pile qui contient une erreur semblable à la suivante :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)

CauseCause

La VERSION table dans le magasin de clés est vide.The VERSION table in the metastore is empty.

SolutionSolution

Effectuez l’une des actions suivantes :Do one of the following:

  • Remplissez la VERSION table avec les valeurs de version correctes à l’aide d’une INSERT requête.Populate the VERSION table with the correct version values using an INSERT query.

  • Définissez les configurations suivantes pour désactiver la vérification de la base de connaissances dans la configuration Spark du cluster :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
    

Problème 3 : limite de connexion au magasin de clés dépasséeProblem 3: Metastore connection limit exceeded

Les commandes exécutées sur le cluster échouent avec la trace de pile suivante dans les journaux de pilote :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)

CauseCause

La configuration de la base de donnes autorise uniquement les connexions 100.The metastore configuration allows only 100 connections. Lorsque la limite de connexion est atteinte, les nouvelles connexions ne sont pas autorisées et les commandes échouent avec cette erreur.When the connection limit is reached, new connections are not allowed, and commands fail with this error. Chaque cluster de l’espace de travail Azure Databricks établit une connexion avec le magasin de clés.Each cluster in the Azure Databricks workspace establishes a connection with the metastore. Si vous avez un grand nombre de clusters en cours d’exécution, ce problème peut se produire.If you have a large number of clusters running, then this issue can occur. En outre, des configurations incorrectes peuvent provoquer une fuite de connexion, provoquant une augmentation du nombre de connexions jusqu’à ce que la limite soit atteinte.Additionally, incorrect configurations can cause a connection leak, causing the number of connections to keep increasing until the limit is reached.

SolutionSolution

Corrigez le problème à l’aide de l’une des actions suivantes :Correct the problem with one of the following actions:

  • Si vous utilisez un cluster de stockage externe et que vous disposez d’un grand nombre de clusters en cours d’exécution, augmentez la limite de connexion sur votre banque externe.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.
  • Si vous n’utilisez pas de cluster de stockage externe, assurez-vous que vous n’avez pas de configurations de metastore Hive personnalisées sur votre cluster.If you are not using an external metastore, ensure that you do not have any custom Hive metastore configurations on your cluster. Lorsque vous utilisez le magasin de stockage fourni par Azure Databricks, vous devez utiliser les configurations par défaut sur le cluster pour le metastore Hive.When using the metastore provided by Azure Databricks, you should use the default configurations on the cluster for the Hive metastore.
  • Si vous utilisez la configuration par défaut et que vous rencontrez toujours ce problème, contactez le support technique Azure Databricks.If you are using the default configuration and still encounter this issue, contact Azure Databricks Support. Selon la configuration de votre espace de travail Azure Databricks, il peut être possible d’augmenter le nombre de connexions autorisées au stockage interne.Depending on the configuration of your Azure Databricks workspace, it might be possible to increase the number of connections allowed to the internal metastore.

Problème 4 : les actions de table échouent, car la colonne contient trop de métadonnéesProblem 4: Table actions fail because column has too much metadata

Lorsque la quantité de métadonnées pour une colonne unique dépasse 4000 caractères, les actions de table échouent avec une erreur semblable à celle-ci :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_

CauseCause

Il s’agit d’un bogue qui a été corrigé dans la version 2.3.0 du (Hive-12274).This is a bug that was fixed in Hive Metastore version 2.3.0 (HIVE-12274). Azure Databricks utilise une version antérieure du méta-magasin Hive (version 0,13). ce bogue se produit donc lorsqu’il y a trop de métadonnées pour une colonne, par exemple un schéma JSON importé.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.

SolutionSolution

Pour contourner ce problème, configurez un metastore Hive externe qui utilise la version 2.3.0 ou ultérieure.As a workaround, set up an external Hive metastore that uses version 2.3.0 or above. Ensuite, supprimez la table existante à l’aide de la commande suivante :Then delete the existing table with the following command:

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