Benutzer-Werkzeuge

Webseiten-Werkzeuge


nosql:hive_erste_schritte

Erste Schritte mit Apache Hive

Vorrausetzung:

Hadoop installiert und gestartet, siehe Eine Hadoop 2.4 Test Umgebung installieren und konfigurieren

Überblick Hive

Hive verwendet das HDFS von Hadoop für die Ablage der DB Dateien und das MapReduce Framework zum Aufsetzen der Jobs.

Für das Data Dictionary / die Metadaten wird eine separate relationale Datenbank verwendet, die NICHT im HDFS liegt (Default ist eine Apache Derby DB). Für größere Umgebungen ist eine MySQL oder PostgreSQL / Oracle Datenbank empfohlen.

Per HiveQL Abfragesprache werden diese MapReduce Jobs gesteuert/gestartet.

Wichtiges Grundkonzept - Schema-on-Write versus Schema-on-Read

* Schema-on-Write – Traditionelles Verhalten von Relationalen Datenbanken

  • Die Daten werden bereits mit dem Insert in das existierende Schema Format abgelegt
  • Traditionelles ETL bereitet die Daten so auf (wandelt um) das die Daten auch zum DB Schema passen
  • Enthalten die Quelldaten neue Informationen muss zuvor das Schema angepasst werden (Neue Spalten etc.)

versus

* Schema-on- Read – Hadoop / Hive

  • Daten werden im Original Format im HDFS abgelegt ohne verändert zu werden
  • ETL on the fly -Nur die Daten die der User anfordert, werden beim Lesen in das gewünschte Schema Format über die Parser Angaben auf der Tabelle geparst und so dem User dann zur Verfügung gestellt
  • Neue Daten können jederzeit mit den gespeichert werden und werden dann ausgewertet, wenn der Parser angepasst wird

Übersicht:

 Hive Komponenten in der Übersicht

Neben den bekannten Tabellen Datentypen kann Hive auch komplexes Datentypen wie Record/Array/Map unterstützen

Es gibt zwei Tabellen Typen:

  • Managed Tables - Daten und Metadaten werden von Hive verwaltet
  • External Tables - Daten verbleiben im ursprünglichen Format im HDFS - in Hive werden nur die Metadaten verwaltet

Tabellen können partitioniert werden, Partitionen müssen aber beim Laden manuell angegeben werden

Ein Index auf die Daten kann erstellt werden, dazu stehen drei Index Arten zur Verfügung ( compact, bitmap und custom).

SQL Fähigkeiten in v13:

  • Select mit inner Join und left – right - full outer Join werden unterstützt
    • Die rechts stehende Tabelle ist die Treiber Tabelle, d.h. das sollte auch die kleinere Tabelle im Join sein!
  • Subselect mit Alias und korrelierte Subquieres
  • Nur nach Spalten in der Ergebnis Liste kann mit „Order By“ sortiert werden
    • order by wird über nur einen Reducer im Job implementiert - Performance beachten
  • Gruppenfunktionen mit „group by“ und „having“ möglich
  • Insert nur als Bulck Operation möglich
  • Kein eigentliches DML auf Einzel Satz Ebene
  • Java User Defined Function (UDF) können/müssen vom Anwender selbst erstellt werden

Grundinstallation des Hive

Ablauf:

Software auf dem Zielsystem bereitstellen

Im ersten Schritt wird Hive auf dem gleichen Server wie Hadoop installiert, in diesem Beispiel wird dazu der gleiche User und die gleiche Umgebung wie zuvor für Hadoop verwendet.

Software auspacken und damit installieren:

# Auspacken
tar -xf apache-hive-0.13.1-bin.tar.gz -C /opt/hadoop/product
 
 
#Link anlegen um nicht bei jeder neuen Version alles Scripte/Umgebung anpassen zu müssen
 
ln -s /opt/hadoop/product/apache-hive-0.13.1-bin /opt/hadoop/product/hive

Umgebung setzen:

vi .bashrc
 
..
#HIVE Settings
 
export HIVE_HOME=/opt/hadoop/product/hive
..
 
#Add Path
export PATH=$HIVE_HOME/bin:$PATH
 
..
 
. .bashrc

Verzeichnisse für HIVE auf dem HDFS anlegen und Rechte vergeben:

hdfs dfs -mkdir    /tmp
hdfs dfs -mkdir -p /user/hive/warehouse
 
 
#Rechte vergeben
 
