Externer Apache Hive-Metastore (Legacy)

In diesem Artikel wird beschrieben, wie Sie Azure Databricks Cluster einrichten können, um eine Verbindung mit vorhandenen externen Apache Hive-Metastores herzustellen. Der Artikel enthält Informationen zu empfohlenen Anforderungen für die Einrichtung des Metastores und Clusterkonfigurationen, gefolgt von Anleitungen zum Konfigurieren von Clustern, um eine Verbindung mit einem externen Metastore herzustellen. Informationen zu Hive-Bibliotheksversionen, die in Databricks Runtime enthalten sind, finden Sie in den entsprechenden Versionshinweisen zur Databricks Runtime-Version.

Wichtig

  • Obwohl SQL Server als zugrunde liegende Metastoredatenbank für Hive 2.0 und höher verwendet werden kann, wird in den Beispielen in diesem Artikel Azure SQL-Datenbank verwendet.
  • Informationen zur Kompatibilität des Hive-Metastores mit HDInsight finden Sie unter Verwenden externer Metadatenspeicher in Azure HDInsight.
  • Wenn Sie Azure Database for MySQL als externen Metastore verwenden, müssen Sie den Wert der Eigenschaft lower_case_table_names in der serverseitigen Datenbankkonfiguration von „1“ (Standardwert) in „2“ ändern. Weitere Informationen finden Sie unter Identifier Case Sensitivity (Unterscheidung nach Groß-/Kleinschreibung bei Bezeichnern).

Hinweis

Die Verwendung externer Metastores ist ein Legacy-Datengovernancemodell. Databricks empfiehlt, ein Upgrade auf Unity Catalog durchzuführen. Unity Catalog vereinfacht die Sicherheit und Governance Ihrer Daten durch die Bereitstellung eines zentralen Ortes zum Verwalten und Überwachen des Datenzugriffs über mehrere Arbeitsbereiche in Ihrem Konto. Siehe Was ist Unity Catalog?.

Einrichtung des Hive-Metastores

Der in einem Cluster ausgeführte Metastore-Client stellt über JDBC eine direkte Verbindung mit Ihrer zugrunde liegenden Metastore-Datenbank her.

Zum Testen der Netzwerkkonnektivität zwischen einem Cluster und dem Metastore können Sie den folgenden Befehl in einem Notebook ausführen:

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

where

  • <DNS name> ist der Servername von Azure SQL-Datenbank.
  • <port> ist der Port der Datenbank.

Clusterkonfigurationen

Sie müssen zwei Sätze von Konfigurationsoptionen festlegen, um einen Cluster mit einem externen Metastore zu verbinden:

  • Spark-Optionen konfigurieren Spark mit der Hive-Metastore-Version und den JAR-Dateien für den Metastore-Client.
  • Hive-Optionen konfigurieren den Metastore-Client zum Herstellen der Verbindung mit dem externen Metastore.

Spark-Konfigurationsoptionen

Legen Sie spark.sql.hive.metastore.version auf die Version Ihres Hive-Metastores und spark.sql.hive.metastore.jars wie folgt fest:

  • Hive 0.13: Legen Sie nicht spark.sql.hive.metastore.jars fest.

    Hinweis

    Hive 1.2.0 und 1.2.1 sind nicht der integrierte Metastore in Databricks Runtime 7.0 und höher. Wenn Sie Hive 1.2.0 oder 1.2.1 bei Databricks Runtime 7.0 und höher verwenden möchten, führen Sie das unter Herunterladen der Metastore-JAR-Dateien und darauf verweisen beschriebene Verfahren aus.

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) oder Hive 2.3.9 (Databricks Runtime 10.0 und höher): eingestellt auf.spark.sql.hive.metastore.jars bis builtin.

  • Für alle anderen Hive-Versionen wird von Azure Databricks empfohlen, die Metastore-JAR-Dateien herunterzuladen und die Konfiguration spark.sql.hive.metastore.jars so festzulegen, dass sie auf die heruntergeladenen JAR-Dateien verweist. Eine entsprechende Anleitung finden Sie unter Herunterladen der Metastore-JAR-Dateien und darauf verweisen.

