Externí metastore Apache Hive (starší verze)
Tento článek popisuje, jak nastavit clustery Azure Databricks pro připojení k existujícím externím metastorům Apache Hive. Poskytuje informace o doporučených požadavcích na nastavení metastoru a konfiguraci clusteru a pokyny pro konfiguraci clusterů pro připojení k externímu metastoru. Informace o verzích knihovny Hive, které jsou součástí databricks Runtime, najdete v příslušných poznámkách k verzi databricks Runtime.
Důležité
- I když SQL Server funguje jako základní databáze metastoru pro Hive 2.0 a novější, příklady v tomto článku používají Azure SQL Database.
- Informace o kompatibilitě metastoru Hive se službou HDInsight najdete v tématu Použití externích úložišť metadat ve službě Azure HDInsight.
- Pokud jako externí metastore používáte Azure Database for MySQL, musíte změnit hodnotu
lower_case_table_names
vlastnosti z 1 (výchozí) na 2 v konfiguraci databáze na straně serveru. Podrobnosti najdete v tématu Citlivost případu identifikátoru.
Poznámka:
Použití externích metastorů je starší model zásad správného řízení dat. Společnost Databricks doporučuje upgradovat na katalog Unity. Katalog Unity zjednodušuje zabezpečení a zásady správného řízení vašich dat tím, že poskytuje centrální místo pro správu a auditování přístupu k datům ve více pracovních prostorech ve vašem účtu. Viz téma Co je katalog Unity?.
Nastavení metastoru Hive
Klient metastoru spuštěný v clusteru se připojí k podkladové databázi metastoru přímo pomocí JDBC.
Pokud chcete otestovat síťové připojení z clusteru k metastoru, můžete v poznámkovém bloku spustit následující příkaz:
%sh
nc -vz <DNS name> <port>
kde
<DNS name>
je název serveru služby Azure SQL Database.<port>
je port databáze.
Konfigurace clusterů
Pro připojení clusteru k externímu metastoru musíte nastavit dvě sady možností konfigurace:
- Možnosti Sparku nakonfigurují Spark s verzí metastoru Hive a jar pro klienta metastoru.
- Možnosti Hivu nakonfigurují klienta metastoru tak, aby se připojil k externímu metastoru.
Možnosti konfigurace Sparku
Nastavte spark.sql.hive.metastore.version
na verzi metastoru Hive a spark.sql.hive.metastore.jars
postupujte takto:
Hive 0.13: nenastavujte
spark.sql.hive.metastore.jars
.Poznámka:
Hive 1.2.0 a 1.2.1 nejsou integrovaným metastorem v Databricks Runtime 7.0 a novějším. Pokud chcete používat Hive 1.2.0 nebo 1.2.1 s Modulem Databricks Runtime 7.0 a novějším, postupujte podle postupu popsaného v tématu Stažení souborů JAR metastoru a na ně nasměrujte.
Hive 2.3.7 (Databricks Runtime 7.0 – 9.x) nebo Hive 2.3.9 (Databricks Runtime 10.0 a vyšší): nastaveno
spark.sql.hive.metastore.jars
nabuiltin
.Ve všech ostatních verzích Hive azure Databricks doporučuje stáhnout soubory JAR metastoru a nastavit konfiguraci
spark.sql.hive.metastore.jars
tak, aby odkazovala na stažené verze JAR pomocí postupu popsaného v části Stažení souborů JAR metastoru a odkazování na ně.
Stáhněte soubory JAR metastoru a nasměrujte na ně.
Vytvořte cluster se
spark.sql.hive.metastore.jars
nastavenou verzímaven
metastoru aspark.sql.hive.metastore.version
odpovídající verzi metastoru.Když je cluster spuštěný, vyhledejte v protokolu ovladačů řádek podobný tomuto:
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
<path>
Adresář je umístění stažených jar v uzlu ovladače clusteru.Případně můžete v poznámkovém bloku Scala spustit následující kód, který vytiskne umístění 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")
Spuštěním
%sh cp -r <path> /dbfs/hive_metastore_jar
(nahrazením<path>
informací o clusteru) zkopírujte tento adresář do adresáře v kořenovém adresáři DBFS volanýmhive_metastore_jar
prostřednictvím klienta DBFS v uzlu ovladače.Vytvořte inicializační skript, který zkopíruje
/dbfs/hive_metastore_jar
do místního systému souborů uzlu, a ujistěte se, že inicializační skript přejde do režimu spánku několik sekund, než bude přistupovat ke klientovi DBFS. Tím se zajistí, že je klient připravený.Nastavte konfiguraci
spark.sql.hive.metastore.jars
tak, aby používala tento adresář. Pokud váš inicializační skript kopíruje soubory/dbfs/hive_metastore_jar
do adresáře/databricks/hive_metastore_jars/
, nastavtespark.sql.hive.metastore.jars
na/databricks/hive_metastore_jars/*
. Umístění musí obsahovat koncový znak/*
.Restartujte cluster.
Možnosti konfigurace Hivu
Tato část popisuje možnosti specifické pro Hive.
Pokud se chcete připojit k externímu metastoru pomocí místního režimu, nastavte následující možnosti konfigurace 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
kde
<mssql-connection-string>
je připojovací řetězec JDBC (který můžete získat na webu Azure Portal). Do připojovací řetězec nemusíte do připojovací řetězec zahrnout uživatelské jméno a heslo, protože je nastavíte pomocíjavax.jdo.option.ConnectionUserName
ajavax.jdo.option.ConnectionDriverName
.<mssql-username>
a<mssql-password>
zadejte uživatelské jméno a heslo účtu služby Azure SQL Database, který má k databázi přístup pro čtení a zápis.
Poznámka:
Pro produkční prostředí doporučujeme nastavit hive.metastore.schema.verification
možnost true
. To zabrání klientovi metastoru Hive implicitně upravovat schéma databáze metastoru, pokud verze klienta metastoru neodpovídá verzi databáze metastoru. Pokud povolíte toto nastavení pro verze klienta metastoru nižší než Hive 1.2.0, ujistěte se, že má klient metastoru oprávnění k zápisu do databáze metastoru (aby se zabránilo problému popsanému v HIVE-9749).
- V případě metastoru Hive 1.2.0 a novějšího nastavte
hive.metastore.schema.verification.record.version
povolenítrue
hive.metastore.schema.verification
. - U metastoru Hive 2.1.1 a vyšší je nastavená
hive.metastore.schema.verification.record.version
natrue
false
výchozí hodnotu.
Nastavení externího metastoru pomocí uživatelského rozhraní
Nastavení externího metastoru pomocí uživatelského rozhraní Azure Databricks:
Klikněte na tlačítko Clusters na bočním panelu.
Klikněte na Create Cluster (Vytvořit cluster).
Zadejte následující možnosti konfigurace Sparku:
# 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>
Kliknutím na vytvořit cluster vytvořte cluster.
Nastavení externího metastoru pomocí inicializačního skriptu
Inicializační skripty umožňují připojit se k existujícímu metastoru Hive bez ručního nastavení požadovaných konfigurací.
- Vytvořte základní adresář, do kterého chcete uložit inicializační skript, pokud neexistuje. Následující příklad používá
dbfs:/databricks/scripts
. - V poznámkovém bloku spusťte následující fragment kódu. Fragment kódu vytvoří inicializační skript
/databricks/scripts/external-metastore.sh
v systému souborů Databricks (DBFS). Alternativně můžete k vytvoření inicializačního skriptu použít operaci vložení rozhraní REST API DBFS. Tento inicializační skript zapíše požadované možnosti konfigurace do konfiguračního souboru pojmenovaného00-custom-spark.conf
ve formátu podobném formátu/databricks/driver/conf/
JSON v každém uzlu clusteru, kdykoli cluster s názvem zadaným při<cluster-name>
spuštění. Azure Databricks poskytuje v souboru výchozí konfigurace Sparku/databricks/driver/conf/spark-branch.conf
. Konfigurační soubory v/databricks/driver/conf
adresáři se použijí v obráceném abecedním pořadí. Pokud chcete změnit název00-custom-spark.conf
souboru, ujistěte se, že se bude dál používat před souboremspark-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
)
- Nakonfigurujte cluster pomocí inicializačního skriptu.
- Restartujte cluster.
Řešení problému
Clustery se nespustí (kvůli nesprávnému nastavení inicializačního skriptu)
Pokud inicializační skript pro nastavení externího metastoru způsobí selhání vytváření clusteru, nakonfigurujte inicializační skript pro protokolování a ladění inicializačního skriptu pomocí protokolů.
Chyba v příkazu SQL: InvocationTargetException
Vzor chybové zprávy v úplném trasování zásobníku výjimek:
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
Informace o připojení JDBC externího metastoru jsou chybně nakonfigurované. Ověřte název nakonfigurovaného hostitele, port, uživatelské jméno, heslo a název třídy ovladače JDBC. Také se ujistěte, že uživatelské jméno má správné oprávnění pro přístup k databázi metastoru.
Vzor chybové zprávy v úplném trasování zásobníku výjimek:
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
Databáze externího metastoru není správně inicializována. Ověřte, že jste vytvořili databázi metastoru, a vložte správný název databáze do připojovací řetězec JDBC. Potom spusťte nový cluster s následujícími dvěma možnostmi konfigurace Sparku:
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
Tímto způsobem se klientská knihovna Hive pokusí vytvořit a inicializovat tabulky v databázi metastoru automaticky, když se pokusí o přístup k nim, ale zjistí, že chybí.
Chyba v příkazu SQL: AnalysisException: Nejde vytvořit instanci org.apache.hadoop.hive.metastore.HiveMetastoreClient
Chybová zpráva v úplném zásobníku výjimek:
The specified datastore driver (driver name) was not found in the CLASSPATH
Cluster je nakonfigurovaný tak, aby používal nesprávný ovladač JDBC.
Nastavení datového nucleus.autoCreateSchema na true nefunguje podle očekávání
Ve výchozím nastavení se Databricks nastaví datanucleus.fixedDatastore
také na true
, což brání náhodným strukturálním změnám v databázích metastoru. Klientská knihovna Hive proto nemůže vytvářet tabulky metastoru, i když je nastavena datanucleus.autoCreateSchema
na true
hodnotu . Tato strategie je obecně bezpečnější pro produkční prostředí, protože brání náhodnému upgradu databáze metastoru.
Pokud chcete použít datanucleus.autoCreateSchema
k inicializaci databáze metastoru, ujistěte se, že je nastavená datanucleus.fixedDatastore
hodnota false
. Po inicializaci databáze metastoru můžete také chtít překlopit oba příznaky, abyste zajistili lepší ochranu produkčního prostředí.