hdfs dfs -chmod g+w /tmp
hdfs dfs -chmod g+w /user/hive/warehouse

Der erste Start der Hive „SQL*Plus“ Shell:

hive
 
 
# To get the running version, see the path of the library
 
hive> set system:sun.java.command;
 
system:sun.java.command=org.apache.hadoop.util.RunJar /opt/hadoop/product/hive/lib/hive-cli-0.13.1.jar org.apache.hadoop.hive.cli.CliDriver
 
hive>quit
Eigenständige Metadaten Store anlegen

An einer expliziten Datenbank anmelden

An eine nicht „default“ Datenbank anmelden:

hive --database gpidb

Anlegen einer Tabelle mit Standard SQL

Eine Tabelle in Hive ist eine Datei auf dem HDFS.

Aber ungewohnt für Oracle DBA's, beim Anlegen der Tabelle wird definiert, wie die dazu passende Daten Datei aufgebaut sein sollte (Schema on Read Konzept).

In unsere Beispiel mit ',' getrennt und NewLine als Zeilenende.

#Tabelle anlegen
hive> CREATE TABLE ora_audit_data(id BIGINT
                          , message string
                          , audit_date BIGINT
                          , instance_name string) 
COMMENT 'Oracle Audit Data.'
ROW FORMAT 
DELIMITED FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
;
 
OK
TIME taken: 1.463 seconds
 
#Was für Tabellen gibt es
hive> SHOW TABLES;
OK
ora_audit_data
TIME taken: 0.14 seconds, Fetched: 1 ROW(s)
 
#Beschreibe die Tabelle
hive> DESCRIBE ora_audit_data;
OK
id                      BIGINT
message                 string
audit_date              BIGINT
instance_name           string
TIME taken: 0.708 seconds, Fetched: 4 ROW(s)
 
 
# FOR more informatoins:
hive> DESCRIBE extended ora_audit_data;

siehe ⇒ https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

Daten in die Tabelle einlesen

Beim Testen fällt auf das zu Zeit die SQL Syntax „INSERT INTO tablename VALUES (x,y,z)“ nicht unterstützt wird!

Daten direkt aus einer Datei in die Hive Table einlesen, die zuvor auf dem HDFS abgelegt wurden:

#Lade Datei in dem Format anlegen, wie beim Anlegen der Tabelle definiert wurden
vi audit_data.csv
1,Message 1,89898998,GPI
 
#Auf HDFS kopieren
hdfs dfs -copyFromLocal audit_data.csv /tmp
 
#Einlesen mit overwrite überschreibt!
hive>load data inpath '/tmp/audit_data.csv' overwrite into table ora_audit_data;

Hinweis ⇒ Das Original Data File wird beim Laden gelöscht! Auch wenn Fehler passieren!

Oder aus einer lokalen Quelle laden, dann entfällt das Kopieren auf das HDFS, mit dem Schlüsselwort local inpath:

LOAD DATA LOCAL inpath '/opt/hadoop/external_data/audit_data.csv' INTO TABLE ora_audit_data;

Ein "insert values into" simulieren

Über eine Hilfstabelle, wie im Oracle die DUAL Tabelle, kann ein SQL so erzeugt werden, das mit den Ergebnis wiederum in die Zieltabelle geschrieben werden kann.

#Textdatei mit einer 1 als Inhalt anlegen
vi ~/dual.tab
1
 
#Table anlegen
 
CREATE TABLE dual(x TINYINT);
 
#eine 1 einfügen
 
LOAD DATA LOCAL inpath '/home/hadoop/dual.tab' overwrite INTO TABLE dual;
 
#SQL zusammenstellen für ein INSERT Kommando
 
INSERT INTO TABLE ora_audit_data
SELECT stack(1
            ,1,"TestDATA","999999","GPI"
) AS (id, message,audit_date,instance_name)
FROM dual
;
Einlesen mit einer External Table

Beim Anlegen der externen Tabelle wird das DIRECTORY angeben unter dem die Daten ausgelesen werden!

Aus einer externen Tabelle kopieren:

# Externe Tabelle anlegen
 
CREATE external TABLE ext_ora_audit_data(id            BIGINT
                                       , message       STRING
                                       , audit_date    BIGINT
                                       , instance_name STRING) 
