Dela via


Använda externt Hive-metaarkiv för Synapse Spark-pool

Kommentar

Externa Hive-metaarkiv stöds inte längre i Azure Synapse Runtime för Apache Spark 3.4 och efterföljande versioner i Synapse.

Azure Synapse Analytics gör att Apache Spark-pooler på samma arbetsyta kan dela ett hanterat HMS-kompatibelt metaarkiv (Hive Metastore) som katalog. När kunder vill bevara Hive-katalogmetadata utanför arbetsytan och dela katalogobjekt med andra beräkningsmotorer utanför arbetsytan, till exempel HDInsight och Azure Databricks, kan de ansluta till ett externt Hive-metaarkiv. I den här artikeln kan du lära dig hur du ansluter Synapse Spark till ett externt Apache Hive-metaarkiv.

Hive Metastore-versioner som stöds

Funktionen fungerar med Spark 3.1. I följande tabell visas de Hive Metastore-versioner som stöds för varje 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 Nej
3.1 Ja Ja Ja Ja Ja

Konfigurera länkad tjänst till Hive-metaarkiv

Kommentar

Endast Azure SQL Database och Azure Database for MySQL stöds som ett externt Hive-metaarkiv. Och för närvarande stöder vi endast autentisering med användarlösenord. Om den angivna databasen är tom etablerar du den via Hive-schemaverktyget för att skapa databasschema.

Följ stegen nedan för att konfigurera en länkad tjänst till det externa Hive-metaarkivet i Synapse-arbetsytan.

  1. Öppna Synapse Studio, gå till Hantera > länkade tjänster till vänster, klicka på Ny för att skapa en ny länkad tjänst.

    Konfigurera länkad Hive Metastore-tjänst

  2. Välj Azure SQL Database eller Azure Database for MySQL baserat på din databastyp och klicka på Fortsätt.

  3. Ange namnet på den länkade tjänsten. Registrera namnet på den länkade tjänsten. Den här informationen kommer att användas för att konfigurera Spark inom kort.

  4. Du kan antingen välja Azure SQL Database Azure Database/for MySQL för det externa Hive-metaarkivet från Azure-prenumerationslistan eller ange informationen manuellt.

  5. Ange användarnamn och lösenord för att konfigurera anslutningen.

  6. Testa anslutningen för att verifiera användarnamnet och lösenordet.

  7. Klicka på Skapa för att skapa den länkade tjänsten.

Testa anslutningen och hämta metaarkivversionen i notebook-filen

Vissa inställningar för nätverkssäkerhetsregler kan blockera åtkomst från Spark-poolen till den externa Hive-metaarkivdatabasen. Innan du konfigurerar Spark-poolen kör du koden nedan i en Spark-poolanteckningsbok för att testa anslutningen till den externa Hive-metaarkivdatabasen.

Du kan också hämta din Hive Metastore-version från utdataresultaten. Hive Metastore-versionen används i Spark-konfigurationen.

Anslut ionstestningskod 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") 
}  

Anslut ionstestningskod 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") 
}  

Konfigurera Spark för att använda det externa Hive-metaarkivet

När du har skapat den länkade tjänsten till det externa Hive-metaarkivet måste du konfigurera några Spark-konfigurationer för att använda det externa Hive-metaarkivet. Du kan både konfigurera konfigurationen på Spark-poolnivå eller på Spark-sessionsnivå.

Här är konfigurationerna och beskrivningarna:

Kommentar

Synapse strävar efter att fungera smidigt med beräkningar från HDI. HMS 3.1 i HDI 4.0 är dock inte helt kompatibelt med OSS HMS 3.1. För OSS HMS 3.1, kontrollera här.

Spark-konfiguration beskrivning
spark.sql.hive.metastore.version Versioner som stöds:
  • 0.13
  • 1.2
  • 2.1
  • 2.3
  • 3.1
Se till att du använder de första 2 delarna utan den tredje delen
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 Namnet på den länkade tjänsten

Konfigurera på Spark-poolnivå

När du skapar Spark-poolen under fliken Ytterligare Inställningar lägger du till konfigurationerna nedan i en textfil och laddar upp den i konfigurationsavsnittet för Apache Spark. Du kan också använda snabbmenyn för en befintlig Spark-pool och välja Apache Spark-konfiguration för att lägga till dessa konfigurationer.

Konfigurera Spark-poolen

