Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il motore di esecuzione nativo costituisce un miglioramento eccezionale per le esecuzioni di processi di Apache Spark in Microsoft Fabric. Questo motore vettorializzato ottimizza le prestazioni e l'efficienza delle query Spark eseguendole direttamente nell'infrastruttura Lakehouse. Grazie alla totale integrazione del motore, non sono necessarie modifiche del codice e si evitano accordi esclusivi con i fornitori. Supporta le API Apache Spark ed è compatibile con Runtime 1.3 (Apache Spark 3.5) e funziona con entrambi i formati Parquet e Delta. Indipendentemente dalla posizione dei dati all'interno di OneLake o se si accede ai dati tramite collegamenti, il motore di esecuzione nativo ottimizza l'efficienza e le prestazioni.
Il motore di esecuzione nativo aumenta significativamente le prestazioni delle query riducendo al minimo i costi operativi. Offre un notevole miglioramento della velocità, ottenendo prestazioni fino a quattro volte più veloci rispetto a Spark OSS (software open source) tradizionale, come dimostrato dal benchmark TPC-DS 1 TB. Il motore è abile nella gestione di un'ampia gamma di scenari di elaborazione dati, che spaziano dall'ingestione di dati di routine, lavori batch e attività ETL (estrazione, trasformazione, caricamento) fino a complesse analisi di data science e interrogazioni interattive dinamiche. Gli utenti traggono vantaggio dall’accelerazione dei tempi di elaborazione, dall’aumento della velocità effettiva e dall'uso ottimizzato delle risorse.
Il motore di esecuzione nativo si basa su due componenti OSS chiave: Velox, una libreria di accelerazione del database C++ introdotta da Meta, e Apache Glutine (incubating), un livello intermedio responsabile dell'offload dell'esecuzione di motori SQL basati su JVM in motori nativi introdotti da Intel.
Nota
Il motore di esecuzione nativo attualmente è disponibile in anteprima pubblica. Per altre informazioni, vedere le limitazioni correnti. È consigliabile abilitare il motore di esecuzione nativo nei carichi di lavoro senza costi aggiuntivi. Si trarrà vantaggio dall'esecuzione più rapida dei processi senza pagare di più, in modo efficace, si paga meno per lo stesso lavoro.
Quando usare il motore di esecuzione nativo
Il motore di esecuzione nativo offre una soluzione per l'esecuzione di query su set di dati su larga scala; ottimizza le prestazioni usando le funzionalità native delle origini dati sottostanti e riducendo al minimo il sovraccarico tipicamente associato allo spostamento e alla serializzazione dei dati in ambienti Spark tradizionali. Il motore supporta vari operatori e tipi di dati, tra cui aggregazione rollup hash, join annidato con ciclo broadcast (BNLJ) e formati di timestamp precisi. Tuttavia, per sfruttare appieno le funzionalità del motore, è consigliabile considerare i casi d'uso ottimali:
- Il motore è efficace quando si lavora con i dati in formati Parquet e Delta, che possono essere elaborati in modo nativo ed efficiente.
- Le query che comportano trasformazioni e aggregazioni complesse traggono notevoli vantaggi dalle funzionalità di elaborazione e vettorizzazione colonnare del motore.
- Il miglioramento delle prestazioni è particolarmente importante negli scenari in cui le query non attivano il meccanismo di fallback evitando funzionalità o espressioni non supportate.
- Il motore è particolarmente adatto per le query che richiedono un utilizzo intensivo delle risorse di calcolo, invece che semplici o associate a I/O.
Per informazioni sugli operatori e sulle funzioni supportate dal motore di esecuzione nativo, vedere la Documentazione di Apache Gluten.
Abilitare il motore di esecuzione nativo
Per usare le funzionalità complete del motore di esecuzione nativo durante la fase di anteprima, sono necessarie configurazioni specifiche. Le procedure seguenti illustrano come attivare questa funzionalità per notebook, definizioni processo e interi ambienti Spark.
Importante
Il motore di esecuzione nativo supporta la versione più recente del runtime ga, ovvero Runtime 1.3 (Apache Spark 3.5, Delta Lake 3.2). Con il rilascio del motore di esecuzione nativo in Runtime 1.3, il supporto per la versione precedente( Runtime 1.2 (Apache Spark 3.4, Delta Lake 2.4) è stato sospeso. Si consiglia a tutti i clienti di eseguire l'aggiornamento alla versione più recente di Runtime 1.3. Se si usa il motore di esecuzione nativo in Runtime 1.2, l'accelerazione nativa verrà presto disabilitata.
Abilitare a livello di ambiente
Per garantire un miglioramento uniforme delle prestazioni, abilitare il motore di esecuzione nativo in tutti i processi e i notebook associati all'ambiente:
Accedere alle impostazioni dell'ambiente.
Vai a Spark compute.
Vai alla scheda Accelerazione.
Selezionare la casella Abilita motore di esecuzione nativo.
Salvare e pubblicare le modifiche.
Se abilitato a livello di ambiente, tutti i processi e i notebook successivi ereditano l'impostazione. Questa ereditarietà garantisce che qualsiasi nuova sessione o risorsa creata nell'ambiente sfrutti automaticamente le funzionalità di esecuzione avanzate.
Importante
In precedenza, il motore di esecuzione nativo è stato abilitato tramite le impostazioni di Spark all'interno della configurazione dell'ambiente. Il motore di esecuzione nativo può ora essere abilitato più facilmente usando un interruttore nella scheda Accelerazione delle impostazioni dell'ambiente. Per continuare a usarlo, passare alla scheda Accelerazione e attivare l'interruttore. È anche possibile abilitarlo tramite le proprietà di Spark, se preferito.
Abilitare per un notebook o la definizione di un processo Spark
È anche possibile abilitare il motore di esecuzione nativo per un singolo notebook o una definizione di processo Spark, è necessario incorporare le configurazioni necessarie all'inizio dello script di esecuzione:
%%configure
{
"conf": {
"spark.native.enabled": "true",
}
}
Per i notebook, inserire i comandi di configurazione necessari nella prima cella. Per le definizioni del processo Spark, includere le configurazioni all'inizio della definizione del processo Spark. Il motore di esecuzione nativo è integrato con i pool live, quindi, dopo aver abilitato la funzionalità, diventa effettivo immediatamente senza richiedere l'avvio di una nuova sessione.
Controllo a livello di query
I meccanismi per abilitare il motore di esecuzione nativo a livello di tenant, area di lavoro e ambiente, perfettamente integrato con l'interfaccia utente, sono in fase di sviluppo attivo. Nel frattempo, è possibile disabilitare il motore di esecuzione nativo per query specifiche, in particolare se coinvolgono operatori che attualmente non sono supportati (vedere le limitazioni). Per disabilitare, impostare la configurazione Spark spark.native.enabled su false per la cella specifica contenente la query.
%%sql
SET spark.native.enabled=FALSE;
Dopo aver eseguito la query in cui il motore di esecuzione nativo è disabilitato, è necessario riabilitarlo per le celle successive impostando spark.native.enabled su true. Questo passaggio è necessario perché Spark esegue le celle di codice in sequenza.
%%sql
SET spark.native.enabled=TRUE;
Identificare le operazioni eseguite dal motore
Esistono diversi metodi per determinare se un operatore nel processo Apache Spark è stato elaborato usando il motore di esecuzione nativo.
Interfaccia utente di Spark e server cronologia di Spark
Accedere all'interfaccia utente di Spark o al server cronologia di Spark per individuare la query da esaminare. Per accedere all'interfaccia utente Web Spark, navigare alla definizione del job Spark ed eseguirla. Dalla scheda Esecuzioni, selezionare i ... accanto al nome dell'applicazione e selezionare Apri interfaccia utente web di Spark. È anche possibile accedere all'interfaccia utente di Spark dalla scheda Monitor nell'area di lavoro. Selezionare il notebook o la pipeline, nella pagina di monitoraggio è disponibile un collegamento diretto all'interfaccia utente di Spark per i processi attivi.
Nel piano di query visualizzato nell'interfaccia utente di Spark, si devono cercare i nomi di nodo che terminano con il suffisso Transformer, *NativeFileScan, o VeloxColumnarToRowExec. Il suffisso indica che il motore di esecuzione nativo ha eseguito l'operazione. Ad esempio, i nodi possono essere etichettati come RollUpHashAggregateTransformer, ProjectExecTransformer, BroadcastHashJoinExecTransformer, ShuffledHashJoinExecTransformer o BroadcastNestedLoopJoinExecTransformer.
Spiegazione del DataFrame
In alternativa, è possibile eseguire il comando df.explain()
nel notebook per visualizzare il piano di esecuzione. All'interno dell'output, cercare i medesimi suffissi di Transformer, *NativeFileScan o VeloxColumnarToRowExec. Questo metodo consente di verificare rapidamente se le operazioni specifiche sono gestite dal motore di esecuzione nativo.
Meccanismo di riserva
In alcuni casi, il motore di esecuzione nativo potrebbe non riuscire a eseguire una query a causa di motivi come funzionalità non supportate. In questi casi, l'operazione ricorre al motore Spark tradizionale. Questo meccanismo di fallback automatico garantisce che non vi sia alcuna interruzione del flusso di lavoro.
Monitorare le Query e i DataFrame eseguiti dal motore
Per comprendere meglio il modo in cui il motore di esecuzione nativa viene applicato alle query SQL e alle operazioni del dataframe e per eseguire il drill-down ai livelli di fase e operatore, è possibile fare riferimento all'interfaccia utente spark e al server cronologia Spark per informazioni più dettagliate sull'esecuzione del motore nativo.
Scheda Motore di esecuzione nativo
Puoi navigare sulla nuova scheda "Gluten SQL/DataFrame" per vedere le informazioni sul build di Gluten e i dettagli di esecuzione delle query. La tabella Query fornisce informazioni dettagliate sul numero di nodi in esecuzione nel motore nativo e quelli che rientrano nella JVM per ogni query.
Grafico dell'esecuzione delle query
È anche possibile selezionare la descrizione della query per visualizzare il piano di esecuzione delle query Apache Spark. Il grafico dell'esecuzione fornisce dettagli di esecuzione nativi attraverso le fasi e le rispettive operazioni. I colori di sfondo differenziano i motori di esecuzione: il verde rappresenta il motore di esecuzione nativo, mentre il blu chiaro indica che l'operazione è in esecuzione nel motore JVM predefinito.
Limiti
Anche se il motore di esecuzione nativo (NEE) in Microsoft Fabric migliora significativamente le prestazioni per i processi Apache Spark, attualmente presenta le limitazioni seguenti:
Limitazioni esistenti
Funzionalità Spark incompatibili: il motore di esecuzione nativo attualmente non supporta funzioni definite dall'utente (UDF), la
array_contains
funzione o lo streaming strutturato. Se queste funzioni o funzionalità non supportate vengono usate direttamente o tramite librerie importate, Spark ripristina il motore predefinito.Formati di file non supportati: le query su
JSON
,XML
eCSV
i formati non vengono accelerati dal motore di esecuzione nativo. Per impostazione predefinita, si tornerà al normale motore JVM Spark per l'esecuzione.Modalità ANSI non supportata: il motore di esecuzione nativo non supporta la modalità SQL ANSI. Se attivata, l'esecuzione ricadrà sul motore Spark standard.
Mancata corrispondenza del tipo di dati del filtro: per trarre vantaggio dall'accelerazione del motore di esecuzione nativo, assicurarsi che entrambi i lati di un confronto di date coincidano nel tipo di dati. Ad esempio, invece di confrontare una
DATETIME
colonna con un valore letterale stringa, eseguirne il cast in modo esplicito come illustrato di seguito:CAST(order_date AS DATE) = '2024-05-20'
Altre considerazioni e limitazioni
Mancata corrispondenza del cast da decimale a float: durante il cast da
DECIMAL
aFLOAT
, Spark mantiene la precisione convertendo in una stringa e analizzandola. NEE (tramite Velox) esegue un casting diretto dalla rappresentazione internaint128_t
, il che può causare discrepanze di arrotondamento.Errori di configurazione del fuso orario : l'impostazione di un fuso orario non riconosciuto in Spark causa l'esito negativo del processo in NEE, mentre Spark JVM lo gestisce normalmente. Per esempio:
"spark.sql.session.timeZone": "-08:00" // May cause failure under NEE
Comportamento di arrotondamento incoerente: la
round()
funzione si comporta in modo diverso in NEE a causa della dipendenza dastd::round
, che non replica la logica di arrotondamento di Spark. Ciò può causare incoerenze numeriche nei risultati di arrotondamento.Controllo della chiave duplicata mancante nella funzione
map()
: quandospark.sql.mapKeyDedupPolicy
è impostato su EXCEPTION, Spark genera un errore per le chiavi duplicate. NEE attualmente ignora questo controllo e consente che la query venga eseguita, sebbene in modo errato.
Esempio:SELECT map(1, 'a', 1, 'b'); -- Should fail, but returns {1: 'b'}
Varianza degli ordini in
collect_list()
con l'ordinamento: quando si usaDISTRIBUTE BY
eSORT BY
, Spark mantiene l'ordine degli elementi incollect_list()
. NEE può restituire valori in un ordine diverso a causa di differenze casuali, che possono comportare aspettative non corrispondenti per la logica sensibile all'ordinamento.Disallineamento del tipo intermedio per
collect_list()
/collect_set()
: Spark utilizzaBINARY
come tipo intermedio per queste aggregazioni, e NEE utilizzaARRAY
. Questa mancata corrispondenza può causare problemi di compatibilità durante la pianificazione o l'esecuzione delle query.