Udostępnij za pośrednictwem


Używanie zewnętrznego magazynu metadanych Hive dla puli platformy Spark usługi Synapse

Uwaga

Zewnętrzne magazyny metadanych Hive nie będą już obsługiwane w środowisku Azure Synapse Runtime dla platformy Apache Spark 3.4 i kolejnych wersjach w usłudze Synapse.

Usługa Azure Synapse Analytics umożliwia pulom platformy Apache Spark w tym samym obszarze roboczym współużytkowanie zarządzanego magazynu HMS (magazynu metadanych Hive, Hive Metastore) jako swojego katalogu. Gdy klienci chcą utrwalić metadane katalogu Hive poza obszarem roboczym i udostępnić obiekty wykazu innym aparatom obliczeniowym poza obszarem roboczym, takim jak usługi HDInsight i Azure Databricks, mogą łączyć się z zewnętrznym magazynem metadanych Hive. Z tego artykułu dowiesz się, jak połączyć usługę Synapse Spark z zewnętrznym magazynem metadanych Apache Hive.

Obsługiwane wersje magazynu metadanych Hive

Funkcja działa z platformą Spark 3.1. W poniższej tabeli przedstawiono obsługiwane wersje magazynu metadanych Hive dla każdej wersji platformy Spark.

Wersja platformy Spark HMS 2.3.x HMS 3.1.X
3.3 Tak Tak

Konfigurowanie połączonej usługi z magazynem metadanych Hive

Uwaga

Jako zewnętrzny magazyn metadanych Hive są obsługiwane tylko usługi Azure SQL Database i Azure Database for MySQL. Obecnie obsługujemy tylko uwierzytelnianie przy użyciu hasła użytkownika. Jeśli podana baza danych jest pusta, aprowizuj ją za pomocą narzędzia schematu Hive, aby utworzyć schemat bazy danych.

Wykonaj poniższe kroki, aby skonfigurować połączoną usługę z zewnętrznym magazynem metadanych Hive w obszarze roboczym usługi Synapse.

  1. Otwórz program Synapse Studio, przejdź do pozycji Zarządzaj połączonymi usługami > po lewej stronie, wybierz pozycję Nowy, aby utworzyć nową połączoną usługę.

    Konfigurowanie połączonej usługi Magazynu metadanych Hive

  2. Wybierz pozycję Azure SQL Database lub Azure Database for MySQL na podstawie typu bazy danych, a następnie wybierz pozycję Kontynuuj.

  3. Podaj nazwę połączonej usługi. Zarejestruj nazwę połączonej usługi. Te informacje zostaną wkrótce użyte do skonfigurowania platformy Spark.

  4. Możesz wybrać pozycję Azure SQL Database Azure Database/for MySQL dla zewnętrznego magazynu metadanych Hive z listy subskrypcji platformy Azure lub wprowadzić informacje ręcznie.

  5. Podaj nazwę użytkownika i hasło , aby skonfigurować połączenie.

  6. Przetestuj połączenie , aby zweryfikować nazwę użytkownika i hasło.

  7. Wybierz pozycję Utwórz , aby utworzyć połączoną usługę.

Testowanie połączenia i uzyskiwanie wersji magazynu metadanych w notesie

Niektóre ustawienia reguły zabezpieczeń sieci mogą blokować dostęp z puli Spark do zewnętrznej bazy danych magazynu metadanych Hive. Przed skonfigurowaniem puli Spark uruchom poniższy kod w dowolnym notesie puli platformy Spark, aby przetestować połączenie z zewnętrzną bazą danych magazynu metadanych Hive.

Możesz również pobrać wersję magazynu metadanych Hive z wyników wyjściowych. Wersja magazynu metadanych Hive będzie używana w konfiguracji platformy Spark.

Ostrzeżenie

Nie publikuj skryptów testowych w notesie z zakodowanym hasłem, ponieważ może to spowodować potencjalne zagrożenie bezpieczeństwa dla magazynu metadanych Hive.

Kod testowania połączeń dla usługi 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") 
}  

Kod testowania połączeń dla usługi 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") 
}  

Konfigurowanie platformy Spark do korzystania z zewnętrznego magazynu metadanych Hive

Po pomyślnym utworzeniu połączonej usługi z zewnętrznym magazynem metadanych Hive należy skonfigurować kilka konfiguracji platformy Spark do korzystania z zewnętrznego magazynu metadanych Hive. Konfigurację można skonfigurować na poziomie puli platformy Spark lub na poziomie sesji platformy Spark.

Poniżej przedstawiono konfiguracje i opisy:

Uwaga

