Magasin de Apache Hive externe

Cet article explique comment configurer des clusters Azure Databricks pour se connecter à des restaurations de Apache Hive externes existantes. Il fournit des informations sur les conditions requises pour l’installation et la configuration du cluster de la restauration des données recommandées, suivies par les instructions de configuration des clusters pour se connecter à une banque de données externe. Le tableau suivant récapitule les versions de metastore Hive prises en charge dans chaque version de Databricks Runtime.

Version de Databricks Runtime 0,13-1.2.1 2.1 2.2 2.3 3.1.0
7.x Oui Oui Oui Oui Oui
6.x Oui Oui Oui Oui Oui
5,3 et versions ultérieures Oui Oui Oui Oui Oui
5,1-5,2 et 4. x Oui Oui Oui Oui Non
3.x Oui Oui Non Non Non

Important

  • SQL Server ne fonctionne pas en tant que base de données de la base de données de la banque sous-jacente pour Hive 2,0 et versions ultérieures ; toutefois, Azure SQL Database fonctionne et est utilisé comme exemple dans cet article.
  • Vous pouvez utiliser un 1.2.0 Hive ou 1.2.1 d’un cluster HDInsight en tant que magasin externe. Consultez utiliser des magasins de métadonnées externes dans Azure HDInsight.
  • Si vous utilisez Azure Database pour MySQL en tant que serveur de restauration externe, vous devez modifier la valeur de la lower_case_table_names propriété de 1 (valeur par défaut) à 2 dans la configuration de la base de données côté serveur. Pour plus d’informations, consultez respect de la casse des identificateurs.

Configuration de metastore Hive

Le client de la base de données en cours d’exécution à l’intérieur d’un cluster se connecte directement à votre base de données de magasin sous-jacente en utilisant

Pour tester la connectivité réseau à partir d’un cluster vers le magasin de clés, vous pouvez exécuter la commande suivante à l’intérieur d’un bloc-notes :

%sh
nc -vz <DNS name> <port>

where

  • <DNS name>nom du serveur de Azure SQL Database.
  • <port> 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 cluster de stockage externe :

  • Les options Spark configurent Spark avec la version metastore Hive et les fichiers jar du client de la Banque.
  • Options Hive configurez le client de la Banque d’enregistrement pour qu’il se connecte au magasin externe.

Options de configuration 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 pas définir spark.sql.hive.metastore.jars .

  • Hive 1.2.0 ou 1.2.1 (Databricks Runtime 6,6 et versions antérieures) : affectez à la valeur spark.sql.hive.metastore.jarsbuiltin .

    Remarque

    Hive 1.2.0 et 1.2.1 ne sont pas le stockage intégré à 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 magasin et pointezdessus.

  • Hive 2.3.7 (Databricks Runtime 7,0 et versions ultérieures) : affectez à la valeur spark.sql.hive.metastore.jarsbuiltin .

  • Pour toutes les autres versions de Hive, Azure Databricks vous recommande de télécharger les fichiers jar du magasin et de définir la configuration de manière à ce qu’elle spark.sql.hive.metastore.jars pointe vers les fichiers jar téléchargés à l’aide de la procédure décrite dans spark.sql.hive.metastore.jars.

Télécharger les fichiers jar du magasin 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 magasin.

  2. Lorsque le cluster est en cours d’exécution, recherchez dans le journal des pilotes et recherchez une ligne semblable à 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 du pilote du cluster.

    Vous pouvez également exécuter le code suivant dans un bloc-notes Scala pour imprimer 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 ( <path> en remplaçant par les informations de votre cluster) pour copier ce répertoire dans un répertoire dans dBFS appelé hive_metastore_jar par le biais du client fusible dans le nœud Driver.

  4. Créez un script init qui copie sur le système de fichiers local du nœud, en veillant à faire en sorte que le script init se met en veille quelques secondes avant d’accéder au client de fusible dBFS. Cela permet de s’assurer 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émarrez le cluster.

Options de configuration Hive

Cette section décrit les options spécifiques à Hive.

