Metastore Apache Hive (hérité)
Cet article explique comment configurer des clusters Azure Databricks pour la connexion à des metastores Apache Hive externes existants. Il fournit des informations sur les exigences de configuration du metastore et du cluster, suivies d’instructions pour la configuration des clusters en vue de leur connexion à un metastore externe. Pour connaître les versions de bibliothèque Hive incluses dans Databricks Runtime, consultez les notes de publication de la version Databricks Runtime correspondantes.
Important
- Bien que SQL Server fonctionne comme base de données metastore sous-jacente pour Hive 2.0 et ultérieur, les exemples de cet article utilisent Azure SQL Database.
- Si vous souhaitez obtenir plus d’informations sur la compatibilité du metastore Hive avec HDInsight, consultez Utiliser des magasins de métadonnées externes dans Azure HDInsight.
- Si vous utilisez Azure Database pour MySQL comme metastore externe, vous devez modifier la valeur de la propriété
lower_case_table_names
de 1 (valeur par défaut) en 2 dans la configuration de la base de données côté serveur. Pour plus d’informations, consultez Respect de la casse des identificateurs.
Remarque
L’utilisation de metastores externes est un modèle de gouvernance des données hérité. Databricks vous recommande une mise à niveau vers Unity Catalog. Unity Catalog facilite la sécurité et la gouvernance de vos données en fournissant un emplacement central pour administrer et auditer l’accès aux données dans plusieurs espaces de travail de votre compte. Consultez Qu’est-ce que Unity Catalog ?.
Configuration du metastore Hive
Le client du metastore s’exécutant à l’intérieur d’un cluster se connecte directement à votre base de données de metastore sous-jacente en utilisant JDBC.
Pour tester la connectivité réseau d’un cluster au metastore, vous pouvez exécuter la commande suivante à l’intérieur d’un notebook :
%sh
nc -vz <DNS name> <port>
where
<DNS name>
est le nom de serveur d’Azure SQL Database.<port>
est le port de la base de données.
Configurations de cluster
Vous devez définir deux ensembles d’options de configuration pour connecter un cluster à un metastore externe :
- Les options de Spark configurent Spark avec la version du metastore Hive et les fichiers JAR pour le client du metastore.
- Les options de Hive configurent le client du metastore pour la connexion au metastore externe.
Options de configuration de Spark
Définissez spark.sql.hive.metastore.version
sur la version de votre metastore Hive et spark.sql.hive.metastore.jars
comme suit :
Hive 0.13 : ne définissez pas
spark.sql.hive.metastore.jars
.Notes
Hive 1.2.0 et 1.2.1 ne correspondent pas au metastore intégré sur Databricks Runtime 7.0 et versions ultérieures. Si vous souhaitez utiliser Hive 1.2.0 ou 1.2.1 avec Databricks Runtime 7.0 et versions ultérieures, suivez la procédure décrite dans Télécharger les fichiers jar du metastore et pointer dessus.
Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) ou Hive 2.3.9 (Databricks Runtime 10.0 et versions ultérieures) : définissez
spark.sql.hive.metastore.jars
surbuiltin
.Pour toutes les autres versions de Hive, Azure Databricks recommande de télécharger les fichiers JAR du metastore et de définir la configuration
spark.sql.hive.metastore.jars
de façon à pointer vers les fichiers JAR téléchargés en suivant la procédure décrite dans Télécharger les fichiers jar du metastore et pointer dessus.
Télécharger les fichiers jar du metastore et pointer dessus
Créez un cluster avec
spark.sql.hive.metastore.jars
défini surmaven
etspark.sql.hive.metastore.version
pour qu’il corresponde à la version de votre metastore.Lorsque le cluster est en cours d’exécution, recherchez dans le journal du pilote une ligne similaire à la suivante :
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
Le répertoire
<path>
est l'emplacement des fichiers JAR téléchargés dans le nœud de pilote du cluster.Vous pouvez également exécuter le code suivant dans un notebook Scala pour afficher l’emplacement des fichiers JAR :
import com.typesafe.config.ConfigFactory val path = ConfigFactory.load().getString("java.io.tmpdir") println(s"\nHive JARs are downloaded to the path: $path \n")
Exécutez
%sh cp -r <path> /dbfs/hive_metastore_jar
(en remplaçant<path>
par les informations de votre cluster) pour copier ce répertoire vers un répertoire dans la racine DBFS appeléehive_metastore_jar
via le client DBFS dans le nœud du pilote.Créez un script init qui copie
/dbfs/hive_metastore_jar
vers le système de fichiers local du nœud, en veillant à ce que le script init reste en veille pendant quelques secondes avant d’accéder au client DBFS. Cela garantit que le client est prêt.Définissez
spark.sql.hive.metastore.jars
pour utiliser ce répertoire. Si votre script d’initialisation copie/dbfs/hive_metastore_jar
dans/databricks/hive_metastore_jars/
, définissezspark.sql.hive.metastore.jars
sur/databricks/hive_metastore_jars/*
. L’emplacement doit inclure le/*
de fin.Redémarrer le cluster.
Options de configuration de Hive
Cette section décrit les options spécifiques de Hive.
Pour vous connecter à un metastore externe en utilisant le mode local, définissez les options de configuration de Hive suivantes :
# JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionURL <mssql-connection-string>
# Username to use against metastore database
javax.jdo.option.ConnectionUserName <mssql-username>
# Password to use against metastore database
javax.jdo.option.ConnectionPassword <mssql-password>
# Driver class name for a JDBC metastore
javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver
where
<mssql-connection-string>
est la chaîne de connexion JDBC (que vous pouvez trouver dans le portail Azure). Vous n’avez pas besoin d’inclure le nom d’utilisateur et le mot de passe dans la chaîne de connexion, car ceux-ci sont définis parjavax.jdo.option.ConnectionUserName
etjavax.jdo.option.ConnectionDriverName
.<mssql-username>
et<mssql-password>
spécifient le nom d’utilisateur et le mot de passe de votre compte Azure SQL Database disposant d’un accès en lecture/écriture à la base de données.
Notes
Pour des environnements de production, nous vous recommandons de définir hive.metastore.schema.verification
sur true
. Cela empêche le client du metastore Hive de modifier implicitement le schéma de base de données du metastore quand la version du client du metastore ne correspond pas à la version de la base de données du metastore. Lorsque vous activez ce paramètre pour des versions de client du metastore antérieures à Hive 1.2.0, assurez-vous que le client du metastore dispose de l’autorisation d’écriture sur la base de données du metastore (afin d’éviter le problème décrit dans HIVE-9749).
- Pour le metastore Hive 1.2.0 et versions ultérieures, définissez
hive.metastore.schema.verification.record.version
surtrue
pour activerhive.metastore.schema.verification
. - Pour le metastore Hive 2.1.1 et versions ultérieures, définissez
hive.metastore.schema.verification.record.version
surtrue
car elle est définie surfalse
par défaut.
Configurer un metastore externe à l’aide de l’interface utilisateur
Pour configurer un metastore externe à l’aide de l’interface utilisateur de Azure Databricks :
Dans la barre latérale, cliquez sur le bouton Clusters.
Cliquez sur Créer un cluster.
Entrez les options de configuration de Spark suivantes :
# Hive-specific configuration options. # spark.hadoop prefix is added to make sure these Hive specific options propagate to the metastore client. # JDBC connect string for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionURL <mssql-connection-string> # Username to use against metastore database spark.hadoop.javax.jdo.option.ConnectionUserName <mssql-username> # Password to use against metastore database spark.hadoop.javax.jdo.option.ConnectionPassword <mssql-password> # Driver class name for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver # Spark specific configuration options spark.sql.hive.metastore.version <hive-version> # Skip this one if <hive-version> is 0.13.x. spark.sql.hive.metastore.jars <hive-jar-source>
Poursuivez la configuration de votre cluster en suivant les instructions dans Informations de référence sur la configuration de calcul.
Cliquez sur Créer un cluster pour créer le cluster.
Configurer un metastore externe à l’aide d’un script init
Les scripts init vous permettent de vous connecter à un metastore Hive existant sans définir manuellement les configurations requises.
- Créez le répertoire de base dans lequel vous souhaitez stocker le script init s’il n’existe pas. L'exemple suivant utilise
dbfs:/databricks/scripts
. - Exécutez l’extrait de code suivant dans un notebook. L’extrait de code crée le script init
/databricks/scripts/external-metastore.sh
dans le Système de fichiers Databricks (DBFS). Vous pouvez également utiliser l’opération Put de l’API REST DBFS pour créer le script init. Ce script init écrit les options de configuration requises dans un fichier de configuration nommé00-custom-spark.conf
dans un format de type JSON sous/databricks/driver/conf/
à l’intérieur de chaque nœud du cluster, chaque fois qu’un cluster portant le nom spécifié<cluster-name>
démarre. Azure Databricks fournit des configurations de Spark par défaut dans le fichier/databricks/driver/conf/spark-branch.conf
. Les fichiers de configuration du répertoire/databricks/driver/conf
s’appliquent dans l’ordre alphabétique inverse. Si vous souhaitez modifier le nom du fichier00-custom-spark.conf
, assurez-vous qu’il continue à s’appliquer avant le fichierspark-branch.conf
.
Scala
dbutils.fs.put(
"/databricks/scripts/external-metastore.sh",
"""#!/bin/sh
|# Loads environment variables to determine the correct JDBC driver to use.
|source /etc/environment
|# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
|cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
|[driver] {
| # Hive specific configuration options.
| # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
| # JDBC connect string for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
|
| # Username to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
|
| # Password to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
|
| # Driver class name for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
|
| # Spark specific configuration options
| "spark.sql.hive.metastore.version" = "<hive-version>"
| # Skip this one if <hive-version> is 0.13.x.
| "spark.sql.hive.metastore.jars" = "<hive-jar-source>"
|}
|EOF
|""".stripMargin,
overwrite = true
)
Python
contents = """#!/bin/sh
# Loads environment variables to determine the correct JDBC driver to use.
source /etc/environment
# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
[driver] {
# Hive specific configuration options.
# spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
# JDBC connect string for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
# Username to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
# Password to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
# Driver class name for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
# Spark specific configuration options
"spark.sql.hive.metastore.version" = "<hive-version>"
# Skip this one if <hive-version> is 0.13.x.
"spark.sql.hive.metastore.jars" = "<hive-jar-source>"
}
EOF
"""
dbutils.fs.put(
file = "/databricks/scripts/external-metastore.sh",
contents = contents,
overwrite = True
)
- Configurez votre cluster avec le script init.
- Redémarrez le cluster.
Dépannage
Les clusters ne démarrent pas (en raison de paramètres de script init incorrects)
Si un script init pour configurer le metastore externe entraîne l’échec de création du cluster, configurez le script init pour journaliser, et déboguez le script init à l’aide des journaux.
Erreur dans une instruction SQL : InvocationTargetException
Modèle de message d’erreur dans la trace de l’exception entière :
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
Les informations de connexion JDBC du metastore externe sont mal configurées. Vérifiez le nom d’hôte, le port, le nom d’utilisateur, le mot de passe et le nom de classe du pilote JDBC configurés. En outre, assurez-vous que le nom d’utilisateur dispose du privilège approprié pour accéder à la base de données du metastore.
Modèle de message d’erreur dans la trace de l’exception entière :
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
La base de données du metastore externe n’est pas correctement initialisée. Vérifiez que vous avez créé la base de données du metastore et que vous avez placé le nom de base de données approprié dans la chaîne de connexion JDBC. Ensuite, démarrez un nouveau cluster avec les deux options de configuration de Spark suivantes :
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
Ainsi, la bibliothèque de client Hive tentera de créer et d’initialiser automatiquement des tables dans la base de données du metastore quand elle tentera d’y accéder, mais les trouvera absentes.
Erreur dans l’instruction SQL : AnalysisException : Impossible d’instancier org.apache.hadoop.hive.metastore.HiveMetastoreClient
Message d’erreur dans la trace de l’exception entière :
The specified datastore driver (driver name) was not found in the CLASSPATH
Le cluster est configuré pour utiliser un pilote JDBC incorrect.
La définition de datanucleus.autoCreateSchema sur true ne fonctionne pas comme prévu
Par défaut, Databricks définit également datanucleus.fixedDatastore
sur true
, ce qui empêche toute modification structurelle accidentelle des bases de données du metastore. Par conséquent, la bibliothèque de client Hive ne peut pas créer de tables de metastore, même si vous définissez datanucleus.autoCreateSchema
sur true
. Cette stratégie est, en général, plus sûre pour des environnements de production, car elle empêche la mise à niveau accidentelle de la base de données du metastore.
Si vous souhaitez utiliser datanucleus.autoCreateSchema
pour initialiser la base de données du metastore, veillez à définir datanucleus.fixedDatastore
sur false
. Par ailleurs, vous pouvez inverser les deux indicateurs après l’initialisation de la base de données du metastore afin d’améliorer la protection de votre environnement de production.