Hive le Data Warehouse de Hadoop

L’augmentation des sources de données et le volume généré rend les traitements BI classiques couteux en temps et en argent. L’émergence du stockage distribué et des traitements parallèles avec le framework Hadoop en se basant sur des serveurs standards (comodity server), valorise et donne une seconde vie aux données. Toutefois, le modèle de programmation MapReduce exige des développements bas niveau, personnalisés, qui sont difficiles à maintenir et à réutiliser.

Afin de lever ce type de complexité dans l’utilisation de Hadoop, que le projet Hive a été mis en place. Hive permet de définir une structure pour les données non structurées, ce qui simplifie le processus d’analyses et de recherches.

Hive fournit un langage déclarative HQL de plus haut niveau pour faciliter le traitement des données à grande échelle. Un langage proche du SQL, interprété en job MapReduce et exécuté sur la plateforme Hadoop.

1. Hive c’est quoi ?

Apache Hive est un entrepôt  données (Data Warehouse) open source pour Hadoop. C’est une abstraction sur Apache Hadoop, pour les familier avec SQL,  Hive fournit un langage de haut niveau  semblable a SQL, appelé HQL,  pour interagir avec un  cluster hadoop,  dans le but réaliser des analyses sur une masse importante de données.

L’accès aux données se fait via des tables structurées. Il se matérialise par la création d’un plan d’exécution de la requête HQL qui se traduit par la création et l’exécution d’un job MapReduce.

Hive aussi, il offre la possibilité,  aux familiers du modèle parallèle  MapReduce, de  pouvoir  utiliser des taches de type « mapper » et « reduce »,  dédiés aux  traitements spécifiques de données  non supportés par HQL.

hive_archi_globaleFigure 1. Vue d’ensemble de l’architecture de Hive

2. Le modèle de données de Hive

Les données en Hive sont organisées comme suit :

2.1 Tables

Une table Hive est constitué des données stockées et des métadonnées associées décrivant l’agencement des données dans la table. Les données sont stockées généralement dans HDFS, mais également peuvent l’être dans le système de fichier local ou dans un stockage objet tel S3. Les métadonnées quand à eux sont stockées dans une base de données relationnelle.

Chaque table Hive est matérialisée dans HDFS par un répertoire. Les données d’une table sont sérialisées et stockées dans des fichiers de ce répertoire. Les utilisateurs peuvent également ajouter de nouveaux formats de données en définissant des méthodes de sérialiser et désérialiser en Java.

Lorsque une table est créée dans Hive, par défaut les données sont stocké dans répertoire de l’entrepôt de données géré par Hive. Il est possible de créer des tables externe.  Dans ce cas là, les données seront stockées en dehors du répertoire de l’entrepôt de donnée et Hive ferra référence à ces derniers.

CREATE TABLE managed_table (dummy STRING); 
LOAD DATA INPATH '/user/tom/data.txt' INTO table managed_table; 

CREATE EXTERNAL TABLE external_table (dummy STRING) 
LOCATION '/user/tom/external_table'; 
LOAD DATA INPATH '/user/tom/data.txt' INTO TABLE external_table;

Généralement les tables externes sont utilisées pour accéder à un ensemble de données initialement stocké dans HDFS par un autre processus. Inversement, une table externe peut être utilisée pour exporter les données pour un processus tiers. Les tables externes peuvent être un moyen de mutualisation des données entre plusieurs schémas Hive.

2.2 Partitions et Buckets

Hive Organise les tables en partitions. Les partitions se font à base de valeur de colonne de partitionnement. Par exemple la date. L’utilisation de cette technique permet un accès plus rapide aux données (requête sur une ou des tranches de données).

Partitions
Chaque table peut avoir une ou plusieurs partitions qui déterminent la distribution des données dans des sous-répertoires du répertoire de la table.

CREATE TABLE logs (ts BIGINT, line STRING) 
PARTITIONED BY (dt STRING, country STRING);

Prenons l’exemple d’un fichier log qui contient des timestamp. Si le partitionnement se fait sur la date, dans ce cas la tout l’enregistrement de la même date sera enregistrer dans la même partition. Une partition elle même peut être partitionnée comme le montre l’exemple ci-dessous.

