Premiers pas avec Hive

MySQLBeginner
Pratiquer maintenant

Introduction

Ce lab porte sur la configuration et les opérations de base de Hive. Il s’adresse aux apprenants qui possèdent des bases en SQL et souhaitent comprendre l’architecture, le déploiement élémentaire et l’utilisation de Hive.

Saisissez vous-même tous les exemples de code du document au lieu de les copier-coller, dans la mesure du possible. Vous vous familiariserez ainsi davantage avec le code. En cas de difficulté, relisez attentivement la documentation ou demandez de l’aide et échangez sur le forum.

Présentation de Hive

Dans cette étape, vous découvrirez comment Apache Hive fournit une interface SQL pour interroger et analyser de grands ensembles de données stockés dans Hadoop. Voici un aperçu de l’architecture et des principales caractéristiques de Hive :

Architecture de Hive

  • Composants : Hive comprend HCatalog, qui gère les tables et le stockage, et WebHCat, qui permet de lancer des tâches MapReduce, d’exécuter des requêtes Pig ou d’interagir avec les métadonnées de Hive via une API REST.
  • Fonctions :
    • Prise en charge des requêtes SQL pour les tâches d’entreposage de données, comme l’ETL, l’analyse de données et la génération de rapports.
    • Stockage des données dans des systèmes comme HDFS ou HBase ; exécution des requêtes par des moteurs de calcul comme Tez, Spark ou MapReduce.
    • Prise en charge des langages procéduraux, de HPL-SQL et de la récupération par sous-requêtes, avec la prise en charge de Hive LLAP, YARN et Slider.

Unités de données de base dans Hive

  • Base de données : espace de noms qui évite les conflits de noms et renforce la sécurité.
  • Table : ensemble homogène de données suivant le même schéma (par exemple, une table page_views contenant des colonnes comme timestamp, userid et page_url).
  • Partition : subdivision des données en partitions selon des clés, afin d’accélérer leur récupération.
  • Bucket : subdivision des données partitionnées en buckets selon les valeurs d’une fonction de hachage, afin d’améliorer l’efficacité des requêtes.

Types de données Hive

Hive est conçu pour l’entreposage de données, et non pour le traitement des transactions en ligne (OLTP). Il privilégie l’évolutivité, les performances, la fiabilité et la tolérance aux pannes. Il prend en charge différents formats d’entrée et peut être étendu à l’aide de connecteurs pour divers formats. Comprendre l’architecture, les unités de données et les types de données de Hive est essentiel pour exploiter ses capacités d’analyse des mégadonnées.

Installation et déploiement de Hive

Dans cette étape, vous allez examiner l’installation et le déploiement de Hive, notamment l’organisation de ses répertoires, les variables d’environnement, le metastore et les paramètres système.

Commencez par passer à l’utilisateur hadoop pour effectuer les opérations suivantes. Sur le bureau, double-cliquez sur le terminal Xfce, puis saisissez cette commande :

su - hadoop

Conseil : le mot de passe de l’utilisateur hadoop est hadoop.

Utilisez ensuite la commande wget pour télécharger la version stable de Hive choisie pour ce lab, la version 2.3.3 :

sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz

Extrayez ensuite l’archive d’installation téléchargée. Saisissez cette commande dans le terminal :

tar -zxvf apache-hive-2.3.3-bin.tar.gz

Utilisez les privilèges sudo pour déplacer le répertoire extrait dans /opt. Sans ces privilèges, vous risquez de ne pas pouvoir écrire dans /opt :

sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3

Après avoir déplacé le répertoire, attribuez-le à l’utilisateur hadoop et à son groupe. Saisissez cette commande dans le terminal :

sudo chown -R hadoop:hadoop /opt/hive-2.3.3

Conseil : vous pouvez ouvrir un autre terminal pour effectuer les opérations ci-dessus avec les privilèges sudo.

labex:~/ $ ls -al /opt/
total 24
drwxrwxr-x 10 hadoop hadoop 4096 Mar 3 12:01 hive-2.3.3
...

Configuration des variables d’environnement

Dans cette étape, vous allez configurer les variables d’environnement de Hive afin que HIVE_HOME pointe vers son répertoire d’installation.

Commencez par ouvrir le fichier .bashrc de l’utilisateur hadoop avec l’éditeur vim. Saisissez cette commande dans le terminal :

vim /home/hadoop/.bashrc

Ajoutez le contenu suivant à la fin du fichier. Adaptez la valeur de PATH à l’environnement de ce lab. L’expression $PATH permet de conserver les éléments déjà présents. Ajoutez simplement :$HIVE_HOME/bin à la fin de la variable d’environnement PATH :

export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin

Enregistrez le fichier et quittez l’éditeur. Utilisez ensuite la commande source pour activer les variables d’environnement ci-dessus.

Dans ce lab, Hive est déjà installé. Vous n’avez donc pas besoin d’activer la variable d’environnement avec source. Lors d’une installation réelle, cette étape dépend du contexte.

Configuration

Dans cette étape, vous allez examiner la configuration Hive préinstallée et créer les fichiers de configuration nécessaires aux vérifications.

Configuration du metastore

Avant d’utiliser Hive, configurez son magasin de métadonnées. Par défaut, Hive stocke les métadonnées dans une base de données Derby intégrée. L’emplacement de stockage sur disque est déterminé par le paramètre javax.jdo.option.ConnectionURL du fichier de configuration Hive conf/hive-default.xml. Par défaut, cet emplacement est ./metastore_db.

Dans ce lab, nous utiliserons MySQL pour stocker les métadonnées. Vous devez donc modifier le fichier de configuration Hive.

Créez et ouvrez avec l’éditeur vim le fichier de configuration suivant :

vim /opt/hive-2.3.3/conf/hive-site.xml
<configuration>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive_metastore1?createDatabaseIfNotExist=true</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser1</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123qweQWE...</value>
</property>
</configuration>

Après avoir modifié les paramètres ci-dessus, enregistrez le fichier et quittez l’éditeur.

Création de la base de données MySQL

Démarrez le serveur MySQL avec sudo mysql, puis créez la base de données hive_metastore :

CREATE DATABASE hive_metastore1;
CREATE USER 'hiveuser1'@'localhost' IDENTIFIED BY '123qweQWE...';
GRANT ALL PRIVILEGES ON hive_metastore1.* TO 'hiveuser1'@'localhost';
FLUSH PRIVILEGES;
exit;

Téléchargez ensuite le pilote JDBC MySQL et copiez-le dans le répertoire /opt/hive-2.3.3/lib :

cp /usr/local/hive/lib/mysql-connector-j-8.3.0.jar /opt/hive-2.3.3/lib

Configuration des paramètres système de Hive

Après avoir configuré le metastore, définissez les paramètres internes de Hive, notamment le chemin d’accès à Hadoop et le chemin du fichier de configuration interne.

Commencez par utiliser la commande cp pour copier le modèle de configuration afin de pouvoir le modifier :

Saisissez cette commande dans le terminal :

cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh

Ouvrez ensuite le fichier hive-env.sh avec l’éditeur vim :

vim /opt/hive-2.3.3/conf/hive-env.sh

À la ligne 48, définissez HADOOP_HOME sur le chemin d’installation de Hadoop :

HADOOP_HOME=/home/hadoop/hadoop

Après avoir modifié le paramètre ci-dessus, enregistrez le fichier et quittez l’éditeur.

Initialisation du metastore

Dans cette étape, vous allez initialiser le metastore de Hive et démarrer les services Hadoop dont Hive a besoin.

Comme les données utilisées par la suite seront stockées dans HDFS, démarrez HDFS au préalable. Saisissez les commandes suivantes dans le terminal :

start-dfs.sh
start-yarn.sh

Saisissez ensuite jps pour vérifier l’état des services :