Uppdatera metaarkivversionen och det länkade tjänstnamnet och spara nedanstående konfigurationer i en textfil för Konfiguration av 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/*

Här är ett exempel på metaarkiv version 2.1 med länkad tjänst med namnet 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/*

Konfigurera på Spark-sessionsnivå

För notebook-session kan du även konfigurera Spark-sessionen i notebook-filen med hjälp av %%configure ett magiskt kommando. Här är koden.

%%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/*"
    }
}

För batchjobb kan samma konfiguration också tillämpas via SparkConf.

Köra frågor för att verifiera anslutningen

När du har alla dessa inställningar kan du försöka lista katalogobjekt genom att köra frågan nedan i Spark Notebook för att kontrollera anslutningen till det externa Hive-metaarkivet.

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

Konfigurera lagringsanslutning

Den länkade tjänsten till Hive Metastore-databasen ger bara åtkomst till Hive-katalogmetadata. Om du vill köra frågor mot de befintliga tabellerna måste du även konfigurera anslutningen till lagringskontot som lagrar underliggande data för dina Hive-tabeller.

Konfigurera anslutning till Azure Data Lake Storage Gen 2

Primärt lagringskonto för arbetsyta

Om underliggande data för dina Hive-tabeller lagras i arbetsytans primära lagringskonto behöver du inte göra några extra inställningar. Det fungerar bara så länge du har följt instruktionerna för lagringsinställningen när arbetsytan skapas.

Annat ADLS Gen 2-konto

Om underliggande data i dina Hive-kataloger lagras i ett annat ADLS Gen 2-konto måste du se till att de användare som kör Spark-frågor har rollen Storage Blob Data Contributor på ADLS Gen2-lagringskontot.

Upprätta anslutningen till Blob Storage

Om underliggande data för dina Hive-tabeller lagras i Azure Blob Storage-kontot konfigurerar du anslutningen genom att följa stegen nedan:

  1. Öppna Synapse Studio, gå till fliken Data länkad Knappen >Lägg till Anslut till externa data.>>

    Anslut till lagringskontot

  2. Välj Azure Blob Storage och klicka på Fortsätt.

  3. Ange namnet på den länkade tjänsten. Registrera namnet på den länkade tjänsten. Den här informationen används inom kort i Spark-konfigurationen.

  4. Välj Azure Blob Storage-kontot. Kontrollera att autentiseringsmetoden är kontonyckel. För närvarande kan Spark-poolen bara komma åt Blob Storage-kontot via kontonyckeln.

  5. Testa anslutningen och klicka på Skapa.

  6. När du har skapat den länkade tjänsten till Blob Storage-kontot ska du när du kör Spark-frågor köra spark-koden under Spark-koden i notebook-filen för att få åtkomst till Blob Storage-kontot för Spark-sessionen. Läs mer om varför du behöver göra detta här.

%%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)

När du har konfigurerat lagringsanslutningar kan du fråga de befintliga tabellerna i Hive-metaarkivet.

Kända begränsningar

  • Synapse Studio-objektutforskaren fortsätter att visa objekt i det hanterade Synapse-metaarkivet i stället för den externa HMS-filen.
  • SQL <–> Spark-synkronisering fungerar inte när du använder extern HMS.
  • Endast Azure SQL Database och Azure Database for MySQL stöds som extern Hive-metaarkivdatabas. Endast SQL-auktorisering stöds.
  • För närvarande fungerar Spark bara på externa Hive-tabeller och icke-transaktionella/icke-ACID-hanterade Hive-tabeller. Den har inte stöd för Hive ACID/transaktionstabeller.
  • Apache Ranger-integrering stöds inte.

Felsökning

Se felet nedan när du frågar en Hive-tabell med data som lagras i 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.

När du använder nyckelautentisering till ditt lagringskonto via länkad tjänst måste du ta ett extra steg för att hämta token för Spark-sessionen. Kör koden nedan för att konfigurera Spark-sessionen innan du kör frågan. Läs mer om varför du behöver göra detta här.

%%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)

Se felet nedan när du frågar en tabell som lagras i ADLS Gen2-kontot

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

Det här kan inträffa om användaren som kör Spark-frågan inte har tillräcklig åtkomst till det underliggande lagringskontot. Kontrollera att användaren som kör Spark-frågor har rollen Storage Blob Data Contributor på ADLS Gen2-lagringskontot. Det här steget kan göras när du har skapat den länkade tjänsten.

För att undvika att ändra HMS-serverdelsschema/version anges följande hive-konfigurationer som system som standard:

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 

Om din HMS-version är 1.2.1 eller 1.2.2finns det ett problem i Hive som kräver endast 1.2.0 om du vänder spark.hadoop.hive.metastore.schema.verification dig till true. Vårt förslag är antingen att du kan ändra din HMS-version till 1.2.0eller skriva över under två konfigurationer för att kringgå:

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

Om du behöver migrera din HMS-version rekommenderar vi att du använder hive-schemaverktyget. Och om HMS har använts av HDInsight-kluster föreslår vi att du använder hdi-tillhandahållen version.

HMS-schemaändring för OSS HMS 3.1

Synapse strävar efter att fungera smidigt med beräkningar från HDI. HMS 3.1 i HDI 4.0 är dock inte helt kompatibelt med OSS HMS 3.1. Så tillämpa följande manuellt på din HMS 3.1 om den inte etableras av 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);

När jag delar metaarkivet med HDInsight 4.0 Spark-klustret kan jag inte se tabellerna

Om du vill dela Hive-katalogen med ett Spark-kluster i HDInsight 4.0 kontrollerar du att egenskapen spark.hadoop.metastore.catalog.default i Synapse spark överensstämmer med värdet i HDInsight Spark. Standardvärdet för HDI Spark är spark och standardvärdet för Synapse Spark är hive.

När jag delar Hive-metaarkivet med HDInsight 4.0 Hive-klustret kan jag visa en lista över tabellerna, men bara få ett tomt resultat när jag frågar tabellen

Som nämnts i begränsningarna stöder Synapse Spark-poolen endast externa hive-tabeller och icke-transaktionella/ACID-hanterade tabeller, den stöder för närvarande inte Hive ACID/transaktionstabeller. I HDInsight 4.0 Hive-kluster skapas alla hanterade tabeller som ACID-/transaktionstabeller som standard. Därför får du tomma resultat när du frågar efter tabellerna.

Se felet nedan när ett externt metaarkiv används medan Intelligent cache är aktiverat

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

Du kan enkelt åtgärda det här problemet genom att lägga /usr/hdp/current/hadoop-client/* till i .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/*