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
bisbuiltin
.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
Erstellen Sie einen Cluster, bei dem
spark.sql.hive.metastore.jars
aufmaven
undspark.sql.hive.metastore.version
festgelegt wird, damit er der Version Ihres Metastores entspricht.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")
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 Verzeichnishive_metastore_jar
im DBFS-Stamm zu kopieren, das über den DBFS-Client im Treiberknoten aufgerufen wird.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.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 Siespark.sql.hive.metastore.jars
auf/databricks/hive_metastore_jars/*
fest. Der Speicherort muss die nachgestellten Zeichen/*
enthalten.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 durchjavax.jdo.option.ConnectionUserName
undjavax.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
auftrue
fest, umhive.metastore.schema.verification
zu aktivieren. - Legen Sie für Hive-Metastore 2.1.1 und höher
hive.metastore.schema.verification.record.version
auftrue
fest, da dieser Wert standardmäßig auffalse
festgelegt ist.
Einrichten eines externen Metastores über die Benutzeroberfläche
So richten Sie einen externen Metastore über die Benutzeroberfläche von Azure Databricks ein:
Klicken Sie auf der Seitenleiste auf die Schaltfläche Cluster.
Klicken Sie auf Cluster erstellen.
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>
Fahren Sie mit der Clusterkonfiguration fort und folgen Sie den Anweisungen in der Computekonfigurationsreferenz.
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.
- 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. - 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 Konfigurationsdatei00-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 Datei00-custom-spark.conf
ändern möchten, stellen Sie sicher, dass sie weiterhin vor der Dateispark-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
)
- Konfigurieren Sie Ihren Cluster mit dem Init-Skript.
- 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.