Freigeben über


Verwenden eines externen Hive-Metastores für Azure Synapse Spark-Pool

Hinweis

Externe Hive-Metastores werden in Azure Synapse Runtime für Apache Spark 3.4 und nachfolgende Versionen in Synapse nicht mehr unterstützt.

Azure Synapse Analytics ermöglicht es Apache Spark-Pools im selben Arbeitsbereich, einen verwalteten HMS-kompatiblen Metastore (Hive Metastore) als ihren Katalog freizugeben. Wenn Kunden die Metadaten des Hive-Katalogs außerhalb des Arbeitsbereichs beibehalten und Katalogobjekte für andere Compute-Engines außerhalb des Arbeitsbereichs freigeben möchten, z. B. HDInsight und Azure Databricks, können sie eine Verbindung mit einem externen Hive-Metastore herstellen. In diesem Artikel erfahren Sie, wie man Synapse Spark mit einem externen Apache Hive Metastore verbindet.

Unterstützte Hive-Metastore-Versionen

Das Feature funktioniert mit Spark 3.1. Die folgende Tabelle zeigt die unterstützten Hive-Metastore-Versionen für jede Spark-Version.

Spark-Version HMS 0.13.X HMS 1.2.X HMS 2.1.X HMS 2.3.x HMS 3.1.X
2.4 Ja Ja Ja Ja Nein
3.1 Ja Ja Ja Ja Ja

Einrichten eines verknüpften Diensts für den Hive-Metastore

Hinweis

Nur die Azure SQL-Datenbank und Azure Database for MySQL werden als externe Hive-Metastores unterstützt. Darüber hinaus wird derzeit nur die Authentifizierung mit einem Benutzerkennwort unterstützt. Wenn die bereitgestellte Datenbank leer ist, können Sie sie über das Hive-Schematool bereitstellen, um ein Datenbankschema zu erstellen.

Führen Sie die folgenden Schritte aus, um einen verknüpften Dienst zum externen Hive-Metastore im Synapse-Arbeitsbereich einzurichten.

  1. Öffnen Sie Synapse Studio, navigieren Sie links zu „Verwalten“ > „Verknüpfte Dienste“, und klicken Sie dann auf Neu, um einen neuen verknüpften Dienst zu erstellen.

    Einrichten eines verknüpften Hive Metastore-Dienstes

  2. Wählen Sie, basierend auf Ihrem Datenbanktyp, Azure SQL-Datenbank oder Azure Database for MySQL aus und klicken Sie anschließend auf Weiter.

  3. Geben Sie den Namen des verknüpften Dienstes an. Notiere Sie sich den Namen des verknüpften Dienstes. Diese Informationen werden in Kürze zum Konfigurieren von Spark verwendet.

  4. Sie können entweder die Azure SQL-Datenbank oder Azure Database for MySQL für den externen Hive-Metastore aus der Azure-Abonnementliste auswählen oder die Informationen manuell eingeben.

  5. Geben Sie den Benutzernamen und das Kennwort an, um die Verbindung einzurichten.

  6. Klicken Sie auf Verbindung testen, um den Benutzernamen und das Kennwort zu überprüfen.

  7. Klicken Sie auf Erstellen, um den verknüpften Dienst zu erstellen.

Testen Sie die Verbindung rufen Sie die Metastore-Version in Notebook ab

Einige Einstellungen für die Netzwerksicherheitsregel können den Zugriff vom Spark-Pool auf die externe Hive-Metastore-Datenbank blockieren. Führen Sie vor dem Konfigurieren des Spark-Pools den folgenden Code in einem beliebigen Notebook des Spark-Pools aus, um die Verbindung mit der externen Hive-Metastore-Datenbank zu testen.

Sie können Ihre Hive-Metastore-Version auch über die Ausgabeergebnisse abrufen. Die Hive-Metastore-Version wird in der Spark-Konfiguration verwendet.

Verbindungstestcode für Azure SQL

%%spark 
import java.sql.DriverManager 
/** this JDBC url could be copied from Azure portal > Azure SQL database > Connection strings > JDBC **/ 
val url = s"jdbc:sqlserver://{your_servername_here}.database.windows.net:1433;database={your_database_here};user={your_username_here};password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" 
try { 
    val connection = DriverManager.getConnection(url) 
    val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t") 
    result.next(); 
    println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}") 
} catch { 
    case ex: Throwable => println(s"Failed to establish connection:\n $ex") 
}  

