Hive

Questo documento presenta Apache Hive: l'ambiente di data warehouse per Hadoop. Hive, oltre alle funzioni di ETL ed all'esecuzione di query con MapReduce, fornisce un linguaggio di interrogazione HiveQL che e' diventato lo standard di fatto per le interrogazioni SQL verso Hadoop.

Apache Hadoop e' un software Open Source per il distributed computing che permette la gestione quantita' enorme di dati su sistemi a basso costo. Hadoop fornisce un framework che si occupa di distribuire e replicare i dati e le elaborazioni. Questo consente di gestire le quantita' enormi di dati richieste dai Big Data.
I due componenti principali di Hadoop sono l'Hadoop Distributed File System (HDFS) e l'algoritmo di distribuzione del processing MapReduce che divide il carico elaborativo tra tutti i nodi del cluster (Map) e quindi raggruppa i risultati ottenuti (Reduce).

Hive

Hive e' un componente dell'ecosistema di Hadoop che fornisce le funzionalita' di data warehouse. In pratica gli strumenti di ETL, un linguaggio di interrogazione (HiveQL) e diverse inferfacce applicative.

Dal punto di vista tecnico Hive non definisce un proprio formato per i dati ma utilizza quello presente nello strumento di memorizzazione scelto. Hive memorizza i dati direttamente su HDFS oppure su HBase. Hive eredita da HDFS la scalabilita' ed il fault-tolerance ed e' implementato per sfruttarli al massimo.
Le tabelle sono organizzate in partizioni e queste vengono semplicemente implementate come file e directory su HDFS. Le partizioni possono essere ulteriormente suddivise in bucket. Le query vengono ogni volta compilate e tradotte in job MapReduce, Tez oppure Spark.
HCatalog, inizialmente era un tool separato, ma ora e' un componente di Hive per la gestione delle tabelle e dello storage. I metadati che contengono la definizione dell strutture di Hive sono mantenute... su un database SQL! Tipicamente su MySQL.

Hive e' ottimizzato per i caricamenti massivi e per il calcolo in parallelo. La sottomissione di un semplice script (eg. 2 INSERT) puo' durare parecchi secondi perche' i comandi vengono analizzati, viene implementato il MapReduce, ... Insomma Hive NON e' assolutamente adatto ad un OLTP ed anche l'uso interattivo risulta piuttosto lento. La latenza iniziale non e' invece un problema per le pesanti attivita' tipiche dei data warehouse per cui e' stato disegnato.

HiveQL

Il QL di Hive e' nato con una sintassi inizialmente soltanto simile a quella dell'SQL, privilegiando la scalabilita' del MapReduce di Hadoop e gli aspetti di estensibilita' con le custom scalar functions (UDF), aggregations (UDAF) e table functions (UDTF). I primi statement disponibili sono stati quelli per il caricamento dei dati (LOAD [OVERWRITE] INTO TABLE) e la SELECT. UPDATE e DELETE sono stati resi disponibili solo nelle ultime versioni!
Nel tempo pero' il linguaggio si e' evoluto avvicinandosi sempre piu' agli standard SQL (SQL-92). Il dialetto che piu' si avvicina ad HiveQL e' l'SQL di MySQL (eg. clausola USE, comando SOURCE) anche se in realta' vi sono molte differenze nei datatype, nelle funzioni disponibili, nella gestione delle transazioni, ...

Poiche' il linguaggio SQL e' noto a tutti... facciamo solo un paio di esempi di utilizzo dell'estensibilita' del linguaggio e del MapReduce:

CREATE TEMPORARY FUNCTION RenziBonus AS 'MyPkg.RenziEvalFunc'; SELECT * FROM emp E where E.sal < RenziBonus(); CREATE TABLE docs(contents STRING); FROM (MAP docs.contents USING 'MyToken' AS word, cnt FROM docs CLUSTER BY word) map_output REDUCE map_output.word, map_output.cnt USING 'MyCount' AS word, cnt;

HPL/SQL

Dalla versione 2.0 di Hive e' disponibile un'estensione procedurale all'HSQL di Hive: l'Hybrid Procedural SQL (HPL/SQL).

HPL introduce variabili, istruzioni per il controllo di flusso, funzioni, ... con una sintassi simile a quella del PL/SQL di Oracle.

In questo modo risulta molto piu' semplice introdurre una logica di Business agli script HiveSQL.
In realta' uno script HQL puo connettersi ed utilizzare (MAP) a database differenti non limitandosi ad Hadoop (via Hive), ma accedendo a database NoSQL ed a tradizionali RDBMS via JDBC.

