Aller au contenu principal

External Apache Hive metastore (legacy)

important

Cette documentation a été retirée et pourrait ne pas être mise à jour.

remarque

L’utilisation de métastores externes est un modèle de gouvernance des données hérité. Databricks vous recommande de passer à Unity Catalog. Unity Catalog simplifie 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 Workspaces de votre compte. Voir Qu'est-ce que Unity Catalog ?.

Cet article décrit comment configurer les clusters Databricks pour se connecter à des métastores Apache Hive externes existants. Il fournit des informations sur les modes de déploiement des métastores, la configuration réseau recommandée et les exigences de configuration des clusters, suivies des instructions pour configurer les clusters afin de se connecter à un métastore externe. Pour les versions de bibliothèque Hive incluses dans Databricks Runtime, consultez les notes de version Databricks Runtime pertinentes.

important
  • SQL Server ne fonctionne pas comme base de données de métastore sous-jacente pour Hive 2.0 et versions ultérieures.
  • 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 default) à 2 dans la configuration de la base de données côté serveur. Pour plus de détails, consultez Sensibilité à la casse de l'identifiant.

Modes de déploiement du Hive metastore

Dans un environnement de production, vous pouvez déployer un Hive metastore selon deux modes : local et distant.

Mode local

Le client de métastore exécuté au sein d'un cluster se connecte directement à la base de données de métastore sous-jacente via JDBC.

Mode distant

Au lieu de se connecter directement à la base de données sous-jacente, le client du metastore se connecte à un service de metastore distinct via le protocole Thrift. Le service metastore se connecte à la base de données sous-jacente. Lors de l'exécution d'un metastore en mode distant, DBFS n'est *pas pris en charge*.

Pour plus de détails sur ces modes de déploiement, consultez la documentation Hive.

remarque

Les exemples dans ce document utilisent MySQL comme base de données de metastore sous-jacente.

Configurations des clusters

Vous devez définir trois ensembles d'options de configuration pour connecter un cluster à un métastore externe :

  • Les options Spark configurent Spark avec la version du Hive metastore et les JARs pour le client metastore.
  • Les options Hive configurent le client metastore pour se connecter au metastore externe.

Options de configuration Spark

Définissez spark.sql.hive.metastore.version sur la version de votre Hive metastore et spark.sql.hive.metastore.jars comme suit :

  • Hive 0,13 : ne définissez pas spark.sql.hive.metastore.jars.
remarque

Hive 1.2.0 et 1.2.1 ne sont pas le métastore 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 download les JAR du métastore et y faire référence.

  • Hive 2.3.7 (Databricks Runtime 7.0 à 9.x) ou Hive 2.3.9 (Databricks Runtime 10.0 et versions supérieures) : définissez spark.sql.hive.metastore.jars sur builtin.

  • Pour toutes les autres versions de Hive, Databricks vous recommande de download les JAR du metastore et de définir la configuration spark.sql.hive.metastore.jars pour qu’elle pointe vers les JAR downloaded à l’aide de la procédure décrite dans download les JAR du metastore et pointez-les.

