Cache intelligente in Microsoft Fabric
La funzionalità di cache intelligente funziona senza problemi dietro le quinte e memorizza nella cache i dati per contribuire all'accelerazione dell'esecuzione dei processi di Apache Spark mentre vengono letti dall’archiviazione OneLake o da Azure Data Lake Storage (ADLS) Gen 2 tramite collegamenti. Inoltre, rileva automaticamente le modifiche ai file sottostanti e aggiorna automaticamente i file nella cache, fornendo i dati più recenti. Quando le dimensioni della cache raggiungono il loro limite, la cache rilascia automaticamente i dati meno letti per liberare spazio per i dati più recenti. Questa funzionalità riduce il costo totale di proprietà migliorando le prestazioni fino al 60% nelle letture successive dei file archiviati nella cache disponibile.
Quando il motore di Apache Spark in Microsoft Fabric esegue query su un file o una tabella dal lakehouse, esegue una chiamata all'archiviazione remota per leggere i file sottostanti. Con ogni richiesta di query per la lettura degli stessi dati, il motore di Spark deve effettuare ogni volta una chiamata all'archiviazione remota. Questo processo ridondante aggiunge latenza al tempo di elaborazione totale. Spark offre una funzionalità di memorizzazione nella cache con cui è necessario impostare e rilasciare manualmente la cache per ridurre al minimo la latenza e migliorare le prestazioni complessive. Tuttavia, questo requisito può causare la presenza di dati non aggiornati se i dati sottostanti cambiano.
La funzione Cache intelligente semplifica questo processo memorizzando nella cache automaticamente ogni lettura all'interno dello spazio di archiviazione della cache allocato in ogni nodo Spark in cui i file vengono memorizzati in SSD. Ogni richiesta di un file verifica se il file esiste nella cache del nodo locale e confronta il tag dell’archiviazione remota per determinare se il file non è aggiornato. Se il file non esiste o non è aggiornato, Spark legge il file e lo archivie nella cache. Quando la cache diventa piena, il file con l'ora dell'ultimo accesso meno recente viene rimosso dalla cache per consentire file più recenti.
La cache intelligente è una singola cache per nodo. Se si usa un nodo di dimensioni medie e l’esecuzione avviene con due executor di piccole dimensioni in tale singolo nodo, i due executor condividono la stessa cache. Inoltre, questa memorizzazione nella cache a livello di file di dati consente a più query di usare la stessa cache se accedono agli stessi dati o file di dati.
Funzionamento
In Microsoft Fabric (Runtime 1.1 e 1.2), la memorizzazione nella cache intelligente è abilitata per impostazione predefinita per tutti i pool di Spark per tutte le aree di lavoro con dimensioni della cache del 50%. Le dimensioni effettive dell'archiviazione disponibile e della cache in ogni nodo dipendono dalla famiglia di nodi e dalle dimensioni dei nodi.
Quando usare la cache intelligente
Questa funzionalità è utile se:
Il carico di lavoro richiede la lettura dello stesso file più volte e le dimensioni del file rientrano nella cache.
Il carico di lavoro usa tabelle Delta Lake, formati di file Parquet e CSV.
Il vantaggio della cache intelligente non si nota nei seguenti casi:
Si sta leggendo un file che supera le dimensioni della cache. In tal caso, l'inizio dei file potrebbe essere rimosso e le query successive devono recuperare i dati dall’archiviazione remota. In questo caso, i vantaggi della funzione cache intelligente non si notano e potrebbe essere opportuno aumentare le dimensioni della cache e/o del nodo.
Il carico di lavoro richiede grandi quantità di selezioni in ordine casuale. La disabilitazione della cache intelligente libera spazio disponibile per evitare che il processo non riesca a causa dell’insufficienza dello spazio di archiviazione.
Abilitare e disabilitare la cache intelligente
È possibile disabilitare o abilitare la cache intelligente all'interno di una sessione eseguendo il codice seguente nel notebook o impostando questa configurazione a livello di area di lavoro o di elemento ambiente.
spark.conf.set("spark.synapse.vegas.useCache", "false/true")