Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Principali aree di interesse per il miglioramento delle prestazioni
Trino massimizza il parallelismo delle query e l'ottimizzazione della memoria. Questa architettura offre flessibilità consentendole di interrogare più fonti di dati diverse e allo stesso tempo di scalare in modo efficiente. Le aree chiave di miglioramento delle prestazioni in Trino includono quelle elencate di seguito.
Ottimizzazione della memoria
La gestione della memoria in Trino è fondamentale per ottenere prestazioni e stabilità elevate, soprattutto quando si eseguono query complesse e di grandi dimensioni. Trino utilizza un modello di memoria distribuita. In questo modello, la memoria viene allocata tra i nodi di lavoro per l'elaborazione di attività, aggregazioni, join e altre operazioni. L'elenco seguente presenta una raccolta di queste impostazioni:
query.max-memory — Imposta la memoria massima disponibile per una singola query nell'intero cluster. Si tratta di un limite rigido; se una query supera questa memoria, avrà esito negativo.
query.max-memory-per-node — Definisce la memoria massima che una query può consumare su ogni nodo di lavoro. L'impostazione di questa impostazione garantisce che nessuna singola query monopolizzi le risorse su alcun lavoratore.
Dimensione dell'heap JVM: configurato a livello di JVM, imposta la dimensione massima dell'heap per il processo del server Trino su ciascun nodo. Questo valore dovrebbe generalmente essere maggiore delle configurazioni relative alla memoria (si tratta della somma di query.max-memory-per-node e memory.heap-headroom-per-node) in Trino per evitare che il sistema esaurisca la memoria a livello di JVM.
memory.heap-headroom-per-node — Specifica una quantità di memoria del buffer da escludere dalla dimensione dell'heap JVM per le operazioni non relative alle query. Questo è fondamentale per garantire un sovraccarico sufficiente per le operazioni interne e la raccolta dei dati inutili.
Filtraggio dinamico
Il filtraggio dinamico in Trino è una tecnica di ottimizzazione che migliora le prestazioni delle query riducendo la quantità di dati elaborati, in particolare durante i join. Applica dinamicamente le condizioni di filtro per limitare i dati scansionati da un lato di un join, in base ai dati visualizzati sull'altro lato, il che è particolarmente utile nelle query in cui un lato del join è altamente selettivo (ovvero contiene un piccolo sottoinsieme di dati). È abilitato per impostazione predefinita su Amazon EMR. Di seguito è riportato un esempio di query:
SELECT orders.order_id, orders.total_amount FROM orders JOIN customers ON orders.customer_id = customers.customer_id WHERE customers.country = 'France';
Senza filtri dinamici, Trino analizza l'intera tabella degli ordini in un unico colpo, anche se solo un piccolo sottoinsieme di clienti (quelli francesi) è rilevante. Questo approccio legge tutte le righe della tabella degli ordini, con conseguenti costi di elaborazione elevati I/O . Con il filtro dinamico, Trino inizialmente analizza la tabella dei clienti più piccola, recupera i valori customer_id solo per i clienti francesi e quindi applica questo sottoinsieme come filtro agli ordini. Ciò significa che vengono scansionate solo le righe pertinenti degli ordini, quelle con un customer_id corrispondente al sottoinsieme filtrato, riducendo significativamente i record elaborati.
Spila su disco
In Trino, lo spilling del disco consente di trasferire i risultati delle query intermedie su disco, consentendo il completamento delle query che richiedono molta memoria, anche se superano i limiti di memoria impostati da o. query_max_memory query_max_memory_per_node Per impostazione predefinita, Trino applica questi limiti per garantire un'allocazione equa della memoria e prevenire il deadlock del cluster. Tuttavia, quando una query di grandi dimensioni supera questi limiti, rischia la chiusura. Il disk splling risolve questo problema utilizzandorevocable memory, consentendo a una query di richiedere in prestito memoria aggiuntiva che può essere revocata se sono necessarie risorse altrove. Quando la memoria viene revocata, i dati intermedi vengono trasferiti sul disco, consentendo alle query di continuare l'elaborazione senza superare i limiti di memoria. Tieni presente che una query forzata a riversarsi su disco può avere un tempo di esecuzione più lungo, quindi è disabilitata per impostazione predefinita. Per abilitare lo spill su Amazon EMR, utilizza la seguente configurazione:
spill-enabled=true— Abilita lo spelling del disco quando l'utilizzo della memoria supera le soglie disponibili.spill-paths— Definisce le directory in cui vengono archiviati i dati fuoriusciti,.spill-paths=/mnt/spill