Compartir a través de


Uso de un metastore de Hive externo para un grupo de Spark de Synapse

Nota:

Los metastores externos de Hive ya no se admitirán en Azure Synapse Runtime para Apache Spark 3.4 y versiones posteriores en Synapse.

Azure Synapse Analytics permite que los grupos de Apache Spark en la misma área de trabajo compartan un metastore compatible con HMS (Metastore de Hive) administrado como su catálogo. Si los clientes quieren conservar los metadatos de catálogo de Hive fuera del área de trabajo y compartir objetos del catálogo con otros motores de cálculo externos a esta, como HDInsight y Azure Databricks, pueden conectarse a un metastore de Hive externo. En este artículo, puede aprender a conectar Spark de Synapse a un metastore de Apache Hive externo.

Versiones admitidas de metastore de Hive

La característica funciona con Spark 3.1. En la tabla siguiente se muestran las versiones compatibles de metastore de Hive para cada versión de Spark.

Versión de Spark HMS 2.3.x HMS 3.1.X
3.3

Configuración del servicio vinculado al metastore de Hive

Nota

Solo Azure SQL Database y Azure Database for MySQL se admiten como un metastore de Hive externo. Y actualmente solo se admite la autenticación de usuario-contraseña. Si la base de datos proporcionada está en blanco, debe aprovisionarla mediante la herramienta Hive Schema para crear el esquema de base de datos.

Siga estos pasos para configurar un servicio vinculado al metastore de Hive externo en el área de trabajo de Synapse.

  1. Abra Synapse Studio, vaya a Administrar > Servicios vinculados a la izquierda y seleccione Nuevo para crear un servicio vinculado.

    Configuración del servicio vinculado de metastore de Hive

  2. Elija Azure SQL Database o Azure Database for MySQL en función del tipo de base de datos y seleccione Continuar.

  3. Proporcione el Nombre del servicio vinculado. Registre el nombre del servicio vinculado. Esta información se usará para configurar Spark en breve.

  4. Puede seleccionar Azure SQL Database/Azure Database for MySQL para el metastore de Hive externo en la lista de suscripciones de Azure, o bien escribir la información manualmente.

  5. Proporcione el Nombre de usuario y la Contraseña para configurar la conexión.

  6. Prueba de conexión para comprobar el nombre de usuario y la contraseña.

  7. Seleccione Crear para crear el servicio vinculado.

Probar la conexión y obtener la versión del metastore en el cuaderno

Algunos valores de reglas de seguridad de red pueden bloquear el acceso desde el grupo de Spark a la base de datos del metastore de Hive externa. Antes de configurar el grupo de Spark, ejecute el código siguiente en cualquier cuaderno del grupo de Spark para probar la conexión a la base de datos del metastore de Hive externo.

También puede obtener la versión del metastore de Hive a partir de los resultados de salida. La versión del metastore de Hive se usará en la configuración de Spark.

Advertencia

No publique los scripts de prueba en el cuaderno con la contraseña codificada de forma rígida, ya que esto podría provocar un riesgo de seguridad potencial para el metastore de Hive.

Código de pruebas de conexión para Azure SQL

%%spark 
import java.sql.DriverManager 
/** this JDBC url could be copied from Azure portal > Azure SQL database > Connection strings > JDBC **/ 
val url = s"jdbc:sqlserver://{your_servername_here}.database.windows.net:1433;database={your_database_here};user={your_username_here};password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" 
try { 
    val connection = DriverManager.getConnection(url) 
    val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t") 
    result.next(); 
    println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}") 
} catch { 
    case ex: Throwable => println(s"Failed to establish connection:\n $ex") 
}  

Código de pruebas de conexión para Azure Database for MySQL

%%spark 
import java.sql.DriverManager 
/** this JDBC url could be copied from Azure portal > Azure Database for MySQL > Connection strings > JDBC **/ 
val url = s"jdbc:mysql://{your_servername_here}.mysql.database.azure.com:3306/{your_database_here}?useSSL=true"
try { 
    val connection = DriverManager.getConnection(url, "{your_username_here}", "{your_password_here}");
    val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t") 
    result.next(); 
    println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}") 
} catch { 
    case ex: Throwable => println(s"Failed to establish connection:\n $ex") 
}  

Configuración de Spark para usar el metastore de Hive externo

Después de crear el servicio vinculado en el Metastore de Hive externo correctamente, debe configurar algunas configuraciones de Spark para usar el Metastore de Hive externo. Puede definir la configuración en el nivel de grupo de Spark o en el nivel de sesión de Spark.

