Introduction
Ce laboratoire porte sur la configuration et les opérations de base de Hive. Il s’adresse aux étudiants possédant certaines bases en SQL et souhaitant comprendre l’architecture, le déploiement de base et l’utilisation de Hive.
Saisissez vous-même tout le code d’exemple présenté dans ce document ; évitez autant que possible de vous contenter de le copier-coller. Vous vous familiariserez ainsi davantage avec le code. En cas de problème, relisez attentivement la documentation ou rendez-vous sur le forum pour demander de l’aide et échanger avec les autres participants.
Introduction à 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 avec Hadoop. Voici une présentation de l’architecture et des principales fonctionnalités de Hive :
Architecture de Hive
- Composants : Hive comprend
HCatalog, qui gère les tables et le stockage, ainsi queWebHCat, qui permet d’exécuter des tâches MapReduce et des requêtes Pig, ou d’interagir avec les métadonnées de Hive via une API REST. - Fonctionnalités :
- Prise en charge des requêtes SQL pour les tâches d’entreposage de données telles que l’ETL, l’analyse des données et la création de rapports.
- Les données sont stockées dans des systèmes tels que HDFS ou HBase ; les requêtes sont exécutées par des moteurs de calcul tels que 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 permettant d’éviter les conflits de noms et d’améliorer la sécurité.
- Table : unité de données homogène utilisant le même schéma, par exemple une table
page_viewscontenant des colonnes telles que timestamp, userid et page_url. - Partition : division des données en partitions selon des clés afin d’accélérer leur récupération.
- Bucket : division 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 prend en charge les types de données primitifs et complexes. Consultez la documentation sur les types de données Hive pour plus de détails.
Hive est conçu pour les tâches d’entreposage de données plutôt que pour le traitement transactionnel en ligne (OLTP). Il privilégie la scalabilité, 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 utilisant divers formats. La compréhension de son architecture, de ses unités de données et de ses types de données est essentielle pour exploiter Hive dans le cadre de l’analyse du Big Data.
Installation et déploiement de Hive
Dans cette étape, vous examinerez 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 basculer vers l’utilisateur hadoop pour effectuer les opérations suivantes. Double-cliquez sur le terminal Xfce présent sur le bureau, puis saisissez les commandes suivantes :
su - hadoop
Astuce : le mot de passe de l’utilisateur hadoop est « hadoop ».
Utilisez ensuite la commande wget pour télécharger la dernière version stable de Hive. Dans ce laboratoire, nous avons choisi la version 2.3.3 de Hive :
sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz
Extrayez ensuite le paquet d’installation téléchargé. Saisissez la commande suivante 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 vers /opt. Sans ces privilèges, vous risquez de ne pas pouvoir écrire dans le répertoire /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 au groupe hadoop. Saisissez la commande suivante dans le terminal :
sudo chown -R hadoop:hadoop /opt/hive-2.3.3
Astuce : vous pouvez ouvrir un autre terminal pour effectuer les opérations précédentes 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 définir les variables d’environnement de Hive afin que HIVE_HOME pointe vers son répertoire d’installation.
Ouvrez d’abord le fichier .bashrc de l’utilisateur hadoop avec l’éditeur vim. Saisissez la commande suivante dans le terminal :
vim /home/hadoop/.bashrc
Ajoutez le contenu suivant à la fin du fichier. Vous devez adapter PATH à la situation réelle de l’environnement du laboratoire. L’expression $PATH permet de conserver le contenu existant. Ajoutez directement :$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 une fois la modification terminée. Utilisez ensuite la commande source pour activer les variables d’environnement précédentes.
Dans ce laboratoire, Hive est déjà préinstallé ; vous n’avez donc pas besoin d’exécuter source pour activer la variable d’environnement. Lors d’une installation réelle, cette étape doit être effectuée selon la situation.
Configuration
Dans cette étape, vous examinerez la configuration préinstallée de Hive et créerez les fichiers de configuration nécessaires aux vérifications.
Configuration du metastore
Avant d’utiliser officiellement Hive, vous devez configurer 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 le disque est défini par l’élément de configuration javax.jdo.option.ConnectionURL dans le fichier de configuration Hive conf/hive-default.xml. Par défaut, cet emplacement est ./metastore_db.
Dans ce laboratoire, nous utiliserons toutefois MySQL pour stocker les métadonnées. Vous devez donc modifier le fichier de configuration de Hive.
Créez et ouvrez avec l’éditeur vim le fichier de configuration que nous allons construire :
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 éléments de configuration 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
Définition des paramètres système de Hive
Après avoir configuré le metastore, vous devez définir les éléments de configuration internes de Hive afin d’indiquer l’emplacement de Hadoop, le chemin des fichiers de configuration internes, etc.
Commencez par utiliser la commande cp pour copier le modèle de configuration afin de pouvoir l’utiliser.
Saisissez la commande suivante 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é les éléments de configuration 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 nécessaires à Hive.
Comme les données utilisées ultérieurement seront stockées sur HDFS, vous devez démarrer HDFS à l’avance. Saisissez les commandes suivantes dans le terminal pour démarrer HDFS :
start-dfs.sh
start-yarn.sh
Saisissez jps pour afficher 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, vous devez supprimer les données Hadoop et l’initialiser avec hdfs namenode -format.
Dans ce laboratoire, Hive est déjà préinitialisé avec la base de données correspondante. Si vous souhaitez initialiser le Hive que vous venez de 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, vous devrez modifier le chemin de HIVE_HOME dans ~/.bashrc pour qu’il corresponde au chemin du Hive que vous venez d’installer, puis exécuter source. Nous vous conseillons toutefois de ne pas le faire, car les tests Hive qui suivent reposent tous sur la version préinstallée.
Lorsque le message affiché indique que l’initialisation est terminée, vous pouvez utiliser la commande hive pour accéder à son interface en ligne de commande. Saisissez la commande suivante dans le terminal :
hive
Astuce : si vous saisissez directement hive dans le shell Hive préinstallé, ajoutez le chemin absolu pour accéder au shell Hive que vous venez de configurer.
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 apprendrez à effectuer les opérations de base sur les tables Hive. Toutes les instructions Hive sont également disponibles dans son Language Manual.
Création d’une table
Commencez par récupérer des données. Les données utilisées dans cette partie du laboratoire sont principalement un fichier journal simulant un serveur NginX. Elles peuvent servir à analyser les consultations des pages d’un site web.
Ouvrez à nouveau un 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 vers 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, commencez par créer la table. Pour créer une table page_view destinée à ces données, saisissez l’instruction suivante dans la ligne de commande 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, un type approprié est attribué à chaque colonne de la table. Vous pouvez également ajouter des commentaires au niveau des colonnes et de la table. De plus, la clause PARTITIONED BY définit une colonne de partition différente des colonnes de données. La colonne de partition n’est pas stockée avec les colonnes de données. Lorsque vous spécifiez une colonne de partition de cette manière, un caractère de nouvelle ligne sert de séparateur entre les lignes.
Si les données ne respectent pas le format précédent, vous pouvez paramétrer le séparateur de champs comme dans l’exemple suivant :
L’instruction suivante est fournie uniquement à titre de démonstration et ne doit pas être saisie dans le shell 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;
Comme le séparateur de lignes est défini par le séparateur du système Hadoop et non par Hive, vous ne pouvez pas le modifier manuellement.
En général, la table dont les données de colonnes sont déterminées est stockée dans des buckets, ce qui facilite l’échantillonnage efficace de l’ensemble de données lors des requêtes. Sans bucket, même si l’échantillonnage aléatoire de la table est possible, il ne permet pas d’obtenir un échantillonnage efficace lors du parcours de toutes les données. L’exemple suivant montre comment activer le stockage en buckets pour la table page_view selon la colonne userid.
L’instruction suivante est fournie uniquement à titre de démonstration et ne doit pas être saisie dans le shell 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, la colonne userid de la table est répartie en 32 buckets à l’aide d’une fonction de hachage. 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 la colonne userid. Le tri permet également aux gestionnaires de données d’évaluer les requêtes plus efficacement grâce à de meilleures structures de données.
L’instruction suivante est fournie uniquement à titre de démonstration et ne doit pas être saisie dans le shell 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 de la table est défini par les noms et les types des champs, de manière comparable aux définitions de types dans d’autres langages de programmation. Notez que les noms des tables et des colonnes ne sont pas sensibles à la casse. IP Address of the User et l’instruction COMMENT ci-dessous indiquent que vous pouvez ajouter des commentaires au niveau des colonnes et de la table. De plus, la clause PARTITIONED BY définit des colonnes de partition différentes des colonnes de données. Comme indiqué précédemment, ces colonnes ne stockent pas réellement les données. La clause CLUSTERED BY indique quelle colonne utiliser et combien de buckets créer. La clause ROW FORMAT DELIMITED définit la manière de stocker les lignes dans une table Hive. Pour les formats délimités, cette instruction définit le séparateur de fin d’un champ, le séparateur de fin d’un élément dans une collection — tableau ou map — ainsi que le séparateur utilisé pour les clés d’une map ; les nombres sont exprimés en encodage ASCII. STORED AS SEQUENCEFILE indique que les données sont stockées sur HDFS au format binaire, plus précisément dans le type Hadoop SequenceFile. Les paramètres des clauses ROW FORMAT et STORED AS correspondent actuellement aux valeurs par défaut de Hive. C’est pourquoi nous ne les avons pas écrits explicitement dans l’instruction de création de table présentée au début.
Parcourir les tables et les partitions
Pour afficher la liste des tables existantes dans votre entrepôt, utilisez l’instruction suivante :
SHOW TABLES;
Si de nombreuses tables existent, l’instruction précédente affichera beaucoup de résultats. Vous pouvez réduire le périmètre en indiquant un préfixe. Par exemple, pour afficher les tables dont le préfixe est page, utilisez l’instruction suivante :
SHOW TABLES 'page.*';
Les règles de correspondance utilisées par cette instruction sont celles des expressions régulières ; le point (.) représente un caractère générique.
Pour afficher les partitions d’une table, utilisez l’instruction suivante. Si la table n’est pas partitionnée, aucun résultat n’est renvoyé :
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 de la table ainsi que toutes ses autres propriétés, 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 le nouveau nom existe déjà, une erreur est renvoyée. Les instructions suivantes sont uniquement des exemples ; 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;
Affichez le résultat :
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. Notez toutefois que vous devez conserver le même type de colonne et inclure un enregistrement dans 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 de nouvelles 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, conservent le schéma de l’ancienne partition de la table afin d’éviter qu’elle ne devienne une table partitionnée. Toutes les requêtes qui accèdent à ces colonnes et s’exécutent sur l’ancienne partition 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 de données est toujours une opération lourde de conséquences. La suppression d’une table est donc quelque peu particulière. L’utilisation de la commande DROP sur une table supprime implicitement tous les index créés sur cette table.
L’exemple suivant supprime une table. Ne l’exécutez pas dans ce laboratoire :
DROP TABLE new_page_view;
Chargement et interrogation des données
Dans cette étape, vous allez charger des 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 des tables externes qui pointent vers des emplacements précis dans HDFS. Dans ce cas, vous pouvez utiliser la commande put ou copy de HDFS pour copier le fichier de données vers l’emplacement indiqué, puis créer une table pointant vers cet emplacement. Cette table contiendra toutes les informations pertinentes relatives au format des lignes.
Une fois la table créée, vous pouvez convertir les données et les insérer dans une autre table Hive. Nous avons déjà téléversé le fichier log_example.csv vers HDFS et l’avons renommé en page_view. Pour le charger dans la partition correspondante de la table page_view, utilisez la commande suivante.
Créez d’abord une table externe et associez-la 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 de démonstration ne nécessite pas de tâche YARN distribuée. Configurez le lanceur de tâches local de Hadoop pour cette session Hive afin que l’insertion s’exécute correctement dans la machine virtuelle du laboratoire :
SET mapreduce.framework.name=local;
Insérez enfin 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 l’insertion des données, vous pouvez effectuer une requête simple. Elle ressemble à une instruction SQL courante. 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 interrogé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 quitterez Hive et arrêterez les services Hadoop après avoir consulté les ressources suivantes pour poursuivre votre apprentissage :
Lorsque vous avez terminé, utilisez la commande quit pour quitter l’interface en ligne de commande de Hive :
quit;
N’oubliez pas non plus d’arrêter le service HDFS. Saisissez la commande suivante dans le terminal :
stop-yarn.sh
stop-dfs.sh
Résumé
Cette session présente l’architecture, l’installation et le déploiement de Hive, ainsi que les instructions HQL de base. Nous avons également appris à importer des données à l’aide du jeu de données d’exemple.
Les principaux points abordés sont les suivants :
- Architecture de Hive
- Unités de données de base de Hive
- Déploiement de Hive
- Langage HQL de Hive
De manière générale, les fonctions de Hive, en tant que progiciel d’entreposage de données, méritent d’être étudiées plus en détail. Prenez l’habitude de consulter régulièrement les documents techniques et poursuivez votre apprentissage avec les cours suivants.



