Résoudre plusieurs problèmes liés à un metastore Apache Hive

Problème 1 : tables de la Banque externe non disponibles

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

La base de données est présente, mais il n’existe aucune table de restauration.

Solution

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. 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 :

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

Vous pouvez également définir ces configurations dans la configuration Apache Spark directement :

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

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

Lorsque vous examinez les journaux du pilote, vous voyez une trace de la pile qui contient une erreur semblable à la suivante :

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

La VERSION table dans le magasin de clés est vide.

Solution

Effectuez l’une des opérations suivantes :

  • Remplissez la VERSION table avec les valeurs de version correctes à l’aide d’une INSERT requête.

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

Les commandes exécutées sur le cluster échouent avec la trace de pile suivante dans les journaux de pilote :

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

La configuration de la base de donnes autorise uniquement les connexions 100. Lorsque la limite de connexion est atteinte, les nouvelles connexions ne sont pas autorisées et les commandes échouent avec cette erreur. Chaque cluster de l’espace de travail Azure Databricks établit une connexion avec le magasin de clés. Si vous avez un grand nombre de clusters en cours d’exécution, ce problème peut se produire. 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.

Solution

Corrigez le problème à l’aide de l’une des actions suivantes :

  • 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.
  • 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. 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.
  • Si vous utilisez la configuration par défaut et que vous rencontrez toujours ce problème, contactez le support technique Azure Databricks. 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.

Problème 4 : les actions de table échouent, car la colonne contient trop de métadonnées

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 :

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

Il s’agit d’un bogue qui a été corrigé dans la version 2.3.0 du (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é.

Solution

Pour contourner ce problème, configurez un metastore Hive externe qui utilise la version 2.3.0 ou ultérieure. Ensuite, supprimez la table existante à l’aide de la commande suivante :

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