Ouvrez Synapse Studio, accédez à Gérer > Services liés à gauche, puis cliquez sur Nouveau pour créer un service lié.
Choisissez Azure Database pour MySQL, cliquez sur Continuer.
Entrez le nom du service lié. Enregistrez le nom du service lié. Ces informations seront utilisées pour configurer Spark dans un instant.
Sélectionnez Azure Database pour MySQL pour le metastore Hive externe à partir de la liste d’abonnements Azure ou entrez les informations manuellement.
Entrez un nom d’utilisateur et un mot de passe pour configurer la connexion.
Testez la connexion pour vérifier le nom d’utilisateur et le mot de passe.
Cliquez sur Créer pour créer le service lié.
Certains paramètres de règle de sécurité réseau peuvent bloquer l’accès du pool Spark à la base de données du metastore Hive externe. Avant de configurer le pool Spark, exécutez le code ci-dessous dans un notebook du pool Spark pour tester la connexion à la base de données du metastore Hive externe.
Vous pouvez également obtenir votre version de metastore Hive dans les résultats de sortie. La version du metastore Hive est utilisée dans la configuration Spark.
Avertissement
Ne publiez pas les scripts de test dans votre bloc-notes avec votre mot de passe codé en dur, car cela peut entraîner un risque de sécurité pour votre metastore Hive.
Code de test de connexion pour 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")
}
Code de test de connexion pour Azure Database pour 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")
}
Après avoir créé le service lié au metastore Hive externe, vous devez définir des configurations Spark pour utiliser le metastore Hive externe. Vous pouvez définir la configuration au niveau du pool Spark ou au niveau de la session Spark.
Voici les configurations et les descriptions :
Notes
Synapse est conçu pour utiliser de manière fluide les calculs HDI. Toutefois, HMS 3.1 dans HDI 4.0 n’est pas entièrement compatible avec l’OSS HMS 3.1. Pour l’OSS HMS 3.1, vérifiez ici.
Configuration Spark |
Description |
spark.sql.hive.metastore.version |
Versions prises en charge : Veillez à utiliser les deux premières parties sans la troisième partie |
spark.sql.hive.metastore.jars |
- Version 2.3 :
/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/* - Version 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 |
Nom de votre service lié |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc,com.microsoft.vegas |
Lors de la création du pool Spark, sous l’onglet Paramètres supplémentaires, placez les configurations ci-dessous dans un fichier texte et chargez-les dans la section Configuration Apache Spark. Vous pouvez également utiliser le menu contextuel d’un pool Spark existant et choisir la configuration Apache Spark pour ajouter ces configurations.
Mettez à jour la version du metastore et le nom du service lié, puis enregistrez les configurations ci-dessous dans un fichier texte pour la configuration du pool 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.vegas
Voici un exemple de la version 2.3 du metastore avec un service lié nommé 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.vegas
Pour une session de notebook, vous pouvez également configurer la session Spark dans le notebook avec la commande magique %%configure
. Voici le code.
%%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.vegas"
}
}
Pour un programme de traitement par lots, la même configuration peut aussi être appliquée avec SparkConf
.
Exécuter les requêtes pour vérifier la connexion
Après tous ces paramètres, essayez de répertorier les objets de catalogue en exécutant la requête ci-dessous dans le notebook Spark pour vérifier la connectivité au metastore Hive externe.
spark.sql("show databases").show()
Configurer une connexion de stockage
Le service lié à la base de données du metastore Hive fournit seulement l’accès aux métadonnées du catalogue Hive. Pour interroger les tables existantes, vous devez configurer la connexion au compte de stockage qui stocke également les données sous-jacentes de vos tables Hive.
Configurer la connexion à Azure Data Lake Storage Gen2
Compte de stockage principal de l’espace de travail
Si les données sous-jacentes de vos tables Hive sont stockées dans le compte de stockage principal de l’espace de travail, vous n’avez pas besoin de paramètres supplémentaires. Elle fonctionnera tant que vous avez suivi les instructions de configuration du stockage lors de la création de l’espace de travail.
Autre compte ADLS Gen 2
Si les données sous-jacentes de vos catalogues Hive sont stockées dans un autre compte ADLS Gen 2, vous devez vous assurer que les utilisateurs qui exécutent des requêtes Spark disposent du rôle Contributeur de données blob de Stockage sur le compte de stockage ADLS Gen2.
Configurer la connexion au Stockage Blob
Si les données sous-jacentes de vos tables Hive sont stockées dans le compte de stockage Blob Azure, configurez la connexion en suivant les étapes ci-dessous :
Ouvrez Synapse Studio, accédez à Données > onglet Lié > bouton Ajouter>Se connecter à des données externes.
Sélectionnez Stockage Blob Azure, puis Continuer.
Entrez le nom du service lié. Enregistrez le nom du service lié. Ces informations sont utilisées par la suite dans la configuration Spark.
Sélectionnez le compte de Stockage Blob Azure. Vérifiez que la méthode d’authentification est Clé de compte. Actuellement, le pool Spark peut uniquement accéder à un compte de stockage Blob via une clé de compte.
Testez la connexion et sélectionnez Créer.
Après avoir créé le service lié au compte de stockage Blob, lorsque vous exécutez des requêtes Spark, veillez à exécuter le code Spark ci-dessous dans le notebook pour accéder au compte de stockage Blob pour la session Spark. En savoir plus sur la raison pour laquelle vous devez le faire ici.
%%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)
Après avoir configuré des connexions de stockage, vous pouvez interroger les tables existantes dans le metastore Hive.
Limitations connues
- L’Explorateur d’objets de Synapse Studio continue à afficher des objets dans le metastore Synapse managé au lieu du service HMS externe.
-
SQL <-> Synchronisation Spark ne fonctionne pas en cas d’utilisation d’HMS externe.
- Seuls Azure SQL Database et Azure Database pour MySQL sont pris en charge comme base de données de metastore Hive externe. Seule l’autorisation SQL est prise en charge.
- Actuellement, Spark fonctionne uniquement avec des tables Hive externes et des tables Hive managées non transactionnelles/non-ACID. Il ne prend pas en charge les tables transactionnelles/ACID Hive.
- L’intégration d’Apache Ranger n’est pas prise en charge.
Dépannage
Consultez l’erreur ci-dessous lors de l’interrogation d’une table Hive avec des données stockées dans le Stockage Blob
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.
Lorsque vous utilisez l’authentification par clé pour votre compte de stockage via le service lié, vous devez effectuer une étape supplémentaire pour obtenir le jeton pour la session Spark. Exécutez le code ci-dessous pour configurer votre session Spark avant d’exécuter la requête. En savoir plus sur la raison pour laquelle vous devez le faire ici.
%%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)
Voir l’erreur ci-dessous lors de la requête d’une table stockée dans un compte ADLS Gen2
Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD
Cela peut se produire si l’utilisateur qui exécute la requête Spark n’a pas un accès suffisant au compte de stockage sous-jacent. Vérifiez que l’utilisateur qui exécute des requêtes Spark a le rôle Contributeur aux données blob de stockage sur le compte de stockage ADLS Gen2. Cette étape peut être effectuée après la création du service lié.
Pour éviter de modifier le schéma/la version back-end HMS, les configurations Hive suivantes sont définies par le système par défaut :
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 votre version HMS est 1.2.1
ou 1.2.2
, il y a un problème dans Hive qui demande uniquement 1.2.0
si vous activez spark.hadoop.hive.metastore.schema.verification
sur true
. Notre suggestion est de définir votre version HMS sur 1.2.0
ou de choisir une des deux configurations suivantes comme solution de contournement :
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
Si vous devez migrer votre version du service HMS, nous vous recommandons d’utiliser l’outil de schéma hive. Et si le service HMS a été utilisé par les clusters HDInsight, nous vous suggérons d’utiliser la version fournie par HDI.
Changement du schéma HMS pour l’OSS HMS 3.1
Synapse est conçu pour utiliser de manière fluide les calculs HDI. Toutefois, HMS 3.1 dans HDI 4.0 n’est pas entièrement compatible avec l’OSS HMS 3.1. Appliquez manuellement ce qui suit à votre HMS 3.1, s’il n’est pas approvisionné par HDI.
-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
Si vous souhaitez partager le catalogue Hive avec un cluster Spark dans HDInsight 4.0, vérifiez que votre propriété spark.hadoop.metastore.catalog.default
dans Synapse Spark est alignée sur la valeur de HDInsight Spark. La valeur par défaut pour HDI Spark est spark
et la valeur par défaut pour Synapse Spark est hive
.
Comme mentionné dans les limitations, le pool Synapse Spark ne prend en charge que les tables Hive externes et les tables managées non transactionnelles/ACID. Il ne prend pas actuellement en charge les tables transactionnelles/ACID Hive. Dans les clusters HDInsight 4.0 Hive, toutes les tables managées sont créées comme des tables ACID/transactionnelles par défaut. C’est pourquoi vous recevez des résultats vides quand vous interrogez ces tables.
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
Vous pouvez facilement résoudre ce problème en ajoutant /usr/hdp/current/hadoop-client/*
à 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/*