Estas son las configuraciones y descripciones:

Nota

Synapse pretende trabajar sin problemas con los procesos de HDI. Pero HMS 3.1 en HDI 4.0 no es totalmente compatible con OSS HMS 3.1. Para OSS HMS 3.1, consulte esto.

Configuración de Spark Descripción
spark.sql.hive.metastore.version Versiones admitidas:
  • 2.3
  • 3.1
Asegúrese de usar las dos primeras partes sin la tercera
spark.sql.hive.metastore.jars
  • Versión 2.3: /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Versión 3.1: /opt/hive-metastore/lib-3.1/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name Nombre del servicio vinculado
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas

Configuración en el nivel de grupo de Spark

Al crear el grupo de Spark, en la pestaña Configuración adicional, coloque las configuraciones siguientes en un archivo de texto y cárguelo en la sección de Configuración de Apache Spark. También puede usar el menú contextual de un grupo de Spark existente y elegir la configuración de Apache Spark para agregar estas configuraciones.

Configuración del grupo de Spark

Actualice la versión del metastore y el nombre del servicio vinculado y guarde las configuraciones siguientes en un archivo de texto para la configuración del grupo de Spark:

spark.sql.hive.metastore.version <your hms version, Make sure you use the first 2 parts without the 3rd part>
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name <your linked service name>
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas

Este es un ejemplo de metastore versión 2.3 con un servicio vinculado denominado HiveCatalog21:

spark.sql.hive.metastore.version 2.3
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name HiveCatalog21
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas

Configuración en el nivel de sesión de Spark

Para la sesión del cuaderno, también puede configurar la sesión de Spark en el cuaderno mediante el comando magic %%configure. Este es el código.

%%configure -f
{
    "conf":{
        "spark.sql.hive.metastore.version":"<your hms version, 2 parts>",
        "spark.hadoop.hive.synapse.externalmetastore.linkedservice.name":"<your linked service name>",
        "spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*",
        "spark.sql.hive.metastore.sharedPrefixes":"com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas"
    }
}

Para el trabajo por lotes, también se puede aplicar la misma configuración mediante SparkConf.

Realizar consultas para comprobar la conexión

Después de toda esta configuración, pruebe a enumerar objetos de catálogo mediante la ejecución de la consulta siguiente en el cuaderno de Spark para comprobar la conectividad con el metastore de Hive externo.

spark.sql("show databases").show()

Configuración de una conexión de almacenamiento

El servicio vinculado a la base de datos del metastore de Hive solo proporciona acceso a los metadatos del catálogo de Hive. Para consultar las tablas existentes, también debe configurar la conexión a la cuenta de almacenamiento que almacena los datos subyacentes de las tablas de Hive.

Configuración de la conexión a Azure Data Lake Storage Gen 2

Cuenta de almacenamiento principal del área de trabajo

Si los datos subyacentes de las tablas de Hive se almacenan en la cuenta de almacenamiento principal del área de trabajo, no es necesario realizar configuraciones adicionales. Solo funcionará siempre que siga las instrucciones de configuración de almacenamiento durante la creación del área de trabajo.

Otra cuenta de ADLS Gen2

Si los datos subyacentes de los catálogos de Hive se almacenan en otra cuenta de ADLS Gen2, debe asegurarse de que los usuarios que ejecutan consultas de Spark tienen un rol de colaborador de datos de Storage Blob en la cuenta de almacenamiento de ADLS Gen2.

Configuración de la conexión a Blob Storage

Si los datos subyacentes de las tablas de Hive se almacenan en la cuenta de Azure Blob Storage, configure la conexión siguiendo estos pasos:

  1. Abra Synapse Studio, vaya a Datos > Pestaña vinculada > botón Agregar>Conectar a datos externos.

    Conectar con la cuenta de almacenamiento

  2. Elija Azure Blob Storage y seleccione Continuar.

  3. Proporcione el Nombre del servicio vinculado. Registre el nombre del servicio vinculado; esta información se usará en la configuración de Spark en breve.

  4. Seleccione la cuenta de Azure Blob Storage. Asegúrese de que el método de autenticación es Clave de cuenta. Actualmente, el grupo de Spark solo puede acceder a la cuenta de Blob Storage a través de la clave de cuenta.

  5. Pruebe la conexión y seleccione Crear.

  6. Después de crear el servicio vinculado a la cuenta de Blob Storage, al ejecutar consultas de Spark, asegúrese de ejecutar el siguiente código de Spark en el cuaderno para obtener acceso a la cuenta de Blob Storage para la sesión de Spark. Obtenga más información sobre por qué debe hacerlo aquí.