Usługa Synapse ma na celu bezproblemową pracę z obliczeniami z usługi HDI. Jednak HMS 3.1 w hdi 4.0 nie jest w pełni zgodny z OSS HMS 3.1. W przypadku systemu operacyjnego HMS 3.1 sprawdź tutaj.

Konfiguracja platformy Spark opis
spark.sql.hive.metastore.version Obsługiwane wersje:
  • 2.3
  • 3.1
Upewnij się, że używasz dwóch pierwszych części bez trzeciej części
spark.sql.hive.metastore.jars
  • Wersja 2.3: /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Wersja 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 Nazwa połączonej usługi
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas

Konfigurowanie na poziomie puli platformy Spark

Podczas tworzenia puli Spark na karcie Dodatkowe ustawienia umieść poniższe konfiguracje w pliku tekstowym i przekaż ją w sekcji konfiguracja platformy Apache Spark. Możesz również użyć menu kontekstowego dla istniejącej puli Platformy Spark, wybrać pozycję Konfiguracja platformy Apache Spark, aby dodać te konfiguracje.

Konfigurowanie puli platformy Spark

Zaktualizuj wersję magazynu metadanych i nazwę połączonej usługi, a następnie zapisz poniższe konfiguracje w pliku tekstowym konfiguracji puli platformy Spark:

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

Oto przykład magazynu metadanych w wersji 2.3 z połączoną usługą o nazwie 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

Konfigurowanie na poziomie sesji platformy Spark

W przypadku sesji notesu można również skonfigurować sesję platformy Spark w notesie przy użyciu %%configure polecenia magic. Oto kod.

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

W przypadku zadania wsadowego tę samą konfigurację można również zastosować za pomocą polecenia SparkConf.

Uruchamianie zapytań w celu zweryfikowania połączenia

Po wykonaniu tych wszystkich ustawień spróbuj wymienić obiekty wykazu, uruchamiając poniższe zapytanie w notesie platformy Spark, aby sprawdzić łączność z zewnętrznym magazynem metadanych Hive.

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

Konfigurowanie połączenia magazynu

Połączona usługa z bazą danych magazynu metadanych Hive zapewnia tylko dostęp do metadanych katalogu hive. Aby wykonać zapytanie dotyczące istniejących tabel, należy skonfigurować połączenie z kontem magazynu, które przechowuje również dane bazowe dla tabel programu Hive.

Konfigurowanie połączenia z usługą Azure Data Lake Storage Gen 2

Podstawowe konto magazynu obszaru roboczego

Jeśli podstawowe dane tabel programu Hive są przechowywane na podstawowym koncie magazynu obszaru roboczego, nie musisz wykonywać dodatkowych ustawień. Będzie ona działać tak długo, jak długo wykonano instrukcje konfigurowania magazynu podczas tworzenia obszaru roboczego.

Inne konto usługi ADLS Gen 2

Jeśli podstawowe dane katalogów Hive są przechowywane na innym koncie usługi ADLS Gen 2, należy upewnić się, że użytkownicy, którzy uruchamiają zapytania platformy Spark, mają rolę Współautor danych obiektu blob usługi Storage na koncie magazynu usługi ADLS Gen2.

Skonfiguruj połączenie z usługą Blob Storage

Jeśli podstawowe dane tabel programu Hive są przechowywane na koncie usługi Azure Blob Storage, skonfiguruj połączenie, wykonując poniższe kroki:

  1. Otwórz program Synapse Studio, przejdź do karty Połączone dane > Przycisk Dodaj przycisk> Połącz z danymi> zewnętrznymi.

    Nawiązywanie połączenia z kontem magazynu

  2. Wybierz pozycję Azure Blob Storage i wybierz pozycję Kontynuuj.

  3. Podaj nazwę połączonej usługi. Zarejestruj nazwę połączonej usługi. Te informacje będą wkrótce używane w konfiguracji platformy Spark.

  4. Wybierz konto usługi Azure Blob Storage. Upewnij się, że metoda uwierzytelniania to Klucz konta. Obecnie pula Spark może uzyskiwać dostęp tylko do konta usługi Blob Storage za pośrednictwem klucza konta.

  5. Przetestuj połączenie i wybierz pozycję Utwórz.

  6. Po utworzeniu połączonej usługi z kontem usługi Blob Storage podczas uruchamiania zapytań platformy Spark upewnij się, że uruchomisz poniższy kod Spark w notesie, aby uzyskać dostęp do konta usługi Blob Storage dla sesji platformy Spark. Dowiedz się więcej o tym, dlaczego musisz to zrobić tutaj.

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

Po skonfigurowaniu połączeń magazynu można wykonywać zapytania dotyczące istniejących tabel w magazynie metadanych Hive.