ROW FORMAT 
DELIMITED FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
location '/data/external_ora_audit';
 
hdfs dfs -ls  /DATA
drwxr-xr-x   - hadoop supergroup          0 2014-07-13 18:35 /DATA/external_ora_audit
 
 
# Copy the DATA TO the external TABLE directory:
 
hdfs dfs -put audit_data.csv /DATA/external_ora_audit
 
# READ the DATA INTO the TABLE:
 
INSERT INTO TABLE ora_audit_data 
SELECT id, message , audit_date, instance_name 
  FROM ext_ora_audit_data 
 WHERE id IS NOT NULL;

Partitionierte Tabellen

Hive kann die Daten hinter der Tabellendefinition in eigene Dateien pro Partition auf splitten.

Die Spalte wird dann nicht mehr in der Spaltendefinition der Tabelle angeben!

Beispiel:

CREATE TABLE emp (
 empno   INT
....
)
partitioned BY (deptno INT)
;

Laden

Manuell:

INSERT INTO TABLE emp  PARTITION (deptno= 10)
SELECT empno,..... deptno FROM emp_load;

Dynamische Partitionierung:

SET hive.exec.dynamic.partition=TRUE;
SET hive.exec.dynamic.partition.mode=nonstrict;
 
 
INSERT INTO TABLE emp
SELECT empno,..... deptno FROM emp_load;

Achtung: Letzte Spalte wird für die Partitionierung verwendet, auch wenn diese NICHTS mit der gewünschten Partitionierung zu tun hat!

Abfragen

Im „hive.mapred.mode=strict“ (default) führt eine Abfrage auf eine partitionierte Tabelle zu einem Fehler, falls keine Partition bzw. die partitionierte Spalte nicht angegeben wurde.

#Partitionen anzeigen lassen
 
SHOW partitions emp;
 
 
SET hive.mapred.mode=nonstrict;
 
SELECT * FROM emp;

Indexes

Zurzeit werden die folgenden Indextypen unterstützt:

  • Compact - pro Spaltenwert wird eine Liste mit den Offsets in der Datendatei gespeichert
  • Bitmap - klassischer Bitmap Index
  • Custom - ein eigener Index Typ wird definiert

Ein Index wird angelegt und muss dann neu angelegt werden.

Ändern sich die Daten muss der Index von Hand neu angelegt werden!

Beispiel: Einen Index vom Typ „Compact“ definieren:

CREATE INDEX idx_emp_deptno ON TABLE emp (deptno)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD
IN TABLE idx_emp_deptno_tab;

Index anlegen:

ALTER INDEX idx_emp_deptno ON emp REBUILD;

Explain Plan

Anzeigen lassen wie die MapReduce Jobs ausgeführt werden würden:

EXPLAIN SELECT .....

Debugging

Schlägt etwas fehlt kann im Hive Client die Log Eigenschaften eingestellt werden:

hive -hiveconf hive.root.logger=INFO,console

Hive Remote verwenden

Ziel: Hive Abfragen von einem remote Rechner auf eine Hadoop Cluster durchführen

Lösung:

JDBC mit Hive verwenden:

Hive unter Windows 7 starten

Client:

Da Hive ein reines Client Programm ist, kann auch über Windows 7 die Abfrage gestartet werden. Zuvor muss aber auf dem Client eine komplette Hadoop Umgebung konfiguriert werden. Leider wird Hive aber unter Windows nativ nur in einer cygwin Umgebung unterstützt.

Siehe ⇒ HDFS Files remote lesen - Mit MS Windows Clients mit Hadoop arbeiten

Die Hive Software in ein Verzeichnis (D:\entwicklung\libraries\apache-hive-0.13.1-bin) entpacken.

Hive - Thrift Hive Server auf einem Hadoop cluster Knoten starten:

 hive --service hiveserver -p 10000 -v

siehe ⇒ https://cwiki.apache.org/confluence/display/Hive/HiveServer

Client:

Remote an den Hive Server anmelden (in Cygwin Bash Console!):

$ ./hive -hiveconf hive.root.logger=INFO,console -h nosqldb01 -p 10000

Alternativ siehe auch hier: ⇒ http://www.javacodegeeks.com/2012/10/apache-hive-on-windows-in-6-easy-steps.html

Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
nosql/hive_erste_schritte.txt · Zuletzt geändert: 2014/09/24 19:49 von Gunther Pippèrr