%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)

Después de configurar las conexiones de almacenamiento, puede consultar las tablas existentes en el metastore de Hive.

Limitaciones conocidas

  • El explorador de objetos de Synapse Studio seguirá mostrando objetos en el metastore de Synapse administrado en lugar del HMS externo.
  • SQL <-> Sincronización de Spark no funciona al utilizar HMS externo.
  • Solo Azure SQL Database y Azure Database for MySQL se admiten como base de datos de un metastore de Hive externo. Solo se admite autorización SQL.
  • Actualmente, Spark solo funciona en tablas externas de Hive y tablas de Hive administradas no transaccionales o que no son de ACID. No admite tablas de Hive ACID/transaccionales.
  • No se admite la integración de Apache Ranger.

Solución de problemas

Vea el siguiente error al consultar una tabla de Hive con datos almacenados en Blob Storage

No credentials found for account xxxxx.blob.core.windows.net in the configuration, and its container xxxxx is not accessible using anonymous credentials. Please check if the container exists first. If it is not publicly available, you have to provide account credentials.

Al usar la autenticación de clave en la cuenta de almacenamiento a través de un servicio vinculado, debe realizar un paso adicional para obtener el token para la sesión de Spark. Ejecute el código siguiente para configurar la sesión de Spark antes de ejecutar la consulta. Obtenga más información sobre por qué debe hacerlo aquí.

%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)

Vea el siguiente error al consultar una tabla almacenada en una cuenta de ADLS Gen2.

Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD

Esto podría ocurrir porque el usuario que ejecuta la consulta de Spark no tiene acceso suficiente a la cuenta de almacenamiento subyacente. Asegúrese de que los usuarios que ejecutan consultas de Spark tienen el rol de colaborador de datos de Storage Blob en la cuenta de almacenamiento de ADLS Gen2. Este paso se puede realizar después de crear el servicio vinculado.

Para evitar cambiar la versión o el esquema de back-end de HMS, el sistema establece las siguientes configuraciones de Hive de forma predeterminada:

spark.hadoop.hive.metastore.schema.verification true 
spark.hadoop.hive.metastore.schema.verification.record.version false 
spark.hadoop.datanucleus.fixedDatastore true 
spark.hadoop.datanucleus.schema.autoCreateAll false 

Si la versión de HMS es 1.2.11.2.2, hay un problema en Hive que solo exige 1.2.0 si establece spark.hadoop.hive.metastore.schema.verification en true. La sugerencia es que puede modificar la versión de HMS a 1.2.0, o bien sobrescribir las dos configuraciones siguientes como solución alternativa:

spark.hadoop.hive.metastore.schema.verification false 
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false

Si necesita migrar la versión de HMS, se recomienda usar la herramienta de esquema de Hive. Y si los clústeres de HDInsight han usado HMS, se recomienda usar la versión proporcionada por HDI.

Cambio de esquema de HMS para OSS HMS 3.1

Synapse pretende trabajar sin problemas con los procesos de HDI. Pero HMS 3.1 en HDI 4.0 no es totalmente compatible con OSS HMS 3.1. Aplique manualmente lo siguiente a HMS 3.1 si HDI no lo ha aprovisionado.

-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);

Al compartir el metastore con clústeres de Spark de HDInsight 4.0, no puedo ver las tablas

Si desea compartir el catálogo de Hive con un clúster de Spark en HDInsight 4.0, asegúrese de que la propiedad spark.hadoop.metastore.catalog.default de Spark de Synapse esté alineada con el valor de Spark de HDInsight. El valor predeterminado de HDI Spark es spark y el de Spark de Synapse es hive.

Al compartir el metastore de Hive con clústeres de Hive de HDInsight 4.0, puedo enumerar las tablas correctamente, pero solo obtengo un resultado vacío al consultar la tabla.

Como se ha mencionado en las limitaciones, el grupo de Spark de Synapse solo admite tablas externas de Hive y tablas administradas no transaccionales o ACID. Actualmente no admite tablas ACID o transaccionales de Hive. En los clústeres de Hive de HDInsight 4.0, todas las tablas administradas se crean como tablas ACID o transaccionales de forma predeterminada, por eso obtiene resultados vacíos al consultarlas.

Vea el siguiente error cuando se usa un metastore externo mientras está habilitada la caché inteligente.

java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found

Puede corregir fácilmente este problema anexando /usr/hdp/current/hadoop-client/* a spark.sql.hive.metastore.jars.

Eg: 
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*