Verbindungstestcode für Azure Database for MySQL

%%spark 
import java.sql.DriverManager 
/** this JDBC url could be copied from Azure portal > Azure Database for MySQL > Connection strings > JDBC **/ 
val url = s"jdbc:mysql://{your_servername_here}.mysql.database.azure.com:3306/{your_database_here}?useSSL=true"
try { 
    val connection = DriverManager.getConnection(url, "{your_username_here}", "{your_password_here}");
    val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t") 
    result.next(); 
    println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}") 
} catch { 
    case ex: Throwable => println(s"Failed to establish connection:\n $ex") 
}  

Konfigurieren von Spark für die Verwendung des externen Hive-Metastores

Nachdem Sie den verknüpften Dienst erfolgreich für den externen Hive-Metastore erstellt haben, müssen Sie einige Spark-Konfigurationen einrichten, um den externen Hive-Metastore zu verwenden. Sie können die Konfiguration sowohl auf Spark-Poolebene als auch auf Spark-Sitzungsebene einrichten.

Hier finden Sie die Konfigurationen und Beschreibungen:

Hinweis

Synapse ist auf eine reibungslose Funktion mit Computeressourcen aus HDI ausgelegt. HMS 3.1 in HDI 4.0 ist jedoch nicht vollständig mit OSS HMS 3.1 kompatibel. Informationen zu OSS HMS 3.1 finden Sie hier.

Spark-Konfiguration Beschreibung
spark.sql.hive.metastore.version Unterstützte Versionen:
  • 0.13
  • 1.2
  • 2.1
  • 2.3
  • 3.1
Stellen Sie sicher, dass Sie die ersten zwei Teile ohne den dritten Teil verwenden
spark.sql.hive.metastore.jars
  • Version 0.13: /opt/hive-metastore/lib-0.13/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Version 1.2: /opt/hive-metastore/lib-1.2/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Version 2.1: /opt/hive-metastore/lib-2.1/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Version 2.3: /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Version 3.1: /opt/hive-metastore/lib-3.1/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name Name Ihres verknüpften Diensts

Konfigurieren auf Spark-Poolebene

Wenn Sie den Spark-Pool erstellen, geben Sie auf der Registerkarte Zusätzliche Einstellungen die folgenden Konfigurationen in einer Textdatei an, und laden Sie diese im Abschnitt Apache Spark-Konfiguration hoch. Sie können auch das Kontextmenü für einen vorhandenen Spark-Pool verwenden. Wählen Sie „Apache Spark-Konfiguration“, um diese Konfigurationen hinzuzufügen.

Konfigurieren des Spark-Pools

Aktualisieren Sie die Version des Metastores und den Namen des verknüpften Diensts, und speichern Sie die folgenden Konfigurationen in einer Textdatei für die Spark-Poolkonfiguration:

spark.sql.hive.metastore.version <your hms version, Make sure you use the first 2 parts without the 3rd part>
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name <your linked service name>
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*

Hier sehen Sie ein Beispiel für die Metastoreversion 2.1 mit einem verknüpften Dienst namens „HiveCatalog21“:

