Metastore Apache Hive esterno (legacy)
Questo articolo descrive come configurare i cluster Di Azure Databricks per connettersi ai metastore Apache Hive esterni esistenti. Fornisce informazioni sui requisiti consigliati per la configurazione del metastore e i requisiti di configurazione del cluster, seguiti da istruzioni per la configurazione dei cluster per la connessione a un metastore esterno. Per le versioni della libreria Hive incluse in Databricks Runtime, vedere le note sulla versione di Databricks Runtime pertinenti.
Importante
- Mentre SQL Server funziona come database metastore sottostante per Hive 2.0 e versioni successive, gli esempi in questo articolo usano database SQL di Azure.
- Per informazioni sulla compatibilità dei metastore Hive con HDInsight, vedere Usare archivi di metadati esterni in Azure HDInsight.
- Se si usa Database di Azure per MySQL come metastore esterno, è necessario modificare il valore della
lower_case_table_names
proprietà da 1 (impostazione predefinita) a 2 nella configurazione del database lato server. Per informazioni dettagliate, vedere Distinzione tra maiuscole e minuscole dell'identificatore.
Nota
L'uso di metastore esterni è un modello di governance dei dati legacy. Databricks consiglia di eseguire l'aggiornamento a Unity Catalog. Unity Catalog semplifica la sicurezza e la governance dei dati fornendo una posizione centrale per amministrare e controllare l'accesso ai dati in più aree di lavoro nell'account. Vedere Cos'è Unity Catalog?.
Configurazione del metastore Hive
Il client metastore in esecuzione all'interno di un cluster si connette direttamente al database metastore sottostante usando JDBC.
Per testare la connettività di rete da un cluster al metastore, è possibile eseguire il comando seguente all'interno di un notebook:
%sh
nc -vz <DNS name> <port>
where
<DNS name>
è il nome del server di database SQL di Azure.<port>
è la porta del database.
Configurazioni dei cluster
È necessario impostare due set di opzioni di configurazione per connettere un cluster a un metastore esterno:
- Le opzioni di Spark configurano Spark con la versione del metastore Hive e i file JAR per il client metastore.
- Le opzioni Hive configurano il client metastore per connettersi al metastore esterno.
Opzioni di configurazione di Spark
Impostare spark.sql.hive.metastore.version
sulla versione del metastore Hive e spark.sql.hive.metastore.jars
come indicato di seguito:
Hive 0.13: non impostare
spark.sql.hive.metastore.jars
.Nota
Hive 1.2.0 e 1.2.1 non sono il metastore predefinito in Databricks Runtime 7.0 e versioni successive. Se si vuole usare Hive 1.2.0 o 1.2.1 con Databricks Runtime 7.0 e versioni successive, seguire la procedura descritta in Scaricare i file JAR del metastore e puntare a essi.
Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) o Hive 2.3.9 (Databricks Runtime 10.0 e versioni successive): impostato su
spark.sql.hive.metastore.jars
builtin
.Per tutte le altre versioni di Hive, Azure Databricks consiglia di scaricare i file JAR del metastore e impostare la configurazione
spark.sql.hive.metastore.jars
in modo che punti ai FILE JAR scaricati usando la procedura descritta in Scaricare i file JAR del metastore e puntare a essi.
Scaricare i file JAR del metastore e puntare a essi
Creare un cluster con
spark.sql.hive.metastore.jars
impostato sumaven
espark.sql.hive.metastore.version
in modo che corrisponda alla versione del metastore.Quando il cluster è in esecuzione, cercare il log del driver e trovare una riga simile alla seguente:
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
La directory
<path>
è il percorso dei file JAR scaricati nel nodo driver del cluster.In alternativa, è possibile eseguire il codice seguente in un notebook Scala per stampare il percorso dei file 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")
Eseguire
%sh cp -r <path> /dbfs/hive_metastore_jar
(sostituendo<path>
con le informazioni del cluster) per copiare questa directory in una directory nella radice DBFS chiamatahive_metastore_jar
tramite il client DBFS nel nodo driver.Creare uno script init che copia
/dbfs/hive_metastore_jar
nel file system locale del nodo, assicurandosi di attivare lo script init alcuni secondi prima di accedere al client DBFS. In questo modo si garantisce che il client sia pronto.Impostare
spark.sql.hive.metastore.jars
per usare questa directory. Se lo script init copia/dbfs/hive_metastore_jar
in/databricks/hive_metastore_jars/
, impostarespark.sql.hive.metastore.jars
su/databricks/hive_metastore_jars/*
. Il percorso deve includere/*
alla fine.Riavviare il cluster.
Opzioni di configurazione di Hive
Questa sezione descrive le opzioni specifiche di Hive.
Per connettersi a un metastore esterno usando la modalità locale, impostare le opzioni di configurazione hive seguenti:
# 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>
è il stringa di connessione JDBC (che è possibile ottenere nella portale di Azure). Non è necessario includere il nome utente e la password nella stringa di connessione, perché verranno impostati dajavax.jdo.option.ConnectionUserName
ejavax.jdo.option.ConnectionDriverName
.<mssql-username>
e<mssql-password>
specificare il nome utente e la password dell'account database SQL di Azure con accesso in lettura/scrittura al database.
Nota
Per gli ambienti di produzione, è consigliabile impostare su hive.metastore.schema.verification
true
. Ciò impedisce al client metastore Hive di modificare in modo implicito lo schema del database metastore quando la versione del client metastore non corrisponde alla versione del database metastore. Quando si abilita questa impostazione per le versioni client del metastore inferiori a Hive 1.2.0, assicurarsi che il client metastore disponga dell'autorizzazione di scrittura per il database metastore (per evitare il problema descritto in HIVE-9749).
- Per il metastore Hive 1.2.0 e versioni successive, impostare su
hive.metastore.schema.verification.record.version
true
per abilitarehive.metastore.schema.verification
. - Per il metastore Hive 2.1.1 e versioni successive, impostare su come è impostato su
hive.metastore.schema.verification.record.version
true
false
per impostazione predefinita.
Configurare un metastore esterno usando l'interfaccia utente
Per configurare un metastore esterno usando l'interfaccia utente di Azure Databricks:
Fare clic sul pulsante Cluster sulla barra laterale.
Fare clic su Create cluster (Crea cluster).
Immettere le opzioni di configurazione di Spark seguenti:
# 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>
Continuare la configurazione del cluster seguendo le istruzioni riportate in Informazioni di riferimento sulla configurazione di calcolo.
Fare clic su Crea cluster per creare il cluster.
Configurare un metastore esterno usando uno script init
Gli script Init consentono di connettersi a un metastore Hive esistente senza impostare manualmente le configurazioni necessarie.
- Creare la directory di base in cui archiviare lo script init, se non esiste. Nell'esempio seguente viene utilizzato
dbfs:/databricks/scripts
: - Eseguire il frammento di codice seguente in un notebook. Il frammento di codice crea lo script
/databricks/scripts/external-metastore.sh
init in Databricks File System (DBFS). In alternativa, è possibile usare l'operazione put dell'API REST DBFS per creare lo script init. Questo script init scrive le opzioni di configurazione necessarie in un file di configurazione denominato00-custom-spark.conf
in un formato/databricks/driver/conf/
simile a JSON all'interno di ogni nodo del cluster, ogni volta che un cluster con il nome specificato viene<cluster-name>
avviato. Azure Databricks fornisce configurazioni Spark predefinite nel/databricks/driver/conf/spark-branch.conf
file. I file di configurazione nella/databricks/driver/conf
directory si applicano in ordine alfabetico inverso. Se si desidera modificare il nome del00-custom-spark.conf
file, assicurarsi che continui a essere applicato prima delspark-branch.conf
file.
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
)
- Configurare il cluster con lo script init.
- Riavviare il cluster.
Risoluzione dei problemi
I cluster non si avviano (a causa di impostazioni di script init non corrette)
Se uno script init per la configurazione del metastore esterno causa l'esito negativo della creazione del cluster, configurare lo script init per registrare ed eseguire il debug dello script init usando i log.
Errore nell'istruzione SQL: InvocationTargetException
Modello di messaggio di errore nella traccia completa dello stack di eccezioni:
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
Le informazioni di connessione JDBC del metastore esterno non sono configurate correttamente. Verificare il nome host, la porta, il nome utente, la password e il nome della classe del driver JDBC configurati. Assicurarsi inoltre che il nome utente abbia il privilegio di accedere al database del metastore.
Modello di messaggio di errore nella traccia completa dello stack di eccezioni:
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
Database metastore esterno non inizializzato correttamente. Verificare di aver creato il database del metastore e di inserire il nome del database corretto nel stringa di connessione JDBC. Successivamente, avviare un nuovo cluster con le due opzioni di configurazione spark seguenti:
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
In questo modo, la libreria client di Hive cercherà di creare e inizializzare automaticamente le tabelle nel database del metastore quando cercherà di accedervi ma le troverà assenti.
Errore nell'istruzione SQL: AnalysisException: Impossibile creare un'istanza di org.apache.hadoop.hive.metastore.HiveMetastoreClient
Messaggio di errore nello stacktrace di eccezioni completo:
The specified datastore driver (driver name) was not found in the CLASSPATH
Il cluster è configurato per l'uso di un driver JDBC non corretto.
L'impostazione di datanucleus.autoCreateSchema su true non funziona come previsto
Per impostazione predefinita, Databricks imposta anche su datanucleus.fixedDatastore
true
, che impedisce modifiche strutturali accidentali ai database del metastore. Pertanto, la libreria client Hive non può creare tabelle metastore anche se è impostato su datanucleus.autoCreateSchema
true
. Questa strategia è, in generale, più sicura per gli ambienti di produzione perché impedisce l'aggiornamento accidentale del database del metastore.
Se si vuole usare datanucleus.autoCreateSchema
per inizializzare il database del metastore, assicurarsi di impostare su datanucleus.fixedDatastore
false
. È anche possibile capovolgere entrambi i flag dopo aver inizializzato il database del metastore per garantire una migliore protezione all'ambiente di produzione.