Externe Hive-metastore gebruiken voor Synapse Spark-pool
Notitie
Externe Hive-metastores worden niet meer ondersteund in Azure Synapse Runtime voor Apache Spark 3.4 en volgende versies in Synapse.
Azure Synapse Analytics stelt Apache Spark-pools in dezelfde werkruimte in staat om een beheerde HMS-compatibele metastore (Hive Metastore) te delen als hun catalogus. Wanneer klanten de metagegevens van de Hive-catalogus buiten de werkruimte willen behouden en catalogusobjecten willen delen met andere rekenkundige engines buiten de werkruimte, zoals HDInsight en Azure Databricks, kunnen ze verbinding maken met een externe Hive-metastore. In dit artikel leert u hoe u Synapse Spark verbindt met een externe Apache Hive-metastore.
Ondersteunde Hive Metastore-versies
De functie werkt met Spark 3.1. In de volgende tabel ziet u de ondersteunde Hive Metastore-versies voor elke Spark-versie.
Spark-versie | HMS 2.3.x | HMS 3.1.X |
---|---|---|
3.3 | Ja | Ja |
Gekoppelde service instellen voor Hive Metastore
Notitie
Alleen Azure SQL Database en Azure Database for MySQL worden ondersteund als een externe Hive-metastore. Momenteel bieden we alleen ondersteuning voor verificatie van gebruikerswachtwoorden. Als de opgegeven database leeg is, richt u deze in via het Hive-schemaprogramma om een databaseschema te maken.
Volg de onderstaande stappen om een gekoppelde service in te stellen voor de externe Hive-metastore in de Synapse-werkruimte.
Open Synapse Studio, ga naar > Gekoppelde services beheren aan de linkerkant en selecteer Nieuw om een nieuwe gekoppelde service te maken.
Kies Azure SQL Database of Azure Database for MySQL op basis van uw databasetype en selecteer Doorgaan.
Geef de naam van de gekoppelde service op. Noteer de naam van de gekoppelde service. Deze informatie wordt binnenkort gebruikt om Spark te configureren.
U kunt Azure SQL Database Azure Database/for MySQL selecteren voor de externe Hive Metastore in de lijst met Azure-abonnementen of de gegevens handmatig invoeren.
Geef de gebruikersnaam en het wachtwoord op om de verbinding in te stellen.
Test de verbinding om de gebruikersnaam en het wachtwoord te verifiëren.
Selecteer Maken om de gekoppelde service te maken.
Verbinding testen en de metastore-versie ophalen in notebook
Sommige instellingen voor netwerkbeveiligingsregels kunnen de toegang van de Spark-pool naar de externe Hive Metastore DB blokkeren. Voordat u de Spark-pool configureert, voert u de onderstaande code uit in een Spark-poolnotebook om de verbinding met de externe Hive Metastore DB te testen.
U kunt uw Hive Metastore-versie ook ophalen uit de uitvoerresultaten. De Hive Metastore-versie wordt gebruikt in de Spark-configuratie.
Waarschuwing
Publiceer de testscripts niet in uw notebook met uw wachtwoord dat is vastgelegd, omdat dit een mogelijk beveiligingsrisico voor uw Hive Metastore kan veroorzaken.
Code voor het testen van verbindingen voor 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")
}
Code voor het testen van verbindingen voor 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")
}
Spark configureren voor het gebruik van de externe Hive-metastore
Nadat u de gekoppelde service hebt gemaakt voor de externe Hive Metastore, moet u enkele Spark-configuraties instellen voor het gebruik van de externe Hive Metastore. U kunt beide de configuratie instellen op Spark-poolniveau of op Spark-sessieniveau.
Dit zijn de configuraties en beschrijvingen:
Notitie
Synapse is erop gericht om probleemloos te werken met berekeningen van HDI. HMS 3.1 in HDI 4.0 is echter niet volledig compatibel met de OSS HMS 3.1. Kijk hier voor OSS HMS 3.1.
Spark-configuratie | Beschrijving |
---|---|
spark.sql.hive.metastore.version |
Ondersteunde versies:
|
spark.sql.hive.metastore.jars |
|
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name |
Naam van uw gekoppelde service |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas |
Configureren op Spark-poolniveau
Wanneer u de Spark-pool maakt, plaatst u onder het tabblad Aanvullende instellingen de onderstaande configuraties in een tekstbestand en uploadt u deze in de sectie Apache Spark-configuratie . U kunt ook het contextmenu voor een bestaande Spark-pool gebruiken en Apache Spark-configuratie kiezen om deze configuraties toe te voegen.
Werk de metastore-versie en de naam van de gekoppelde service bij en sla de onderstaande configuraties op in een tekstbestand voor de configuratie van de Spark-pool:
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/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas
Hier volgt een voorbeeld voor metastore versie 2.3 met gekoppelde service met de naam HiveCatalog21:
spark.sql.hive.metastore.version 2.3
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name HiveCatalog21
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas
Configureren op Spark-sessieniveau
Voor een notebooksessie kunt u de Spark-sessie ook configureren in notebook met behulp van %%configure
de magic-opdracht. Dit is de code.
%%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/*",
"spark.sql.hive.metastore.sharedPrefixes":"com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas"
}
}
Voor batchtaken kan dezelfde configuratie ook worden toegepast via SparkConf
.
Query's uitvoeren om de verbinding te controleren
Probeer na al deze instellingen catalogusobjecten weer te geven door de onderstaande query uit te voeren in spark-notebook om de connectiviteit met de externe Hive Metastore te controleren.
spark.sql("show databases").show()
Opslagverbinding instellen
De gekoppelde service aan de Hive Metastore-database biedt alleen toegang tot metagegevens van de Hive-catalogus. Als u een query wilt uitvoeren op de bestaande tabellen, moet u ook een verbinding instellen met het opslagaccount waarin de onderliggende gegevens voor uw Hive-tabellen worden opgeslagen.
Verbinding met Azure Data Lake Storage Gen 2 instellen
Primair opslagaccount voor werkruimte
Als de onderliggende gegevens van uw Hive-tabellen zijn opgeslagen in het primaire opslagaccount van de werkruimte, hoeft u geen extra instellingen uit te voeren. Het werkt alleen zolang u de opslaginstellingen hebt gevolgd tijdens het maken van de werkruimte.
Ander ADLS Gen 2-account
Als de onderliggende gegevens van uw Hive-catalogi zijn opgeslagen in een ander ADLS Gen 2-account, moet u ervoor zorgen dat de gebruikers die Spark-query's uitvoeren de rol Opslagblobgegevensbijdrager hebben in het ADLS Gen2-opslagaccount.
De verbinding met Blob Storage instellen
Als de onderliggende gegevens van uw Hive-tabellen zijn opgeslagen in het Azure Blob Storage-account, voert u de onderstaande stappen uit om de verbinding in te stellen:
Open Synapse Studio, ga naar het tabblad > Gekoppelde > gegevens toevoegen, knop >Verbinding maken met externe gegevens.
Kies Azure Blob Storage en selecteer Doorgaan.
Geef de naam van de gekoppelde service op. Noteer de naam van de gekoppelde service. Deze informatie wordt binnenkort gebruikt in de Spark-configuratie.
Selecteer het Azure Blob Storage-account. Zorg ervoor dat de verificatiemethode accountsleutel is. Momenteel heeft de Spark-pool alleen toegang tot het Blob Storage-account via accountsleutel.
Test de verbinding en selecteer Maken.
Nadat u de gekoppelde service hebt gemaakt met het Blob Storage-account, moet u, wanneer u Spark-query's uitvoert, de onderstaande Spark-code uitvoeren in het notebook om toegang te krijgen tot het Blob Storage-account voor de Spark-sessie. Meer informatie over waarom u dit hier moet doen.
%%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)
Nadat u opslagverbindingen hebt ingesteld, kunt u een query uitvoeren op de bestaande tabellen in de Hive Metastore.
Bekende beperkingen
- Synapse Studio-objectverkenner blijft objecten weergeven in beheerde Synapse-metastore in plaats van de externe HMS.
- SQL <-> Spark-synchronisatie werkt niet wanneer u externe HMS gebruikt.
- Alleen Azure SQL Database en Azure Database for MySQL worden ondersteund als externe Hive Metastore-database. Alleen SQL-autorisatie wordt ondersteund.
- Spark werkt momenteel alleen voor externe Hive-tabellen en niet-transactionele/niet-ACID beheerde Hive-tabellen. Het biedt geen ondersteuning voor Hive ACID-/transactionele tabellen.
- Apache Ranger-integratie wordt niet ondersteund.
Probleemoplossing
Zie de onderstaande fout bij het uitvoeren van query's op een Hive-tabel met gegevens die zijn opgeslagen in Blob Storage
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.
Wanneer u sleutelverificatie gebruikt voor uw opslagaccount via een gekoppelde service, moet u een extra stap uitvoeren om het token voor spark-sessie op te halen. Voer de onderstaande code uit om uw Spark-sessie te configureren voordat u de query uitvoert. Meer informatie over waarom u dit hier moet doen.
%%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)
Zie de onderstaande fout bij het opvragen van een tabel die is opgeslagen in een ADLS Gen2-account
Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD
Dit kan gebeuren omdat de gebruiker die spark-query uitvoert, niet voldoende toegang heeft tot het onderliggende opslagaccount. Zorg ervoor dat de gebruiker die Spark-query's uitvoert, de rol Opslagblobgegevensbijdrager heeft voor het ADLS Gen2-opslagaccount. Deze stap kan worden uitgevoerd nadat u de gekoppelde service hebt gemaakt.
HMS-schema-gerelateerde instellingen
Om te voorkomen dat u het HMS-back-endschema/-versie wijzigt, worden de volgende hive-configuraties standaard ingesteld door het systeem:
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
Als uw HMS-versie is 1.2.1
of, is er een probleem in Hive dat alleen 1.2.0
vereist is als u naar spark.hadoop.hive.metastore.schema.verification
true
.1.2.2
Onze suggestie is dat u uw HMS-versie kunt wijzigen in 1.2.0
, of u kunt de onderstaande twee configuraties overschrijven om te omzeilen:
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
Als u uw HMS-versie wilt migreren, raden we u aan het hive-schemahulpprogramma te gebruiken. En als de HMS door HDInsight-clusters is gebruikt, raden we u aan hdi-versie te gebruiken.
HMS-schemawijziging voor OSS HMS 3.1
Synapse is erop gericht om probleemloos te werken met berekeningen van HDI. HMS 3.1 in HDI 4.0 is echter niet volledig compatibel met de OSS HMS 3.1. Pas het volgende handmatig toe op uw HMS 3.1 als deze niet is ingericht door HDI.
-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
Wanneer ik de metastore met HDInsight 4.0 Spark-cluster deel, zie ik de tabellen niet
Als u de Hive-catalogus wilt delen met een spark-cluster in HDInsight 4.0, moet u ervoor zorgen dat uw eigenschap spark.hadoop.metastore.catalog.default
in Synapse Spark overeenkomt met de waarde in HDInsight Spark. De standaardwaarde voor HDI spark is spark
en de standaardwaarde voor Synapse spark is hive
.
Wanneer ik de Hive Metastore met HDInsight 4.0 Hive-cluster deel, kan ik de tabellen vermelden, maar alleen leeg resultaat krijgen wanneer ik een query op de tabel uitvoert
Zoals vermeld in de beperkingen ondersteunt synapse Spark-pool alleen externe hive-tabellen en niet-transactionele/ACID-beheerde tabellen, maar biedt deze momenteel geen ondersteuning voor Hive ACID/transactionele tabellen. In HDInsight 4.0 Hive-clusters worden alle beheerde tabellen standaard gemaakt als ACID-/transactionele tabellen. Daarom krijgt u lege resultaten bij het uitvoeren van query's op deze tabellen.
Zie de onderstaande fout wanneer een externe metastore wordt gebruikt terwijl Intelligente cache is ingeschakeld
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
U kunt dit probleem eenvoudig oplossen door deze /usr/hdp/current/hadoop-client/*
toe te voegen aan uw spark.sql.hive.metastore.jars
.
Eg:
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*