Procedimiento para solucionar varios problemas de metastore de Apache Hive

Problema 1: Tablas externas de metastore no disponibles

Al inspeccionar los registros de controladores, ve 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 tablas de metastore.

Solución

Si la versión de metastore externa es Hive 2.0 o posterior, use la herramienta de esquema de Hive para crear las tablas de metastore. Para las versiones posteriores a Hive 2.0, agregue las tablas de metastore con las siguientes configuraciones en el script de inicialización 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 metastore de Hive

Al inspeccionar los registros de controladores, ve un seguimiento de la pila que incluye un error como el 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 tabla VERSION del metastore está vacía.

Solución

Realice una de las siguientes acciones:

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

  • Establezca las configuraciones siguientes 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: Límite de conexiones de metastore excedido

Se producirá un error en los comandos que se ejecutan en el clúster con el siguiente seguimiento de pila en los registros de controladores:

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 100 conexiones. Cuando se alcanza el límite de conexiones, no se permiten conexiones nuevas y se produce un error en los comandos. Cada clúster del área de trabajo de Azure Databricks establece una conexión con el metastore. Si tiene un gran número de clústeres en ejecución, este problema puede producirse. 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 que se alcance el límite.

Solución

Corrija el problema con una de las acciones siguientes:

  • Si usa un metastore externo y tiene un gran número de clústeres en ejecución, aumente el límite de conexiones en el metastore externo.
  • Si no usa un metastore externo, asegúrese de que no tiene ninguna configuración personalizada de metastore de Hive en el clúster. Al usar el metastore proporcionado por Azure Databricks, debe utilizar las configuraciones predeterminadas en el clúster para el metastore de Hive.
  • Si usa la configuración predeterminada y se sigue produciendo este problema, póngase en contacto con el soporte técnico Azure Databricks. En función de la configuración del área de trabajo de Azure Databricks, es posible aumentar el número de conexiones permitidas al metastore interno.

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, las acciones de tabla generarán un error como el siguiente:

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 corregido en la versión 2.3.0 del metastore de Hive (HIVE-12274). Azure Databricks usa una versión anterior del metastore de Hive (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 solución alternativa, configure un metastore de Hive externo que use la versión 2.3.0 o posterior. Después, elimine la tabla existente con el comando siguiente:

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