UI

Per accedere ad Hive sono disponibili molteplici interfacce.
La prima storica e' Hive CLI che si richiama con hive. Dalla versione 0.11 e' pero' deprecata in favore delle piu' recente Beeline richiamata con beeline.

Per l'accesso dall'esterno sono disponibili driver JDBC ed ODBC.

EMP7

Non si puo' non eseguire un benchmark EMP7... eccolo:

drop table if exists emp7;

create table emp7(EMPNO int,ENAME VARCHAR(10),JOB VARCHAR(9),
	MGR int,HIREDATE DATE,SAL float,COMM float,DEPTNO int);

create index pkemp7 on table emp7(EMPNO) as 'COMPACT';

insert into emp7(empno, ename, deptno) values(7369, 'SMITH', 10);
insert into emp7(empno, ename, deptno) values(7499, 'ALLEN', 10);
insert into emp7(empno, ename, deptno) values(7521, 'WARD',  10);
insert into emp7(empno, ename, deptno) values(7566, 'JONES', 10);
insert into emp7(empno, ename, deptno) values(7654, 'MARTIN',10);
insert into emp7(empno, ename, deptno) values(7698, 'BLAKE', 10);
insert into emp7(empno, ename, deptno) values(7782, 'CLARK', 10);
insert into emp7(empno, ename, deptno) values(7788, 'SCOTT', 10);
insert into emp7(empno, ename, deptno) values(7839, 'KING',  10);
insert into emp7(empno, ename, deptno) values(7844, 'TURNER',10);
insert into emp7(empno, ename, deptno) values(7876, 'ADAMS', 10);
insert into emp7(empno, ename, deptno) values(7900, 'JAMES', 10);
insert into emp7(empno, ename, deptno) values(7902, 'FORD',  10);
insert into emp7(empno, ename, deptno) values(7934, 'MILLER',10);

select 0, from_unixtime(unix_timestamp()) Start_time
from emp7
where empno=7369
union
select count(*), from_unixtime(unix_timestamp()) End_time
  from emp7 emp1, emp7 emp2, emp7 emp3, emp7 emp4, emp7 emp5, emp7 emp6, emp7 emp_7
  where emp_7.deptno=10;

Impala

Impala e' un Engine SQL Open Source che utilizza lo stesso query language HiveSQL, sullo stesso catalogo, con le stesse estensioni, ... L'unica piccola differenza sintattica e' che Impala non fornisce le UDF.

Insomma Impala e' quasi identico ad Hive: ma allora perche' realizzare un differente progetto? Perche' Impala, a differenza di Hive, e' ottimizzato per query di breve durata!
Impala e' stato realizzato da Cloudera mentre Hortonworks ha sostenuto in modo significativo l'aggiornamento di Hive... vedremo!

Storia

Hive e' un progetto molto attivo.

Hive nasce nel 2007 in Facebook che lo sviluppa internamente per semplificare l'analisi di archivi di PB mantenuti su Hadoop. Il linguaggio sviluppato e' simile all'SQL (di MySQL) che i suoi tecnici conoscono bene. Hive introduce il concetto di tabelle, colonne e partizioni su Hadoop ed raccoglie subito un notevole successo. Nel 2008 viene pubblicato come Open Source e incubato come progetto in Apache.
Le versioni successive introducono via via funzionalita' normali per un RDBMS come: indici e HAVING (nella versione 0.7); indici bitmap (0.8); clausole CUBE, ROLLUP e l'operatore GROUPING_ID (0.10); HiveServer2, Beeline, ottimizzazioni sui Join, Optimized Row Columnar (ORC) file format (0.11); transazioni ACID, subquery, join impliciti (0.13); UPDATE, DELETE (0.14); DISTINCT (1.1); UNION DISTINCT (1.2); ...

Hive e' considerato lo standard di fatto per l'accesso SQL ad Hadoop ed e' disponibile in tutte le distribuzioni Hadoop: Cloudera, Hortonworks, MapR.
L'ultima versione Hive disponibile e' la release 2.0 [NdE 2016-02]. Questa pagina riporta le date dei principali rilasci.


Titolo: Hive
Livello: Avanzato (3/5)
Data: 24 Giugno 2012
Versione: 1.0.2 - 14 Febbraio 2016
Autore: mail [AT] meo.bogliolo.name