Herunterladen der Metastore-JAR-Dateien und darauf verweisen

  1. Erstellen Sie einen Cluster, bei dem spark.sql.hive.metastore.jars auf maven und spark.sql.hive.metastore.version festgelegt wird, damit er der Version Ihres Metastores entspricht.

  2. Wenn der Cluster ausgeführt wird, durchsuchen Sie das Treiberprotokoll nach einer Zeile wie der folgenden:

    17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
    

    Das Verzeichnis <path> ist der Speicherort der heruntergeladenen JAR-Dateien im Treiberknoten des Clusters.

    Alternativ können Sie den folgenden Code in einem Scala-Notebook ausführen, um den Speicherort der JAR-Dateien auszudrucken:

    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. Führen Sie %sh cp -r <path> /dbfs/hive_metastore_jar aus (ersetzen Sie darin <path> durch die Informationen Ihres Clusters), um dieses Verzeichnis in das Verzeichnis hive_metastore_jar im DBFS-Stamm zu kopieren, das über den DBFS-Client im Treiberknoten aufgerufen wird.

  4. Erstellen Sie ein Init-Skript, das /dbfs/hive_metastore_jar in das lokale Dateisystem des Knotens kopiert, und sorgen Sie dafür, dass das Init-Skript einige Sekunden im Ruhezustand ist, bevor es auf den DBFS-Client zugreift. Dadurch wird sichergestellt, dass der Client einsatzbereit ist.

  5. Legen Sie spark.sql.hive.metastore.jars für die Verwendung dieses Verzeichnisses fest. Wenn /dbfs/hive_metastore_jar durch Ihr Initialisierungsskript in /databricks/hive_metastore_jars/ kopiert wird, legen Sie spark.sql.hive.metastore.jars auf /databricks/hive_metastore_jars/* fest. Der Speicherort muss die nachgestellten Zeichen /* enthalten.

  6. Starten Sie den Cluster neu.

Hive-Konfigurationsoptionen

In diesem Abschnitt werden hivespezifische Optionen beschrieben.

Wenn Sie eine Verbindung mit einem externen Metastore im lokalen Modus herstellen möchten, legen Sie die folgenden Hive-Konfigurationsoptionen fest:

# 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> ist die JDBC-Verbindungszeichenfolge (die Sie im Azure-Portal abrufen können). Sie müssen „username“ und „password“ nicht in die Verbindungszeichenfolge einbeziehen, weil diese Werte durch javax.jdo.option.ConnectionUserName und javax.jdo.option.ConnectionDriverName festgelegt werden.
  • <mssql-username> und <mssql-password> geben den Benutzernamen und das Kennwort Ihres Azure SQL-Datenbank-Kontos an, das Lese-/Schreibzugriff auf die Datenbank hat.

Hinweis

Für Produktionsumgebungen empfehlen wir, hive.metastore.schema.verification auf true festzulegen. Dadurch wird verhindert, dass der Hive-Metastore-Client das Metastore-Datenbankschema implizit ändert, wenn die Metastore-Clientversion mit der Metastore-Datenbankversion nicht übereinstimmt. Wenn Sie diese Einstellung für Metastore-Clientversionen aktivieren, die niedriger als Hive 1.2.0 sind, stellen Sie sicher, dass der Metastore-Client Schreibberechtigung für die Metastore-Datenbank hat (um das in HIVE-9749 beschriebene Problem zu verhindern).

  • Legen Sie für Hive-Metastore 1.2.0 und höher hive.metastore.schema.verification.record.version auf true fest, um hive.metastore.schema.verification zu aktivieren.
  • Legen Sie für Hive-Metastore 2.1.1 und höher hive.metastore.schema.verification.record.version auf true fest, da dieser Wert standardmäßig auf false festgelegt ist.

Einrichten eines externen Metastores über die Benutzeroberfläche

So richten Sie einen externen Metastore über die Benutzeroberfläche von Azure Databricks ein:

  1. Klicken Sie auf der Seitenleiste auf die Schaltfläche Cluster.

  2. Klicken Sie auf Cluster erstellen.

  3. Geben Sie die folgenden Spark-Konfigurationsoptionen ein:

    # 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. Fahren Sie mit der Clusterkonfiguration fort und folgen Sie den Anweisungen in der Computekonfigurationsreferenz.

  5. Wählen Sie Create Cluster (Cluster erstellen), um den Cluster zu erstellen.

Einrichten eines externen Metastores mithilfe eines Init-Skripts

Mithilfe von Init-Skripts können Sie eine Verbindung mit einem Hive-Metastore herstellen, ohne die erforderlichen Konfigurationen manuell festlegen zu müssen.

  1. Erstellen Sie das Basisverzeichnis, in dem Sie das Init-Skript speichern möchten, falls das Verzeichnis noch nicht vorhanden ist. Im folgenden Beispiel wird dbfs:/databricks/scripts verwendet.
  2. Führen Sie den folgenden Codeausschnitt in einem Notebook aus. Der Codeausschnitt erstellt das Init-Skript /databricks/scripts/external-metastore.sh in Databricks File System (DBFS). Alternativ können Sie zum Erstellen des Init-Skripts den „Put“-Vorgang der DBFS-REST-API verwenden. Dieses Init-Skript schreibt erforderliche Konfigurationsoptionen immer dann in die Konfigurationsdatei 00-custom-spark.conf in einem JSON-ähnlichen Format unter /databricks/driver/conf/ in jedem Knoten des Clusters, wenn ein Cluster mit dem als <cluster-name> angegebenen Namen gestartet wird. Azure Databricks stellt Spark-Standardkonfigurationen in der Datei /databricks/driver/conf/spark-branch.conf bereit. Konfigurationsdateien im Verzeichnis /databricks/driver/conf werden in umgekehrter alphabetischer Reihenfolge angewendet. Wenn Sie den Namen der Datei 00-custom-spark.conf ändern möchten, stellen Sie sicher, dass sie weiterhin vor der Datei spark-branch.conf angewendet wird.

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. Konfigurieren Sie Ihren Cluster mit dem Init-Skript.
  2. Starten Sie den Cluster neu.

Problembehandlung

Cluster werden nicht gestartet (aufgrund von falschen Init-Skript-Einstellungen)

Wenn ein Init-Skript zum Einrichten des externen Metastores einen Fehler bei der Clustererstellung verursacht, konfigurieren Sie das Skript für die Protokollierung, und debuggen Sie es mithilfe der Protokolle.

Fehler in SQL-Anweisung: „InvocationTargetException“

  • Fehlermeldungsmuster in der vollständigen Ausnahmestapelüberwachung:

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

    Die JDBC-Verbindungsinformationen für den externen Metastore wurden falsch konfiguriert. Überprüfen Sie den konfigurierten Hostnamen, Port, Benutzernamen, das Kennwort und den Klassennamen des JDBC-Treibers. Stellen Sie außerdem sicher, dass der Benutzername die richtige Berechtigung für den Zugriff auf die Metastore-Datenbank hat.

  • Fehlermeldungsmuster in der vollständigen Ausnahmestapelüberwachung:

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

    Die externe Metastore-Datenbank wurde nicht ordnungsgemäß initialisiert. Vergewissern Sie sich, dass Sie die Metastore-Datenbank erstellt und in der JDBC-Verbindungszeichenfolge den richtigen Datenbanknamen eingefügt haben. Starten Sie dann einen neuen Cluster mit den beiden folgenden Spark-Konfigurationsoptionen:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Auf diese Weise versucht die Hive-Clientbibliothek, Tabellen in der Metastore-Datenbank automatisch zu erstellen und zu initialisieren, wenn sie darauf zuzugreifen versucht, die Tabellen aber nicht vorhanden sind.

Fehler in SQL Anweisung: „AnalysisException: org.apache.hadoop.hive.metastore.HiveMetastoreClient“ kann nicht instanziiert werden

Fehlermeldung in der vollständigen Ausnahmestapelüberwachung:

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

Der Cluster wurde für die Verwendung eines falschen JDBC-Treibers konfiguriert.

Das Festlegen von „datanucleus.autoCreateSchema“ auf „true“ funktioniert nicht wie erwartet

Standardmäßig legt Databricks auch datanucleus.fixedDatastore auf true fest, wodurch versehentliche strukturelle Änderungen an den Metastore-Datenbanken verhindert werden. Deshalb kann die Hive-Clientbibliothek Metastore-Tabellen auch dann nicht erstellen, wenn Sie datanucleus.autoCreateSchema auf true festlegen. Diese Strategie ist normalerweise für Produktionsumgebungen sicherer, da sie verhindert, dass die Metastore-Datenbank versehentlich aktualisiert wird.

Wenn Sie datanucleus.autoCreateSchema zum Initialisieren der Metastore-Datenbank verwenden möchten, müssen Sie datanucleus.fixedDatastore auf false festlegen. Außerdem können Sie auf Wunsch beide Flags nach dem Initialisieren der Metastore-Datenbank spiegeln, um einen besseren Schutz für Ihre Produktionsumgebung zu bieten.