Zewnętrzny magazyn metadanych Apache Hive (starsza wersja)
W tym artykule opisano sposób konfigurowania klastrów usługi Azure Databricks w celu nawiązania połączenia z istniejącymi zewnętrznymi magazynami metadanych Apache Hive. Zawiera on informacje o zalecanych wymaganiach dotyczących konfiguracji magazynu metadanych i konfiguracji klastra, a następnie instrukcje dotyczące konfigurowania klastrów w celu nawiązania połączenia z zewnętrznym magazynem metadanych. Aby uzyskać informacje o wersji biblioteki Hive zawarte w środowisku Databricks Runtime, zobacz odpowiednie informacje o wersji środowiska Databricks Runtime.
Ważne
- Chociaż program SQL Server działa jako bazowa baza danych magazynu metadanych dla programu Hive 2.0 lub nowszego, przykłady w tym artykule korzystają z usługi Azure SQL Database.
- Aby uzyskać informacje o zgodności magazynu metadanych Hive z usługą HDInsight, zobacz Używanie zewnętrznych magazynów metadanych w usłudze Azure HDInsight.
- Jeśli używasz usługi Azure Database for MySQL jako zewnętrznego magazynu metadanych, musisz zmienić wartość
lower_case_table_names
właściwości z 1 (wartość domyślna) na 2 w konfiguracji bazy danych po stronie serwera. Aby uzyskać szczegółowe informacje, zobacz Ważność przypadku identyfikatora.
Uwaga
Używanie zewnętrznych magazynów metadanych to starszy model zapewniania ładu danych. Databricks zaleca uaktualnienie do Unity Catalog. Katalog Unity upraszcza zabezpieczenia i nadzór nad danymi, zapewniając centralne miejsce do administrowania i inspekcji dostępu do danych w wielu obszarach roboczych na Twoim koncie. Sprawdź temat Co to jest wykaz Unity?.
Konfiguracja magazynu metadanych Hive
Klient magazynu metadanych uruchomiony wewnątrz klastra łączy się z bazową bazą danych magazynu metadanych bezpośrednio przy użyciu sterownika JDBC.
Aby przetestować łączność sieciową z klastra do magazynu metadanych, możesz uruchomić następujące polecenie w notesie:
%sh
nc -vz <DNS name> <port>
where
<DNS name>
to nazwa serwera usługi Azure SQL Database.<port>
to port bazy danych.
Konfiguracje klastrów
Należy ustawić dwa zestawy opcji konfiguracji, aby połączyć klaster z zewnętrznym magazynem metadanych:
- Opcje platformy Spark umożliwiają skonfigurowanie platformy Spark przy użyciu wersji magazynu metadanych Hive i żądania JAR dla klienta magazynu metadanych.
- Opcje programu Hive umożliwiają skonfigurowanie klienta magazynu metadanych w celu nawiązania połączenia z zewnętrznym magazynem metadanych.
Opcje konfiguracji platformy Spark
Ustaw spark.sql.hive.metastore.version
wersję magazynu metadanych Hive i spark.sql.hive.metastore.jars
w następujący sposób:
Hive 0.13: nie ustawiaj wartości
spark.sql.hive.metastore.jars
.Uwaga
Hive 1.2.0 i 1.2.1 nie są wbudowanym magazynem metadanych w środowisku Databricks Runtime 7.0 i nowszym. Jeśli chcesz użyć programu Hive 1.2.0 lub 1.2.1 w środowisku Databricks Runtime 7.0 lub nowszym, wykonaj procedurę opisaną w temacie Pobieranie plików jar magazynu metadanych i wskaż je.
Hive 2.3.7 (Databricks Runtime 7.0 – 9.x) lub Hive 2.3.9 (Databricks Runtime 10.0 i nowsze): ustaw wartość
spark.sql.hive.metastore.jars
builtin
.W przypadku wszystkich innych wersji usługi Hive usługa Azure Databricks zaleca pobranie plików JAR magazynu metadanych i ustawienie konfiguracji
spark.sql.hive.metastore.jars
tak, aby wskazywała pobrane pliki JAR przy użyciu procedury opisanej w temacie Pobieranie plików jar magazynu metadanych i wskaż je.
Pobierz pliki jar magazynu metadanych i wskaż je
Utwórz klaster z ustawioną wartością
spark.sql.hive.metastore.jars
maven
ispark.sql.hive.metastore.version
, aby był zgodny z wersją magazynu metadanych.Gdy klaster jest uruchomiony, przeszukaj dziennik sterowników i znajdź wiersz podobny do następującego:
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
Katalog
<path>
jest lokalizacją pobranych jednostek JAR w węźle sterownika klastra.Alternatywnie możesz uruchomić następujący kod w notesie Scala, aby wydrukować lokalizację jednostek JAR:
import com.typesafe.config.ConfigFactory val path = ConfigFactory.load().getString("java.io.tmpdir") println(s"\nHive JARs are downloaded to the path: $path \n")
Uruchom polecenie
%sh cp -r <path> /dbfs/hive_metastore_jar
(zastępując<path>
element informacjami klastra), aby skopiować ten katalog do katalogu głównego systemu plików DBFS wywoływanegohive_metastore_jar
za pośrednictwem klienta DBFS w węźle sterownika.Utwórz skrypt inicjowania, który kopiuje
/dbfs/hive_metastore_jar
do lokalnego systemu plików węzła, upewniając się, że skrypt inicjowania spał kilka sekund przed uzyskaniem dostępu do klienta systemu plików DBFS. Gwarantuje to, że klient jest gotowy.Ustaw element
spark.sql.hive.metastore.jars
, aby użyć tego katalogu. Jeśli skrypt inicjowania kopiuje/dbfs/hive_metastore_jar
do/databricks/hive_metastore_jars/
, ustaw pozycjęspark.sql.hive.metastore.jars
na/databricks/hive_metastore_jars/*
. Lokalizacja musi zawierać końcowy znak/*
.Uruchom ponownie klaster.
Opcje konfiguracji programu Hive
W tej sekcji opisano opcje specyficzne dla programu Hive.
Aby nawiązać połączenie z zewnętrznym magazynem metadanych przy użyciu trybu lokalnego, ustaw następujące opcje konfiguracji programu Hive:
# JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionURL <mssql-connection-string>
# Username to use against metastore database
javax.jdo.option.ConnectionUserName <mssql-username>
# Password to use against metastore database
javax.jdo.option.ConnectionPassword <mssql-password>
# Driver class name for a JDBC metastore
javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver
where
<mssql-connection-string>
to parametry połączenia JDBC (którą można uzyskać w witrynie Azure Portal). Nie musisz uwzględniać nazwy użytkownika i hasła w parametry połączenia, ponieważ zostaną one ustawione wedługjavax.jdo.option.ConnectionUserName
ijavax.jdo.option.ConnectionDriverName
.<mssql-username>
i<mssql-password>
określ nazwę użytkownika i hasło konta usługi Azure SQL Database, które ma dostęp do odczytu/zapisu w bazie danych.
Uwaga
W przypadku środowisk produkcyjnych zalecamy ustawienie wartości hive.metastore.schema.verification
true
. Zapobiega to niejawnej modyfikacji schematu bazy danych magazynu metadanych programu Hive, gdy wersja klienta magazynu metadanych nie jest zgodna z wersją bazy danych magazynu metadanych. Podczas włączania tego ustawienia dla wersji klienta magazynu metadanych starszych niż Hive 1.2.0 upewnij się, że klient magazynu metadanych ma uprawnienie do zapisu w bazie danych magazynu metadanych (aby zapobiec problemowi opisanemu w programie HIVE-9749).
- W przypadku magazynu metadanych Hive w wersji 1.2.0 lub nowszej ustaw wartość
hive.metastore.schema.verification.record.version
natrue
wartość .hive.metastore.schema.verification
- W przypadku magazynu metadanych Hive w wersji 2.1.1 lub nowszej ustaw
hive.metastore.schema.verification.record.version
false
wartość natrue
ustawioną domyślnie.
Konfigurowanie zewnętrznego magazynu metadanych przy użyciu interfejsu użytkownika
Aby skonfigurować zewnętrzny magazyn metadanych przy użyciu interfejsu użytkownika usługi Azure Databricks:
Kliknij przycisk Klastry na pasku bocznym.
Kliknij pozycję Utwórz klaster.
Wprowadź następujące opcje konfiguracji platformy Spark:
# Hive-specific configuration options. # spark.hadoop prefix is added to make sure these Hive specific options propagate to the metastore client. # JDBC connect string for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionURL <mssql-connection-string> # Username to use against metastore database spark.hadoop.javax.jdo.option.ConnectionUserName <mssql-username> # Password to use against metastore database spark.hadoop.javax.jdo.option.ConnectionPassword <mssql-password> # Driver class name for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver # Spark specific configuration options spark.sql.hive.metastore.version <hive-version> # Skip this one if <hive-version> is 0.13.x. spark.sql.hive.metastore.jars <hive-jar-source>
Kontynuuj konfigurację klastra, postępując zgodnie z instrukcjami w dokumentacji konfiguracji obliczeniowej.
Kliknij pozycję Utwórz klaster , aby utworzyć klaster.
Konfigurowanie zewnętrznego magazynu metadanych przy użyciu skryptu init
Skrypty inicjowania umożliwiają nawiązywanie połączenia z istniejącym magazynem metadanych Hive bez ręcznego ustawiania wymaganych konfiguracji.
- Utwórz katalog podstawowy, w którym chcesz przechowywać skrypt inicjowania, jeśli nie istnieje. W poniższym przykładzie użyto metody
dbfs:/databricks/scripts
. - Uruchom poniższy fragment kodu w notesie. Fragment kodu tworzy skrypt
/databricks/scripts/external-metastore.sh
inicjowania w systemie plików usługi Databricks (DBFS). Alternatywnie możesz użyć operacji put interfejsu API REST dbFS, aby utworzyć skrypt inicjowania. Ten skrypt init zapisuje wymagane opcje konfiguracji do pliku konfiguracji o nazwie00-custom-spark.conf
w formacie przypominającym kod JSON wewnątrz/databricks/driver/conf/
każdego węzła klastra, za każdym razem, gdy klaster o nazwie określonej jako<cluster-name>
rozpoczyna. Usługa Azure Databricks udostępnia domyślne konfiguracje platformy Spark w/databricks/driver/conf/spark-branch.conf
pliku. Pliki konfiguracji w/databricks/driver/conf
katalogu mają zastosowanie w odwrotnej kolejności alfabetycznej. Jeśli chcesz zmienić nazwę00-custom-spark.conf
pliku, upewnij się, że będzie on nadal stosowany przed plikiemspark-branch.conf
.
Scala
dbutils.fs.put(
"/databricks/scripts/external-metastore.sh",
"""#!/bin/sh
|# Loads environment variables to determine the correct JDBC driver to use.
|source /etc/environment
|# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
|cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
|[driver] {
| # Hive specific configuration options.
| # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
| # JDBC connect string for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
|
| # Username to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
|
| # Password to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
|
| # Driver class name for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
|
| # Spark specific configuration options
| "spark.sql.hive.metastore.version" = "<hive-version>"
| # Skip this one if <hive-version> is 0.13.x.
| "spark.sql.hive.metastore.jars" = "<hive-jar-source>"
|}
|EOF
|""".stripMargin,
overwrite = true
)
Python
contents = """#!/bin/sh
# Loads environment variables to determine the correct JDBC driver to use.
source /etc/environment
# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
[driver] {
# Hive specific configuration options.
# spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
# JDBC connect string for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
# Username to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
# Password to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
# Driver class name for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
# Spark specific configuration options
"spark.sql.hive.metastore.version" = "<hive-version>"
# Skip this one if <hive-version> is 0.13.x.
"spark.sql.hive.metastore.jars" = "<hive-jar-source>"
}
EOF
"""
dbutils.fs.put(
file = "/databricks/scripts/external-metastore.sh",
contents = contents,
overwrite = True
)
- Skonfiguruj klaster za pomocą skryptu init.
- Uruchom ponownie klaster.
Rozwiązywanie problemów
Klastry nie są uruchamiane (z powodu nieprawidłowych ustawień skryptu inicjowania)
Jeśli skrypt inicjowania do konfigurowania zewnętrznego magazynu metadanych powoduje niepowodzenie tworzenia klastra, skonfiguruj skrypt inicjowania do rejestrowania i debuguj skrypt inicjowania przy użyciu dzienników.
Błąd w instrukcji SQL: InvocationTargetException
Wzorzec komunikatu o błędzie w pełnym śladzie stosu wyjątków:
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
Informacje o połączeniu JDBC zewnętrznego magazynu metadanych są błędnie skonfigurowane. Sprawdź skonfigurowaną nazwę hosta, port, nazwę użytkownika, hasło i nazwę klasy sterownika JDBC. Upewnij się również, czy nazwa użytkownika ma odpowiednie uprawnienia dostępu do bazy danych magazynu metadanych.
Wzorzec komunikatu o błędzie w pełnym śladzie stosu wyjątków:
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
Zewnętrzna baza danych magazynu metadanych nie została poprawnie zainicjowana. Sprawdź, czy utworzono bazę danych magazynu metadanych i umieść poprawną nazwę bazy danych w parametry połączenia JDBC. Następnie uruchom nowy klaster z następującymi dwiema opcjami konfiguracji platformy Spark:
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
W ten sposób biblioteka klienta programu Hive spróbuje utworzyć i zainicjować tabele w bazie danych magazynu metadanych automatycznie, gdy będzie próbowała uzyskać do nich dostęp, ale stwierdzi, że są one nieobecne.
Błąd w instrukcji SQL: AnalysisException: Nie można utworzyć wystąpienia org.apache.hadoop.hive.metastore.HiveMetastoreClient
Komunikat o błędzie w pełnym stosie wyjątków:
The specified datastore driver (driver name) was not found in the CLASSPATH
Klaster jest skonfigurowany do używania nieprawidłowego sterownika JDBC.
Ustawienie wartości datanucleus.autoCreateSchema na true nie działa zgodnie z oczekiwaniami
Domyślnie usługa Databricks ustawia również wartość datanucleus.fixedDatastore
true
, co uniemożliwia przypadkowe zmiany strukturalne w bazach danych magazynu metadanych. W związku z tym biblioteka kliencka programu Hive nie może utworzyć tabel magazynu metadanych, nawet jeśli ustawiono wartość datanucleus.autoCreateSchema
true
. Ta strategia jest ogólnie bezpieczniejsza dla środowisk produkcyjnych, ponieważ uniemożliwia przypadkowe uaktualnienie bazy danych magazynu metadanych.
Jeśli chcesz użyć datanucleus.autoCreateSchema
polecenia w celu zainicjowania bazy danych magazynu metadanych, upewnij się, że ustawiono wartość false
datanucleus.fixedDatastore
. Ponadto możesz przerzucić obie flagi po zainicjowaniu bazy danych magazynu metadanych, aby zapewnić lepszą ochronę środowiska produkcyjnego.