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 sur builtin.

  • 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

  1. Créez un cluster avec spark.sql.hive.metastore.jars défini sur maven et spark.sql.hive.metastore.version pour qu’il corresponde à la version de votre metastore.

  2. 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")
    
  3. 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ée hive_metastore_jar via le client DBFS dans le nœud du pilote.

  4. 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.

  5. 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éfinissez spark.sql.hive.metastore.jars sur /databricks/hive_metastore_jars/*. L’emplacement doit inclure le /* de fin.

  6. 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 par javax.jdo.option.ConnectionUserName et javax.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 sur true pour activer hive.metastore.schema.verification.
  • Pour le metastore Hive 2.1.1 et versions ultérieures, définissez hive.metastore.schema.verification.record.version sur true car elle est définie sur false 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 :

  1. Dans la barre latérale, cliquez sur le bouton Clusters.

  2. Cliquez sur Créer un cluster.

  3. 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>
    
  4. Poursuivez la configuration de votre cluster en suivant les instructions dans Informations de référence sur la configuration de calcul.

  5. 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.

  1. 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.
  2. 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 fichier 00-custom-spark.conf, assurez-vous qu’il continue à s’appliquer avant le fichier spark-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
)
  1. Configurez votre cluster avec le script init.
  2. 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.