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.
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ę.
Wybierz pozycję Azure SQL Database lub Azure Database for MySQL na podstawie typu bazy danych, a następnie wybierz pozycję Kontynuuj.
Podaj nazwę połączonej usługi. Zarejestruj nazwę połączonej usługi. Te informacje zostaną wkrótce użyte do skonfigurowania platformy Spark.
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.
Podaj nazwę użytkownika i hasło , aby skonfigurować połączenie.
Przetestuj połączenie , aby zweryfikować nazwę użytkownika i hasło.
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:
|
spark.sql.hive.metastore.jars |
|
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.
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:
Otwórz program Synapse Studio, przejdź do karty Połączone dane > Przycisk Dodaj przycisk> Połącz z danymi> zewnętrznymi.
Wybierz pozycję Azure Blob Storage i wybierz pozycję Kontynuuj.
Podaj nazwę połączonej usługi. Zarejestruj nazwę połączonej usługi. Te informacje będą wkrótce używane w konfiguracji platformy Spark.
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.
Przetestuj połączenie i wybierz pozycję Utwórz.
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.
Ustawienia związane ze schematem HMS
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/*