spark.sql.hive.metastore.version 2.1
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name HiveCatalog21
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-2.1/*:/usr/hdp/current/hadoop-client/lib/*

Konfigurieren auf Spark-Sitzungsebene

Für Notebook-Sitzungen können Sie die Spark-Sitzung auch mit dem Magic-Befehl %%configure im Notebook konfigurieren. Hier ist der Code angegeben.

%%configure -f
{
    "conf":{
        "spark.sql.hive.metastore.version":"<your hms version, 2 parts>",
        "spark.hadoop.hive.synapse.externalmetastore.linkedservice.name":"<your linked service name>",
        "spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*"
    }
}

Dieselbe Konfiguration kann auch mittels SparkConf auf einen Batchauftrag angewendet werden.

Führen Sie Abfragen durch, um die Verbindung zu überprüfen

Versuchen Sie nach dem Festlegen all dieser Einstellungen, Katalogobjekte aufzulisten, indem Sie die folgende Abfrage im Spark-Notebook ausführen, um die Verbindung mit dem externen Hive-Metastore zu überprüfen.

spark.sql("show databases").show()

Einrichten einer Speicherverbindung

Der verknüpfte Dienst zur Datenbank des Hive-Metastores bietet nur Zugriff auf Hive-Katalogmetadaten. Um die vorhandenen Tabellen abzufragen, müssen Sie eine Verbindung mit dem Speicherkonto einrichten, in dem auch die zugrunde liegenden Daten für Ihre Hive-Tabellen gespeichert werden.

Einrichten einer Verbindung mit Azure Data Lake Storage Gen 2

Primäres Speicherkonto des Arbeitsbereichs

Wenn die zugrunde liegenden Daten Ihrer Hive-Tabellen im primären Speicherkonto Ihres Arbeitsbereichs gespeichert werden, sind keine zusätzlichen Einstellungen erforderlich. Dies funktioniert nur, solange Sie bei der Arbeitsbereichserstellung die Anweisungen zum Einrichten des Speichers befolgt haben.

Anderes ADLS Gen 2-Konto

Wenn die zugrunde liegenden Daten Ihrer Hive-Kataloge in einem anderen ADLS Gen 2-Konto gespeichert sind, müssen Sie sicherstellen, dass die Benutzer, die Spark-Abfragen ausführen, über die Rolle Mitwirkender an Storage-Blobdaten für das ADLS Gen2-Speicherkonto verfügen.

Einrichten der Verbindung mit Blob Storage

Wenn die zugrunde liegenden Daten Ihrer Hive-Tabellen im Azure Blob-Speicherkonto gespeichert sind, führen Sie die folgenden Schritte aus, um die Verbindung einzurichten:

  1. Öffnen Sie Synapse Studio, navigieren Sie zu „Daten“ > Registerkarte „Verknüpft“ > Schaltfläche „Hinzufügen“ >Verbindung mit externen Daten herstellen.

    Herstellen einer Verbindung mit dem Speicherkonto

  2. Wählen Sie Azure Blob Storage aus, und klicken Sie auf Weiter.

  3. Geben Sie den Namen des verknüpften Dienstes an. Notieren Sie sich den Namen des verknüpften Diensts. Diese Informationen werden in Kürze bei der Sparkkonfiguration verwendet.

  4. Wählen Sie das Azure Blob Storage-Konto aus. Stellen Sie sicher, dass Kontoschlüssel als Authentifizierungsmethode ausgewählt ist. Derzeit kann Spark Pool nur über den Kontoschlüssel auf das Blob Storage-Konto zugreifen.

  5. Klicken Sie auf Verbindung testen und dann auf Erstellen.

  6. Nachdem Sie den verknüpften Dienst für das Blob Storage-Konto erstellt haben, stellen Sie beim Ausführen von Spark-Abfragen sicher, dass Sie den folgenden Spark-Code im Notebook ausführen, um Zugriff auf das Blob Storage-Konto für die Spark-Sitzung zu erhalten. Weitere Informationen dazu, warum dies erforderlich ist, finden Sie hier.

%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)

Nach dem Einrichten von Speicherverbindungen können Sie die vorhandenen Tabellen im Hive-Metastore abfragen.

Bekannte Einschränkungen

  • Der Synapse Studio-Objekt-Explorer zeigt weiterhin Objekte im verwalteten Synapse-Metastore anstelle des externen HMS an.
  • Die Synchronisierung zwischen SQL und Spark funktioniert bei Verwendung des externen HMS nicht.
  • Nur die Azure SQL-Datenbank und Azure Database for MySQL werden als externe Hive-Metastore-Datenbanken unterstützt. Nur die SQL-Autorisierung wird unterstützt.
  • Spark funktioniert derzeit nur in externen Hive-Tabellen sowie in nicht transaktionalen bzw. nicht mit ACID verwalteten Hive-Tabellen. Transaktionale bzw. mit Hive ACID verwaltete Tabellen werden nicht unterstützt.
  • Die Apache Ranger-Integration wird nicht unterstützt.

Problembehandlung

Der folgende Fehler wird beim Abfragen einer Hive-Tabelle mit in Blob Storage gespeicherten Daten angezeigt

No credentials found for account xxxxx.blob.core.windows.net in the configuration, and its container xxxxx is not accessible using anonymous credentials. Please check if the container exists first. If it is not publicly available, you have to provide account credentials.

Wenn Sie die Schlüsselauthentifizierung für Ihr Speicherkonto über den verknüpften Dienst verwenden, müssen Sie einen zusätzlichen Schritt ausführen, um das Token für die Spark-Sitzung zu erhalten. Führen Sie den folgenden Code aus, um Ihre Spark-Sitzung zu konfigurieren, bevor Sie die Abfrage ausführen. Mehr darüber, warum dies erforderlich ist, erfahren Sie hier.

%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)

Der folgende Fehler wird angezeigt, wenn Sie eine in einem ADLS Gen2-Konto gespeicherte Tabelle abfragen

Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD

Dies kann daran liegen, dass der Benutzer, der die Spark-Abfrage ausführt, nicht über die erforderlichen Zugriffsrechte für das zugrunde liegende Speicherkonto verfügt. Stellen Sie sicher, dass der Benutzer, der die Spark-Abfragen ausführt, über die Rolle Mitwirkender an Storage-Blobdaten für das ADLS Gen2-Speicherkonto verfügt. Dieser Schritt kann nach dem Erstellen des verknüpften Diensts ausgeführt werden.

Um das Ändern des HMS-Back-End-Schemas bzw. der Version zu vermeiden, werden die folgenden Hive-Konfigurationen standardmäßig vom System festgelegt:

spark.hadoop.hive.metastore.schema.verification true 
spark.hadoop.hive.metastore.schema.verification.record.version false 
spark.hadoop.datanucleus.fixedDatastore true 
spark.hadoop.datanucleus.schema.autoCreateAll false 

Bei den HMS-Versionen 1.2.1 oder 1.2.2 gibt es ein Problem in Hive: Wenn Sie spark.hadoop.hive.metastore.schema.verification auf true festlegen, wird ausschließlich die Version 1.2.0 gefordert. Ein Vorschlag ist, entweder Ihre HMS-Version in Version 1.2.0 zu ändern oder die folgenden beiden Konfigurationen zu überschreiben, um dieses Problem zu umgehen:

spark.hadoop.hive.metastore.schema.verification false 
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false

Wenn Sie Ihre HMS-Version migrieren müssen, wird die Verwendung des Hive-Schematools empfohlen. Wenn der HMS von HDInsight-Clustern verwendet wurde, sollten Sie die bereitgestellte HDI-Version verwenden.

HMS-Schemaänderung für OSS HMS 3.1

Synapse ist auf eine reibungslose Funktion mit Computeressourcen aus HDI ausgelegt. HMS 3.1 in HDI 4.0 ist jedoch nicht vollständig mit OSS HMS 3.1 kompatibel. Wenden Sie daher Folgendes manuell auf HMS 3.1 an, wenn es nicht von HDI bereitgestellt wird.

-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);

Beim Freigeben des Metastores für Spark-Cluster in HDInsight 4.0 kann ich die Tabellen nicht sehen.

Wenn Sie den Hive-Katalog für einen Spark-Cluster in HDInsight 4.0 freigeben möchten, stellen Sie sicher, dass Ihre Eigenschaft spark.hadoop.metastore.catalog.default in Synapse Spark dem Wert in HDInsight Spark entspricht. Der Standardwert für HDI Spark ist spark und der Standardwert für Synapse Spark ist hive.

Beim Freigeben des Hive-Metastores für Hive-Cluster in HDInsight 4.0 kann ich die Tabellen erfolgreich auflisten, erhalten beim Abfragen der Tabelle aber nur ein leeres Ergebnis.

Wie im Abschnitt zu den Einschränkungen erwähnt, unterstützt der Synapse Spark-Pool nur externe Hive-Tabellen sowie nicht transaktionale bzw. nicht mit ACID verwaltete Tabellen. Transaktionale bzw. mit ACID verwaltete Hive-Tabellen werden derzeit nicht unterstützt. Bei Hive-Clustern in HDInsight 4.0 werden alle verwalteten Tabellen als transaktionale bzw. mit ACID verwaltete Tabellen erstellt. Daher erhalten Sie eine leere Ergebnisanzeige, wenn Sie diese Tabellen abfragen.

Sehen Sie sich den folgenden Fehler an, wenn ein externer Metastore verwendet wird, während der intelligente Cache aktiviert ist

java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found

Sie können dieses Problem einfach beheben, indem Sie /usr/hdp/current/hadoop-client/* an ihre spark.sql.hive.metastore.jars anfügen.

Eg: 
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*