Cómo solucionar varios problemas de Apache Hive MetaStore

Problema 1: las tablas externas de la tienda de MetaStore no están disponibles

Al inspeccionar los registros del controlador, verá un seguimiento de la pila que incluye el 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)

Causa

La base de datos está presente, pero no hay ninguna tabla de MetaStore.

Solución

Si la versión de MetaStore externa es Hive 2,0 o superior, use la herramienta de esquema de Hive para crear las tablas de MetaStore. En el caso de las versiones anteriores a Hive 2,0, agregue las tablas de MetaStore con las siguientes configuraciones en el script init existente:

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

También puede establecer estas configuraciones directamente en la configuración de Apache Spark :

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

Problema 2: error de comprobación de Hive Metastore

Al inspeccionar los registros del controlador, verá un seguimiento de la pila que incluye un error similar al siguiente:

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)

Causa

La VERSION tabla del almacén de MetaStore está vacía.

Solución

Realice una de las siguientes acciones:

  • Rellene la VERSION tabla con los valores de versión correctos mediante una INSERT consulta.

  • Establezca las siguientes configuraciones para desactivar la comprobación de MetaStore en la configuración de Spark del clúster:

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

Problema 3: se superó el límite de conexiones de MetaStore

Los comandos que se ejecutan en el clúster producen el siguiente seguimiento de la pila en los registros del controlador:

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)

Causa

La configuración de MetaStore solo permite conexiones de 100. Cuando se alcanza el límite de conexiones, no se permiten nuevas conexiones y los comandos producen este error. Cada clúster del área de trabajo Azure Databricks establece una conexión con el almacén de MetaStore. Si tiene un gran número de clústeres en ejecución, se puede producir este problema. Además, las configuraciones incorrectas pueden provocar una pérdida de conexión, lo que hace que el número de conexiones siga aumentando hasta alcanzar el límite.

Solución

Corrija el problema con una de las siguientes acciones:

  • Si usa una tienda de MetaStore externa y tiene un gran número de clústeres en ejecución, aumente el límite de conexiones en la tienda de MetaStore externa.
  • Si no usa una tienda de MetaStore externa, asegúrese de que no tiene ninguna configuración de Hive Metastore personalizada en el clúster. Al usar la tienda de metaAzure Databricks, debe usar las configuraciones predeterminadas en el clúster para la Hive Metastore.
  • Si usa la configuración predeterminada y sigue teniendo este problema, póngase en contacto con el soporte técnico de Azure Databricks. En función de la configuración del área de trabajo Azure Databricks, es posible que se pueda aumentar el número de conexiones permitidas en la tienda de MetaStore interna.

Problema 4: error en las acciones de tabla porque la columna tiene demasiados metadatos

Cuando la cantidad de metadatos de una sola columna supera los 4000 caracteres, se produce un error similar en las acciones de tabla:

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_

Causa

Se trata de un error que se corrigió en Hive MetaStore versión 2.3.0 (Hive-12274). Azure Databricks usa una versión anterior de Hive MetaStore (versión 0,13), por lo que este error se produce cuando hay demasiados metadatos para una columna, como un esquema JSON importado.

Solución

Como alternativa, configure una Hive MetaStore externa que use la versión 2.3.0 o posterior. A continuación, elimine la tabla existente con el siguiente comando:

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