hadoop:~/ $ jps                                                      [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode

Si vous utilisez Hadoop pour la première fois, supprimez les données Hadoop et initialisez-les avec hdfs namenode -format.

Dans ce lab, nous avons initialisé Hive préinstallé avec la base de données ci-dessus. Pour initialiser Hive si vous venez de le télécharger, utilisez la commande suivante :

/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed

Si vous initialisez pour la première fois le Hive que vous venez de télécharger, modifiez le chemin de HIVE_HOME dans ~/.bashrc pour qu’il pointe vers le répertoire d’installation de ce Hive, puis exécutez source. Nous vous déconseillons toutefois de le faire, car les vérifications Hive qui suivent s’appuient toutes sur la version préinstallée.

Lorsque le message indique que l’initialisation est terminée, vous pouvez accéder à l’interface en ligne de commande de Hive avec la commande hive. Saisissez cette commande dans le terminal :

hive

Conseil : si vous saisissez directement hive, vous accédez à l’interface de la version préinstallée. Pour lancer l’interface Hive que vous venez de configurer, indiquez son chemin absolu.

Hive Session ID = 3eee2693-175d-4452-82d2-47f1b639d9d5

Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 68d0d345-92c3-4eb1-8393-7ee34f56363f
hive>

Opérations de base dans Hive

Dans cette étape, vous allez découvrir les opérations de base sur les tables Hive. Vous trouverez également toutes les instructions Hive dans son manuel de référence.

Création d’une table

Commencez par récupérer des données. Dans cette partie du lab, nous utiliserons un fichier journal simulant les journaux d’un serveur NginX, qui permettra d’analyser les pages consultées sur un site Web.

Ouvrez un nouveau terminal et saisissez les commandes suivantes pour télécharger les données d’exemple :

su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv

Téléversez ensuite le fichier dans HDFS :

hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view

Une fois les données disponibles, créez une table. Pour créer une table page_view correspondant aux données ci-dessus, saisissez l’instruction suivante dans l’interface en ligne de commande de Hive :

CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

Dans cet exemple, chaque colonne de la table reçoit un type adapté. Vous pouvez aussi ajouter des commentaires au niveau des colonnes et de la table. De plus, la clause PARTITIONED BY définit des colonnes de partition distinctes des colonnes de données. Les colonnes de partition ne sont pas stockées avec les colonnes de données. Lorsque vous définissez une colonne de partition de cette manière, le séparateur de lignes est un caractère de nouvelle ligne.

Si les données ne sont pas dans le format ci-dessus, vous pouvez préciser le séparateur de champs, comme dans l’exemple suivant :

L’instruction suivante est fournie à titre d’exemple uniquement. Ne la saisissez pas dans l’interface hive.

CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;

Le séparateur de lignes étant déterminé par le séparateur défini dans le système Hadoop, et non par Hive, vous ne pouvez pas le modifier manuellement.

En général, les tables dont les données sont organisées en colonnes sont stockées dans des buckets, ce qui facilite l’échantillonnage efficace des données lors des requêtes. Sans buckets, même si l’échantillonnage aléatoire de la table est possible, il n’est pas efficace pendant le parcours de l’ensemble des données. L’exemple suivant montre comment activer le stockage en buckets pour la colonne userid de la table page_view.

L’instruction suivante est fournie à titre d’exemple uniquement. Ne la saisissez pas dans l’interface hive.

CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

Dans l’exemple ci-dessus, une fonction de hachage répartit les valeurs de la colonne userid entre 32 buckets. Dans chaque bucket, les données sont triées par ordre croissant de viewTime. Cette organisation permet d’échantillonner efficacement les colonnes regroupées, ici userid. Le tri aide également les responsables des données à évaluer les requêtes plus efficacement grâce à des structures de données mieux adaptées.

L’instruction suivante est fournie à titre d’exemple uniquement. Ne la saisissez pas dans l’interface hive.

CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

Dans l’exemple ci-dessus, le format de chaque ligne est défini par les noms et les types des champs, comme dans les définitions de types d’autres langages de programmation. Notez que les noms des tables et des colonnes ne sont pas sensibles à la casse. Le commentaire IP Address of the User et la clause COMMENT qui suit montrent que vous pouvez ajouter des commentaires aux colonnes comme aux tables. De plus, la clause PARTITIONED BY définit des colonnes de partition distinctes des colonnes de données. Comme indiqué précédemment, ces colonnes ne stockent pas les données elles-mêmes. La clause CLUSTERED BY définit la colonne utilisée pour créer les buckets et leur nombre. La clause ROW FORMAT DELIMITED indique comment stocker les lignes dans une table Hive. Pour les formats délimités, cette clause définit le séparateur des champs, celui des éléments d’une collection (tableau ou map) et celui des clés d’une map ; les nombres correspondent à des valeurs encodées en ASCII. STORED AS SEQUENCEFILE indique que les données sont stockées en format binaire dans HDFS, plus précisément au format Hadoop SequenceFile. Les paramètres des clauses ROW FORMAT et STORED AS correspondent aux valeurs par défaut utilisées par Hive. C’est pourquoi nous ne les avons pas indiqués explicitement dans la première instruction de création de table.

Parcourir les tables et les partitions

Pour afficher la liste des tables existantes dans votre entrepôt, utilisez l’instruction suivante :

SHOW TABLES;

Si la liste contient beaucoup de tables, cette instruction renvoie de nombreuses lignes. Vous pouvez la filtrer en indiquant un préfixe. Par exemple, pour afficher les tables dont le nom commence par page, utilisez l’instruction suivante :

SHOW TABLES 'page.*';

Les règles de correspondance de cette instruction suivent la syntaxe des expressions régulières, où le point (.) sert de caractère générique.

Pour afficher les partitions d’une table, utilisez l’instruction suivante. Si la table n’est pas partitionnée, aucune information ne sera renvoyée :

SHOW PARTITIONS page_view;

Pour afficher les colonnes d’une table et leurs types, utilisez l’instruction DESCRIBE :

DESCRIBE page_view;

Pour afficher les colonnes et toutes les autres propriétés de la table, ajoutez le mot-clé EXTENDED. Cette commande affiche beaucoup d’informations et sert généralement au débogage :

DESCRIBE EXTENDED page_view;

Modification d’une table

Pour renommer une table existante, utilisez l’instruction ALTER TABLE avec RENAME TO. Si une table portant déjà le nouveau nom existe, une erreur est renvoyée. Les instructions suivantes sont fournies à titre d’exemple : ne les exécutez pas, car l’étape suivante utilise la table page_view que vous avez créée :

ALTER TABLE page_view RENAME TO new_page_view;

Voici le résultat obtenu :

hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)