download les JAR du metastore et pointez vers eux.

  1. Créez un cluster avec spark.sql.hive.metastore.jars défini sur maven et spark.sql.hive.metastore.version pour correspondre à la version de votre métastore.

  2. Lorsque le cluster est en cours d'exécution, recherchez dans le log du driver 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 JAR téléchargés sur le nœud driver du cluster.

    Vous pouvez également exécuter le code suivant dans un notebook Scala pour afficher l'emplacement des JAR :

    Scala
    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 dans un répertoire de la racine DBFS appelé hive_metastore_jar via le client DBFS sur le nœud du Driver.

  4. Créez un script d'initialisation qui copie /dbfs/hive_metastore_jar dans le système de fichiers local du nœud, en veillant à ce que le script d'initialisation se mette en veille 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 vers /databricks/hive_metastore_jars/, définissez spark.sql.hive.metastore.jars sur /databricks/hive_metastore_jars/*. L'emplacement doit inclure le /* final.

  6. Redémarrez le cluster.

Options de configuration Hive

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

Configurer un métastore externe à l’aide de l’interface utilisateur

Pour configurer un métastore externe à l'aide de l'interface utilisateur de Databricks :

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

  2. Cliquez sur Créer un cluster .

  3. Saisissez les options de configuration Spark suivantes :

    Mode local

    ini
    # Hive specific configuration options.
    # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
    spark.hadoop.javax.jdo.option.ConnectionURL jdbc:mysql://<mysql-host>:<mysql-port>/<metastore-db>

    # Driver class name for a JDBC metastore (Runtime 3.4 and later)
    spark.hadoop.javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver

    # Driver class name for a JDBC metastore (prior to Runtime 3.4)
    # spark.hadoop.javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver

    spark.hadoop.javax.jdo.option.ConnectionUserName <mysql-username>
    spark.hadoop.javax.jdo.option.ConnectionPassword <mysql-password>

    # 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>

    Mode distant

    ini
    # Hive specific configuration option
    # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
    spark.hadoop.hive.metastore.uris thrift://<metastore-host>:<metastore-port>

    # 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 référence de configuration de compute.

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

Configurez un metastore externe à l'aide d'un script d'initialisation

Les scripts d'initialisation vous permettent de vous connecter à un Hive metastore existant sans avoir à configurer manuellement les configurations requises.

Mode local

  1. Créez le répertoire de base dans lequel vous souhaitez stocker le script d'initialisation 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 crée le script d'initialisation /databricks/scripts/external-metastore.sh dans le système de fichiers Databricks (DBFS). Ce script d'initialisation écrit les options de configuration requises dans un fichier de configuration nommé 00-custom-spark.conf au format JSON sous /databricks/driver/conf/ à l'intérieur de chaque nœud du cluster. Databricks fournit des configurations Spark par default 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 de 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 for metastores in local mode.
    | # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
    | "spark.hadoop.javax.jdo.option.ConnectionURL" = "jdbc:mysql://<mysql-host>:<mysql-port>/<metastore-db>"
    | "spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mysql-username>"
    | "spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mysql-password>"
    |
    | # 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
    |
    |case "$DATABRICKS_RUNTIME_VERSION" in
    | "")
    | DRIVER="com.mysql.jdbc.Driver"
    | ;;
    | *)
    | DRIVER="org.mariadb.jdbc.Driver"
    | ;;
    |esac
    |# Add the JDBC driver separately since must use variable expansion to choose the correct
    |# driver version.
    |cat << EOF >> /databricks/driver/conf/00-custom-spark.conf
    | "spark.hadoop.javax.jdo.option.ConnectionDriverName" = "$DRIVER"
    |}
    |EOF
    |""".stripMargin,
    overwrite = true
    )
  3. Configurez votre cluster avec le script d'initialisation.

  4. Redémarrez le cluster.

Mode distant

  1. Créez le répertoire de base dans lequel vous souhaitez stocker le script d'initialisation s'il n'existe pas. L'exemple suivant utilise dbfs:/databricks/scripts.

  2. Exécutez l'extrait de code suivant dans un notebook :

    Scala
    dbutils.fs.put(
    "/databricks/scripts/external-metastore.sh",
    """#!/bin/sh
    |
    |# 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 for metastores in remote mode.
    | # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
    | "spark.hadoop.hive.metastore.uris" = "thrift://<metastore-host>:<metastore-port>"
    |
    | # 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>"
    |
    | # If you need to use AssumeRole, uncomment the following settings.
    | # "spark.hadoop.fs.s3a.credentialsType" = "AssumeRole"
    | # "spark.hadoop.fs.s3a.stsAssumeRole.arn" = "<sts-arn>"
    |}
    |EOF
    |""".stripMargin,
    overwrite = true
    )
  3. Configurez votre cluster avec le script d'initialisation.

  4. Redémarrez le cluster.

Dépannage

Les clusters ne start pas (en raison de paramètres de script d'initialisation incorrects).

Si un script d'initialisation pour la configuration du metastore externe entraîne l'échec de la création du cluster, configurez le script d'initialisation pour consigner, et déboguez le script d'initialisation à l'aide des Logs.

Erreur dans l'instruction SQL : InvocationTargetException

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

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

    Les informations de connexion JDBC du métastore externe sont mal configurées. Vérifiez le Hostname, le port, le nom d’utilisateur, le mot de passe et le nom de la classe du Driver JDBC configurés. De plus, assurez-vous que le nom d'utilisateur dispose du privilège nécessaire pour accéder à la base de données du métastore.

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

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

    Base de données du métastore externe non correctement initialisée. Vérifiez que vous avez créé la base de données du metastore et que vous avez inséré le nom de base de données correct dans la chaîne de connexion JDBC. Ensuite, start un nouveau cluster avec les deux options de configuration Spark suivantes :

    ini
    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false

    Ainsi, la bibliothèque cliente Hive tentera de créer et d’initialiser automatiquement des tables dans la base de données du metastore lorsqu’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 pile d'exception complète :

The specified datastore driver (driver name) was not found in the CLASSPATH

Le cluster est configuré pour utiliser un driver JDBC incorrect.

Paramètre datanucleus.autoCreateSchema sur true ne fonctionne pas comme prévu

By default, 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 cliente Hive ne peut pas créer de tables de métastore 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 du metastore.

Si vous souhaitez utiliser datanucleus.autoCreateSchema pour aider à initialiser la base de données du metastore, assurez-vous de définir datanucleus.fixedDatastore sur false. De plus, vous pouvez souhaiter activer les deux indicateurs après avoir initialisé la base de données du metastore afin d'offrir une meilleure protection à votre environnement de production.