CREATE TABLE logs (ts BIGINT, line STRING) 
PARTITIONED BY (dt STRING, country STRING); 

LOAD DATA LOCAL INPATH 'input/hive/partitions/file1' 
INTO TABLE logs 
PARTITION (dt='2012-07-01', country='FR'); 

/user/hive/warehouse/logs 
├── dt=2012-07-01 
│   ├── country=FR 
│   │   ├── file1 
│   │   └── file2 
│   └── country=US 
│       └── file3 
├── dt=2012-07-02
│   ├── country=FR 
│   │   ├── file4
│   │   └── file5 
│   └── country=US
│       └── file6 

hive> SHOW PARTITIONS logs; 
dt=2012-07-01/country=FR 
dt=2012-07-01/country=US 
dt=2012-07-02/country=FR 
dt=2012-07-02/country=US

Buckets

Il y a deux raisons principales pour lesquelles les tables sont organisées avec des Buckets, qui sont [3]:

1. Requêtes plus efficaces : Le Bucketing impose une structure supplémentaire sur la table. La jointure de deux tables est plus efficace si la jointure se fait sur une colonne  « bucket-ée » de partie d’autre

2. Échantillonnages plus efficace : Lorsque on travaille avec un grand ensemble de données, il est très pratique de tester la requête sur une fraction de l’ensemble de données lorsque on est en phase de développement.

L’exemple ci-dessous montre comment créer une table avec Bucket où l’id est utilisé pour calculer dans quelle Bucket l’enregistrement sera enregistré.

CREATE TABLE bucketed_users (id INT, name STRING) 
CLUSTERED BY (id) INTO 4 BUCKETS;

2.3 Type de données

Hive supporte les types primitives et complexes

Type primitive

Les types primitifs corresponds au type primitifs java, un certain nombre de nom de ces types sont inspirés des noms de primitifs MySQL.

 

Hive_primitive

Type complexe

Hive support trois type complexes, qui sont :

  1. Array : même structure que dans Java
  2. Map : même structure que dans Java
  3. Struct : Une collection de types différents
CREATE TABLE complex ( 
col1 ARRAY, 
col2 MAP<STRING, INT>, 
col3 STRUCT<a:STRING, b:INT, c:DOUBLE> 
); 

Hive_complexe

2.4 Langage de requête HQL

Hive fournit un langage de requête semblable au SQL applé HiveQL. Il supporte les opération de :

  1. Selection
  2. Jointure
  3. Aggregation
  4. Union
  5. Ainsi que les sous-requêtes

HiveQL supporte le langage de définition de données (DDL) permettant ainsi la création de :

  1. Tables avec des formats de sérialisation spécifiques
  2. Partitions
  3. Buckets

Hive permet à travers le langage de manipulation de données (DML) le chargement des données dans les tables gérées par Hive. Cette manipulation par les commandes load et insert.

HiveQL est extensible, il intègre :

  1. Des scripts MapReduce écrit avec n’importe langage.
  2. Des fonctions spécifiques définits par l’utilisateur
  3. Des Types spécifiques  

Pour plus de détails sur le langage HQL consultez le manuel du langage https://cwiki.apache.org/confluence/display/Hive/LanguageManual

3. Architecture

hive_archi_01hive_archi_02

Figure 2. Architecture de Hive

Thrift Server

Thrift server est développé avec le Framework Apache Thrift. Il expose une API permettant l’exécution des commandes HQL. Les clients se connecte au serveur en utilisant le driver JDBC, ODBC ou un client Thrift.

Client

hive_clientFigure 3. Les différents type de client de Hive

 Client Thrift
Le client thrift peut être écrit en plusieurs langages (C++, Java, PHP,  Python ou Ruby). Il se connecte directement au serveur.

JDBC driver
Hive fournit un pilote JDBC, définie dans la classe org.apache.hadoop.hive.jdbc.HiveDriver. Il se configure avec jdbc:hive://host:port/dbname

La connexion au serveur se fait via un processus séparé, en faisant appelle à une interface implémentée par le client Thrift Hive.

ODBC driver
Le pilote ODBC de Hive permet aux applications qui prennent en charge le protocole ODBC de se connecter Thrift Server.