Vous pouvez également renommer les colonnes d’une table existante. Veillez toutefois à utiliser le même type de colonne et à inclure un enregistrement pour chacune des colonnes existantes :

ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');

Vous pouvez aussi ajouter des colonnes à une table existante :

ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');

Notez que les modifications du schéma, comme l’ajout d’une colonne, préservent le schéma des anciennes partitions de la table afin qu’elles ne deviennent pas partitionnées. Les requêtes qui accèdent à ces colonnes dans les anciennes partitions renvoient implicitement des valeurs nulles ou les valeurs par défaut spécifiées pour ces colonnes.

Suppression de tables et de partitions

Hive étant conçu comme un entrepôt de données, la suppression des données est une opération à éviter. La suppression d’une table est donc un peu particulière. La commande DROP supprime implicitement tous les index créés sur cette table.

L’exemple suivant supprime une table. Ne l’exécutez pas dans ce lab :

DROP TABLE new_page_view;

Chargement et interrogation des données

Dans cette étape, vous allez charger les données préparées dans une table Hive partitionnée, puis interroger le résultat.

Chargement des données

Il existe plusieurs façons de charger des données dans une table Hive. Vous pouvez créer une table externe qui pointe vers un emplacement précis dans HDFS. Dans ce cas, utilisez la commande HDFS put ou copy pour copier le fichier de données à l’emplacement voulu, puis créez une table qui pointe vers cet emplacement. Cette table contiendra toutes les informations pertinentes sur le format des lignes.

Une fois la table créée, vous pouvez transformer les données et les insérer dans une autre table Hive. Nous avons téléversé le fichier log_example.csv dans HDFS au début de l’exercice et l’avons renommé en page_view. Pour charger les données dans la partition correspondante de la table page_view, procédez comme suit.

Commencez par créer une table externe associée au fichier indiqué :

CREATE EXTERNAL TABLE page_view_stg(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User',
                Country STRING COMMENT 'country of origin')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '\n' STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';

Créez ensuite une table page_view destinée au stockage final des données :

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

Ce petit jeu de données d’exercice ne nécessite pas de tâche YARN distribuée. Configurez le moteur d’exécution local de Hadoop pour cette session Hive afin que l’insertion s’exécute de manière fiable dans la machine virtuelle du lab :

SET mapreduce.framework.name=local;

Enfin, insérez les données de la table externe dans la table page_view :

FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view
PARTITION(dt='2015-05-17', country='us')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, pvs.ip
WHERE pvs.country = 'us';

La tâche locale devrait se terminer en quelques secondes et charger les lignes correspondantes dans la partition page_view.

...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: ... HDFS Write: ... SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: ... seconds

Requête simple

Après avoir inséré les données, vous pouvez exécuter une requête simple, similaire à une instruction SQL classique. Saisissez l’instruction suivante dans l’interface en ligne de commande de Hive :

SELECT * FROM page_view WHERE userid = 0 LIMIT 10;

Les informations renvoyées correspondent aux enregistrements trouvés :

hive> select * from page_view;
OK
NULL 490 /downloads/product_1 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 490 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 3316 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
...

Arrêt des services

Dans cette étape, vous allez quitter Hive et arrêter les services Hadoop. Pour approfondir, consultez les ressources suivantes :

Lorsque vous avez terminé, quittez l’interface en ligne de commande de Hive avec la commande quit :

quit;

N’oubliez pas d’arrêter les services HDFS et YARN. Saisissez les commandes suivantes dans le terminal :

stop-yarn.sh
stop-dfs.sh

Récapitulatif

Cette séance présente l’architecture, l’installation et le déploiement de Hive, ainsi que les instructions HQL de base. Vous avez également appris à importer des données à l’aide du jeu de données d’exemple.

Les principaux points abordés sont :

  • L’architecture de Hive
  • Les unités de données de base de Hive
  • Le déploiement de Hive
  • Le langage HQL de Hive

En tant que solution d’entreposage de données, Hive offre des fonctions qu’il reste à explorer. Prenez l’habitude de consulter activement les ressources techniques et poursuivez votre apprentissage avec les cours suivants.