Znane ograniczenia

  • Eksplorator obiektów programu Synapse Studio będzie nadal pokazywać obiekty w zarządzanym magazynie metadanych usługi Synapse zamiast zewnętrznym HMS.
  • SQL <—> synchronizacja platformy Spark nie działa w przypadku korzystania z zewnętrznego systemu HMS.
  • Tylko usługi Azure SQL Database i Azure Database for MySQL są obsługiwane jako zewnętrzna baza danych magazynu metadanych Hive. Obsługiwana jest tylko autoryzacja SQL.
  • Obecnie platforma Spark działa tylko w zewnętrznych tabelach Programu Hive i tabelach programu Hive niezarządzanych za pomocą funkcji non-transactional/non-ACID. Nie obsługuje ona tabel Hive ACID/tabel transakcyjnych.
  • Integracja z platformą Apache Ranger nie jest obsługiwana.

Rozwiązywanie problemów

Poniżej przedstawiono błąd podczas wykonywania zapytań względem tabeli Programu Hive z danymi przechowywanymi w usłudze 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.

W przypadku korzystania z uwierzytelniania klucza na koncie magazynu za pośrednictwem połączonej usługi należy wykonać dodatkowy krok, aby uzyskać token dla sesji platformy Spark. Uruchom poniższy kod, aby skonfigurować sesję platformy Spark przed uruchomieniem zapytania. Dowiedz się więcej o tym, dlaczego musisz to zrobić tutaj.

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

Zobacz poniższy błąd podczas wykonywania zapytania o tabelę przechowywaną na koncie usługi ADLS Gen2

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

Może się tak zdarzyć, ponieważ użytkownik, który uruchamia zapytanie platformy Spark, nie ma wystarczających uprawnień dostępu do bazowego konta magazynu. Upewnij się, że użytkownik, który uruchamia zapytania platformy Spark, ma rolę Współautor danych obiektu blob usługi Storage na koncie magazynu usługi ADLS Gen2. Ten krok można wykonać po utworzeniu połączonej usługi.

Aby uniknąć zmiany schematu/wersji zaplecza HMS, domyślnie ustawiane są następujące konfiguracje hive:

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 

Jeśli twoja wersja HMS jest 1.2.1 lub 1.2.2, w programie Hive występuje problem, który twierdzi, że wymaga tylko1.2.0, jeśli zwrócisz się do true.spark.hadoop.hive.metastore.schema.verification Naszą sugestią jest zmodyfikowanie wersji HMS na 1.2.0, lub zastąpienie poniżej dwóch konfiguracji w celu obejścia:

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

Jeśli musisz przeprowadzić migrację wersji HMS, zalecamy użycie narzędzia schematu hive. A jeśli HMS został użyty przez klastry usługi HDInsight, sugerujemy użycie udostępnionej wersji usługi HDI.

Zmiana schematu HMS dla systemu operacyjnego HMS 3.1

Usługa Synapse ma na celu bezproblemową pracę z obliczeniami z usługi HDI. Jednak HMS 3.1 w hdi 4.0 nie jest w pełni zgodny z OSS HMS 3.1. Zastosuj następujące elementy ręcznie do systemu HMS 3.1, jeśli nie jest on aprowizowany przez usługę 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);

Podczas udostępniania magazynu metadanych w klastrze Spark usługi HDInsight 4.0 nie widzę tabel

Jeśli chcesz udostępnić katalog Hive klastrowi spark w usłudze HDInsight 4.0, upewnij się, że właściwość spark.hadoop.metastore.catalog.default w usłudze Synapse spark jest zgodna z wartością w usłudze HDInsight spark. Wartość domyślna dla platformy Spark w usłudze HDI to spark, a wartość domyślna dla platformy Spark w usłudze Synapse to hive.

Podczas udostępniania magazynu metadanych Hive w klastrze Hive w usłudze HDInsight 4.0 można pomyślnie wyświetlić listę tabel, ale otrzymuję pusty wynik tylko wtedy, gdy wysyłam zapytanie do tabeli

Jak wspomniano w ograniczeniach, pula Platformy Spark usługi Synapse obsługuje tylko zewnętrzne tabele hive i tabele zarządzane poza transakcyjne/ACID, nie obsługuje obecnie tabel hive ACID/transakcyjnych. W klastrach Hive usługi HDInsight 4.0 wszystkie tabele zarządzane są domyślnie tworzone jako tabele ACID/transakcyjne, dlatego podczas wykonywania zapytań dotyczących tych tabel uzyskuje się puste wyniki.

Zobacz poniższy błąd, gdy zewnętrzny magazyn metadanych jest używany podczas włączania inteligentnej pamięci podręcznej

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

Ten problem można łatwo rozwiązać, dołączając /usr/hdp/current/hadoop-client/* element do pliku 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/*