Metastore

Le Metastore est le référentiel central des métadonnées de Hive. Les métadonnées des tables et des colonnes de Hive et bien d’autre tel que les  privilèges sont stockées dans une base relationnelle.

metastore

Figure 3. Les différents type d’intégration du Metastore dans une architecture Hive

Driver

Le driver est composé de :

Compilator
Le compilateur est responsable de l’analyse sémantique de la requête d’entrée et la création d’un plan d’exécution. Le plan d’exécution est un DAG (directed acyclic graph) de phase.

Executor
Exécute le plan d’exécution créé par le compilateur de Hive.

Optimiseur
Hive dispose également d’un optimiseur qui permet l’optimisation le plan d’exécution.

4. Workflow d’une requête HQL

Le driver accepte les demande HiveQL de la part des différents clients, compile la requête est génère un plan d’exécution avec son module Compiler. Le plan se compose seulement des opérations de métadonnées en cas d’ instructions DDL, et d’opérations HDFS dans le cas d’opérations de chargement.

Le Parser transforme la requête à une arborescence qui est analysé par le sémantique analyseur.  Le générateur de plan logique convertit la requête interne en un plan logique, qui se compose d’un arbre d’opérateurs logiques. L’optimiseur effectue plusieurs passes sur le plan logique et le réécrit.

Le générateur de plan physique convertit le plan logique dans un plan physique, qui se traduit par un plan de job tâches MapReduce. Ces jobs sont exécutés par Execution Engine.

hive_mapreduce_jobFigure 4. Requête HQL avec trois job MapReduce pour l’insertion de données dans plusieurs tables 

5. Le stockage dans Hive

Le stockage dans Hive est régie par :

Format de la ligne

Le format de la ligne dicte la façon avec laquelle les champs d’une ligne sont stockés physiquement. Dans Hive, le format de la ligne est définie par un Serde (sérialiseur-désérialiseur).

Hive_SerDe

Format de fichier

Le format de fichier détermine le format des champs d’une ligne. Le format le plus simple est le format texte, mais il y a d’autres formats types binaires (orienté ligne ou orienté colonne).

Le format texte n’est pas le format idéal. Car il est inefficace et source d’erreurs à cause de problèmes de codage. Néanmoins, les fichiers texte sont parfaits pour interagir facilement avec d’autres systèmes.

6. Cas d’utilisation

hive_archi_03

Figure 5. L’implémentation de Hive chez Facebook

L’architecture de la figure 5 possède plusieurs sources de données (fichiers journaux, MySQL). Ces données sont injectées dans HDFS. Les traitements métiers se font via MapReduce et les résultats sont ensuite publié dans le serveur Oracle RAC pour la BI. Ils sont également publie dans les bases MySQL.

hadoop_architecture

7. Data analytics avec Hive

  1. Réporting
  2. Analyse Ad hoc
  3. Data Mining
  4. Détection de Spam
  5. Optimisation
  6. etc
Référence
  1. Hive : A Warehousing Solution Over a Map-Reduce Framework, Ashish Thusoo, Joydeep Sen Sarma, Namit Jain, Zheng Shao,Prasad Chakka, Suresh Anthony, Hao Liu, Pete Wyckoff, Raghotham Murthy, Facebook Data Infrastructure Team
  2. Hadoop : The Definitive Guide, Tom White, 2012 O’Reilly
  3. http://archive.cloudera.com/cdh/3/hive/language_manual/working_with_bucketed_tables.html

  4. https://cwiki.apache.org/confluence/display/Hive/LanguageManual
  5. HIVE : Data Warehousing & Analytics on Hadoop, Facebook Data Infrastructure Team
  6. Hive Evolution, A Progress Report November 2010, John Sichi (Facebook)
  7. Hive User Group Meeting August 2009
  8. Programming Hive, Edward Capriolo, Dean Wampler, and Jason Rutherglen, 2012 O’Reilly
  9. Hadoop in Practice, Alex Holmes, 2012 Manning Publications
  10. Hive : A Petabyte Scale Data Warehouse System on Hadoop, Ning Zhang, Facebook Data Infrastructure Team

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


8 − = 6

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>