Pour vous connecter à une bibliothèque de stockage externe à l’aide du mode local, définissez les options de configuration 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> 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écifiez 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.

Remarque

Pour les environnements de production, nous vous recommandons de définir hive.metastore.schema.verification sur true . Cela empêche metastore Hive client de modifier implicitement le schéma de base de données de la base de données de la Banque quand la version du client de la Banque ne correspond pas à la version de la base de données de la Banque. Lorsque vous activez ce paramètre pour les versions clientes de la base de données de stockage antérieures à Hive 1.2.0, assurez-vous que le client de la Banque d’données de la base de données de la base de données de la base de données de la base de données 9749(.

  • Pour metastore Hive 1.2.0 et versions ultérieures, affectez à la valeur hive.metastore.schema.verification.record.versiontrue pour activer hive.metastore.schema.verification .
  • Pour metastore Hive 2.1.1 et versions ultérieures, affectez la valeur à, hive.metastore.schema.verification.record.versiontrue car elle est définie sur false par défaut.

Configurer un magasin externe à l’aide de l’interface utilisateur

Pour configurer un magasin de clés externe à l’aide de l’interface utilisateur Azure Databricks :

  1. Cliquez sur le bouton clusters dans la barre latérale.

  2. Cliquez sur Créer un cluster.

  3. Entrez les options de configuration Sparksuivantes :

    # 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 de la Configuration des clusters.

  5. Cliquez sur créer un cluster pour créer le cluster.

Configurer un magasin de clés 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 /databricks/scripts/external-metastore.sh. 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/ chaque nœud du cluster, chaque fois qu’un cluster portant le nom spécifié est <cluster-name> démarré. Azure Databricks fournit des configurations Spark par défaut dans le /databricks/driver/conf/spark-branch.conf fichier. Les fichiers de configuration du /databricks/driver/conf répertoire s’appliquent dans l’ordre alphabétique inversé. Si vous souhaitez modifier le nom du 00-custom-spark.conf fichier, assurez-vous qu’il continue à s’appliquer avant le spark-branch.conf fichier.

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 magasin externe provoque l’échec de la création du cluster, configurez le script init à Enregistreret déboguez le script init à l’aide des journaux.

erreur dans l’instruction SQL : InvocationTargetException

  • Modèle de message d’erreur dans la trace de pile d’exception complète :

    Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
    

    Les informations de connexion JDBC de la Banque d’informations externe ne sont pas 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 des autorisations appropriées pour accéder à la base de données de la Banque.

  • Modèle de message d’erreur dans la trace de pile d’exception complète :

    Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
    

    La base de données de la Banque externe n’est pas correctement initialisée. Vérifiez que vous avez créé la base de données de la Banque d’données 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 Spark suivantes :

    datanucleus.autoCreateSchema true
    datanucleus.fixedDatastore false
    

    De cette façon, la bibliothèque cliente Hive tentera de créer et d’initialiser automatiquement des tables dans la base de données de la base de données de la Banque d’données quand elle tentera de les accéder, mais les trouvera absentes.

erreur dans l’instruction SQL : AnalysisException : impossible d’instancier org. apache. hadoop. hive. restore. HiveMetastoreClient

Message d’erreur dans l’intégralité de la trace de l’exception :

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 affecte également datanucleus.fixedDatastore la valeur à true , ce qui empêche toute modification structurelle accidentelle des bases de données de la base de données de la Banque. Par conséquent, la bibliothèque cliente Hive ne peut pas créer de tables de la table de stockage, même si vous définissez datanucleus.autoCreateSchema sur true . Cette stratégie est, en général, plus sûre pour les environnements de production, car elle empêche la mise à niveau accidentelle de la base de données de la Banque.

Si vous souhaitez utiliser datanucleus.autoCreateSchema pour initialiser la base de données de la base de données de la Banque d’informations, veillez à affecter à la valeur datanucleus.fixedDatastorefalse . En outre, vous souhaiterez peut-être inverser les deux indicateurs après l’initialisation de la base de données de la Banque d’données pour améliorer la protection de votre environnement de production.