L'analisi di dati in ogni ambito richiede particolari accortezze per quanto riguarda le prestazioni. Così è nell'esecuzione di query e stored procedure in
database relazionali e, a maggior ragione, lo è in ambito Big Data, dove le quantità di dati da trattare sono ingenti. In questa lezione, vedremo in che modo
Hive possa ottenere il massimo delle performance.
Premettiamo che non tutte le indicazioni che seguono possono essere applicate dal programmatore, in quanto alcune riguardano l'installazione del framework
(spesso messo a disposizione in Cloud) o consistono in scelte progettuali assunte da chi coordina il progetto. Le suddividiamo pertanto in tre categorie:
- installazione e configurazione;
- organizzazione dei dati;
- esecuzione di query.
Installazione e configurazione
Le prestazioni di Hive sono fortemente condizionate dallo stack su cui la sua istanza poggia. Originariamente, nasce per lavorare a stretto contatto con
Hadoop utilizzando MapReduce come motore di elaborazione. Successivamente (dopo l'introduzione di YARN in Hadoop 2.0) sono sorte una serie di alternative a
questo framework di data processing. Ad esempio, Hive ha sviluppato una forte sintonia con Apache Spark, rientrando nell'ambito del progetto SparkSQL. Inoltre si è affermato nel tempo
il framework Apache Tez, che si è rivelato un "motore" molto più efficiente per l'esecuzione di task Hive
grazie alla sua struttura a grafo. Questo è uno degli aspetti che riguarda raramente il programmatore, in quanto egli trova già una piattaforma a disposizione
su cui programmare.
Nell'impiego di MapReduce, si è comunque riusciti ad avere migliori prestazioni introducendo algoritmi di compressione che, a fronte di un determinato costo in
esecuzione, permettono di avere minori quantità di dati da movimentare. Il tutto può essere applicato a livello di configurazione impostando a true
alcune
proprietà:
set mapred.compress.map.output = true;
set mapred.output.compress= true;
Anche in questo caso si tratta di impostazioni che può adottare solo chi amministra la piattaforma e non il programmatore in sé.
Organizzazione dei dati
Qualcosa che il programmatore può determinare, anche se non sempre, è il formato di file
da utilizzare. Ne abbiamo visti diversi in questa guida e sappiamo che oltre a CSV, JSON e XML ne esistono diversi nati appositamente per i Big Data. Tra questi il
formato ORC (Optimazed Row Columnar) è molto adatto alle elaborazioni Hive non solo perché riduce le dimensioni dei file, ma anche perché è in grado di
ottimizzare l'accesso ai dati. La scelta di un più opportuno formato può comportare una evidente accelerazione delle prestazioni. Pertanto, qualora si avessero a
disposizione dati su file in formati vari, sarebbe una buona scelta premettere alle elaborazioni una fase di adattamento dei dati disponibili in un unico formato,
identico per tutti i file, da scegliere tra quelli ideati appositamente per Big Data come ORC o, in alternativa, il formato Parquet.
Altro aspetto chiave è l'organizzazione delle tabelle in partizioni. È un aspetto che riduce drasticamente la quantità di record
su cui la query deve lavorare. Mediante le partizioni, i dati verranno distribuiti su più file, e quindi una query potrà agire solo sulle singole partizioni che
contengono i dati che la interessano. Il vantaggio è notevole considerando che l'alternativa è quella di mobilitare l'intera quantità di dati riferita a una
tabella per poi, in un secondo momento, non considerarne una buona parte usando delle selezioni. Affinché si possa trarre vantaggio dalle partizioni è necessario che esse
siano calibrate sui campi maggiormente soggetti a filtri, che in tal modo verrebbero risparmiati alle query.
Esecuzione di query
In Hive sono stati introdotti anche gli indici, concetto già tipico dei database relazionali. È bene però sapere che gli indici in Hive non sono più
supportati dalla versione 3.0. Li citiamo per completezza e perché fanno comunque parte del
passato della piattaforma, essendo quindi ancora oggi impiegati in progetti meno recenti.
In generale, lo scopo degli indici è quello di creare una struttura di riferimenti per una migliore manipolazione dei dati contenuti nelle tabelle.
Possono essere creati con CREATE INDEX
specificando colonna e tabella di osservazione. Nel seguente esempio viene creato l'indice my_index
legato alla colonna c1
della tabella my_table
:
CREATE INDEX my_index ON TABLE my_table (c1)
Gli indici possono essere modificati con ALTER INDEX
e rimossi con DROP INDEX
.
Uno dei motivi principali della loro abolizione in Hive consiste nella presenza di valide alternative, in primis l'uso di partizioni e file in formato
ORC già citati.