Aprire Synapse Studio, andare a Gestisci >Servizi collegati a sinistra, fare clic su Nuovo per creare un nuovo servizio collegato.
Scegliere Database di Azure per MySQL, fare clic su Continua.
Specificare il nome del servizio collegato. Registrare il nome del servizio collegato; queste informazioni verranno usate per configurare Spark a breve.
Selezionare Database di Azure per MySQL per il metastore Hive esterno dall'elenco delle sottoscrizioni di Azure oppure immettere manualmente le informazioni.
Specificare il Nome utente e la Password per configurare la connessione.
Testare la connessione per verificare il nome utente e la password.
Fare clic su Crea per creare il servizio collegato.
Alcune impostazioni delle regole di sicurezza di rete potrebbero bloccare l'accesso dal pool di Spark al database metastore Hive esterno. Prima di configurare il pool di Spark, eseguire il codice seguente in qualsiasi notebook del pool di Spark per testare la connessione al database Metastore Hive esterno.
È anche possibile ottenere la versione del Metastore Hive dai risultati dell'output. La versione del Metastore Hive verrà usata nella configurazione di Spark.
Avviso
Non pubblicare gli script di test nel notebook con la password hardcoded perché ciò potrebbe causare un potenziale rischio di sicurezza per il metastore Hive.
Codice di test della connessione per 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")
}
Codice di test della connessione per Database di Azure per 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")
}
Dopo aver creato il servizio collegato al metastore Hive esterno, è necessario configurare alcune configurazioni Spark per usare il metastore Hive esterno. È possibile configurare la configurazione a livello di pool di Spark o a livello di sessione Spark.
Qui di seguito sono fornite configurazioni e le descrizioni:
Nota
Synapse punta a funzionare senza problemi con i calcoli di HDI. Tuttavia HMS 3.1 in HDI 4.0 non è completamente compatibile con OSS HMS 3.1. Per OSS HMS 3.1, vedere qui.
Configurazione di Spark |
Descrizione |
spark.sql.hive.metastore.version |
Versioni supportate: Assicurarsi di usare le prime 2 parti senza la terza parte |
spark.sql.hive.metastore.jars |
- Versione 2.3:
/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/* - Versione 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 |
Nome del servizio collegato |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc,com.microsoft.vegas |
Quando si crea il pool di Spark, nella scheda Impostazioni aggiuntive inserire le configurazioni seguenti in un file di testo e caricarlo nella sezione Configurazione di Apache Spark. È anche possibile usare il menu di scelta rapida per un pool di Spark esistente, scegliere Configurazione di Apache Spark per aggiungere queste configurazioni.
Aggiornare la versione del metastore e il nome del servizio collegato e salvare le configurazioni seguenti in un file di testo per la configurazione del pool di 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.vegas
Ecco un esempio per metastore versione 2.3 con il servizio collegato denominato 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.vegas
Per la sessione del notebook, è anche possibile configurare la sessione Spark nel notebook usando il comando magic %%configure
. Ecco il codice.
%%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.vegas"
}
}
Per il processo batch, la stessa configurazione può essere applicata anche tramite SparkConf
.
Eseguire query per verificare la connessione
Dopo tutte queste impostazioni, provare a elencare gli oggetti catalogo eseguendo la query seguente nel notebook Spark per verificare la connettività al Metastore Hive esterno.
spark.sql("show databases").show()
Configurare la connessione di archiviazione
Il servizio collegato al database Metastore Hive fornisce solo l'accesso ai metadati del catalogo Hive. Per eseguire query sulle tabelle esistenti, è necessario configurare anche la connessione all'account di archiviazione che archivia i dati sottostanti per le tabelle Hive.
Configurare la connessione ad Azure Data Lake Storage Gen 2
Account di archiviazione primario dell'area di lavoro
Se i dati sottostanti delle tabelle Hive vengono archiviati nell'account di archiviazione primario dell'area di lavoro, non è necessario eseguire impostazioni aggiuntive. Tale opzione è disponibile solo se sono state seguite le istruzioni di configurazione dell'archiviazione durante la creazione dell'area di lavoro.
Altro account ADLS Gen 2
Se i dati sottostanti dei cataloghi Hive vengono archiviati in un altro account ADLS Gen 2, è necessario assicurarsi che gli utenti che eseguono query Spark abbiano il ruolo Collaboratore ai dati del BLOB di archiviazione nell'account di archiviazione ADLS Gen2.
Configurare la connessione all'archiviazione BLOB
Se i dati sottostanti delle tabelle Hive vengono archiviati nell'account di archiviazione BLOB di Azure, configurare la connessione seguendo questa procedura:
Aprire Synapse Studio, passare alla scheda Dati> Collegati > premere il pulsante Aggiungi >Connetti a dati esterni.
Scegliere Archiviazione BLOB di Azure e selezionare Continua.
Specificare il nome del servizio collegato. Registrare il nome del servizio collegato, queste informazioni verranno usate a breve nella configurazione di Spark.
Selezionare l'account di archiviazione BLOB di Azure. Assicurarsi che il metodo di autenticazione sia Chiave dell'account. Attualmente il pool di Spark può accedere solo all'account di archiviazione BLOB tramite la chiave dell'account.
Testare la connessione e selezionare Crea.
Dopo aver creato il servizio collegato all'account di archiviazione BLOB, quando si eseguono query Spark, assicurarsi di eseguire il codice Spark seguente nel notebook per ottenere l'accesso all'account di archiviazione BLOB per la sessione Spark. Altre informazioni sul motivo per cui è necessario eseguire questa operazione sono disponibili qui.
%%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)
Dopo aver configurato le connessioni di archiviazione, è possibile eseguire query sulle tabelle esistenti nel Metastore Hive.
Limitazioni note
- Esplora oggetti di Synapse Studio continuerà a visualizzare gli oggetti nel metastore Synapse gestito anziché in HMS esterno.
-
SQL <:> la sincronizzazione Spark non è disponibile quando si usa HMS esterno.
- Solo il database SQL di Azure e il database di Azure per MySQL sono supportati come database Metastore Hive esterno. È supportata solo l'autorizzazione SQL.
- Attualmente Spark è disponibile solo su tabelle Hive esterne e tabelle Hive non transazionali/non ACID gestite. Non supporta le tabelle Hive ACID/transazionali.
- L'integrazione di Apache Ranger non è supportata.
Risoluzione dei problemi
Vedere l’errore seguente durante l'esecuzione di query su una tabella Hive con dati archiviati nell'archiviazione BLOB
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.
Quando si usa l'autenticazione della chiave per l'account di archiviazione tramite il servizio collegato, è necessario eseguire un passaggio aggiuntivo per ottenere il token per la sessione Spark. Eseguire il codice seguente per configurare la sessione di Spark prima di eseguire la query. Altre informazioni sul motivo per cui è necessario eseguire questa operazione sono disponibili qui.
%%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)
Vedere l'errore seguente quando si esegue una query su una tabella archiviata nell'account ADLS Gen2
Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD
Questo problema può verificarsi perché l'utente che esegue la query di Spark non ha accesso sufficiente all'account di archiviazione sottostante. Assicurarsi che l'utente che esegue le query di Spark abbia il ruolo di Collaboratore ai dati del BLOB di Archiviazione nell'account di archiviazione ADLS Gen2. Questo passaggio può essere eseguito dopo la creazione del servizio collegato.
Per evitare di modificare lo schema/versione back-end di HMS, per impostazione predefinita vengono impostate le configurazioni hive seguenti:
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
Se la versione di HMS è 1.2.1
o 1.2.2
, si verifica un problema in Hive che afferma di richiedere solo 1.2.0
se si trasforma spark.hadoop.hive.metastore.schema.verification
in true
. Il suggerimento è che sia possibile modificare la versione di HMS in 1.2.0
o sovrascrivere le due configurazioni seguenti per risolvere il problema:
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
Se è necessario eseguire la migrazione della versione HMS, è consigliabile usare lo strumento dello schema hive. Se il modulo HMS è stato usato dai cluster HDInsight, è consigliabile usare la versione fornita da HDI.
Modifica dello schema HMS per OSS HMS 3.1
Synapse punta a funzionare senza problemi con i calcoli di HDI. Tuttavia, HMS 3.1 in HDI 4.0 non è completamente compatibile con OSS HMS 3.1. Applicare manualmente il codice seguente a HMS 3.1 se non viene effettuato il provisioning da 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);
Se si vuole condividere il catalogo Hive con un cluster Spark in HDInsight 4.0, assicurarsi che la proprietà spark.hadoop.metastore.catalog.default
in Synapse spark sia allineata al valore in HDInsight spark. Il valore predefinito di Spark per HDI è spark
e il valore predefinito di Spark per Synapse è hive
.
Come accennato nelle limitazioni, il pool di Spark per Synapse supporta esclusivamente tabelle Hive esterne e le tabelle gestite non transazionali/ACID. Nei cluster Hive di HDInsight 4.0 tutte le tabelle gestite vengono create come tabelle ACID/transazionali per impostazione predefinita, per cui si ottengono risultati vuoti durante l'esecuzione di query su tali tabelle.
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
È possibile risolvere facilmente questo problema aggiungendo /usr/hdp/current/hadoop-client/*
a 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/*