Vous êtes sur la page 1sur 11

Big Data Analytics 4ERP-BI / 4DS

Workshop Apache Sqoop

I- Objectifs
Ce workshop permet d’exploiter les différents outils de Big data (Hive, MySQL, Sqoop,
HDFS, Avro) pour importer les données d’une base de données relationnelle MySQL et d’un
fichier log vers HDFS avec CDH (Cloudera Distribution Including Apache Hadoop) et les
manipuler sous HIVE.

II- Introduction
La figure ci-dessous décrit l’extraction et le chargement des données dans HDFS. Les
données structurées sont importées depuis les sources transactionnelles, et certaines tables
dimensions peuvent être récupérées depuis le datawarehouse existant. Les données non
structurées sont aussi importées dans leur état brut.

Dans ce qui suit, on va se focaliser sur l’importation des données à partir de la base de
données relationnelle MySQL vers HDFS et manipulation des données dans HIVE.

1
Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

III- Contexte des scénarios


Dans les scénarios de ce workshop, on se focalise sur les données relatives à l’entreprise
DataCo. Le schéma relationnel de la base de données correspondante est présenté à travers la
figure ci-dessous.

Pour analyser ces données, nous avons besoin de les migrer dans le système Hadoop
Distributed File System (HDFS). Pour cette raison, nous avons besoin de trouver un outil qui
permet de transférer facilement des données structurées à partir d'un SGBDR à HDFS, tout en
préservant leur structure. Cela nous permet d'interroger les données sur HDFS sans affecter
les données du SGBDR. Cet outil est Apache Sqoop, qui fait partie du CDH. Il permet de
charger automatiquement nos données relationnelles de MySQL en HDFS, tout en préservant
la structure.

Les données sur HDFS peuvent être stockées sous une forme binaire ou une forme textuelle,
nous visons exploiter le type de fichier Avro qui représente un format de fichier optimisé dans
Hadoop.

2
Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

IV- Installation MySQL pour CDH 4.7

Pour pouvoir importer les données, on commence par installer MySQL dans Cloudera 4.7.
Pour ce faire, on doit exécuter les instructions suivantes :

sudo sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo

sudo yum install mysql-server

sudo service mysqld start

Une fois, le service mysql démarré, on se connecte à mysql et on importe la base de données à

mysql -u root -p

mysql> create database retail_db;

mysql> use retail_db;

mysql> source retail_db.sql

mysql> show tables;

partir du fichier retail_db.sql.

V- Scénario 1 : Importation de la base de données retail_db de MYSQL dans


HIVE sans métadonnées

Dans ce scénario, on se propose d’importer la totalité des la base de données retail_db dans
HIVE. Il faut suivre les étapes suivantes :

1. On crée la base de données h_retail_db

hive> create database h_retail_db;

2. Vérification de la création du dossier correspondant sous HDFS (h_retail_db.db)


Hadoop fs -ls /user/hive/warehouse

3. Pour importer la base de données retail_db, on exécute le script suivant (dans un


nouveau terminal :

sqoop import-all-tables --connect jdbc:mysql://localhost:3306/retail_db --username=root --warehouse-


3
dir=/user/hive/warehouse/h_retail_db.db --m=1 Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

En fonction du volume des données à importer, cette commande peut prendre un peu de temps
pour se terminer. Elle lance des opérations (jobs) MapReduce pour transférer les données de
la base de données MySQL vers HDFS.

4. Vérification de l'importation des fichiers dans h_retail_db.db

hadoop fs -ls /user/hive/warehouse/h_retail_db.db

hadoop fs -ls /user/hive/warehouse/h_retail_db.db/departments

5. Maintenant, on doit importer les tables dans HIVE. Donc on doit créer les tables
correspondantes :
Create external table h_departments(department_id int, department_name string)

row format delimited fields terminated by ','

Location '/user/hive/warehouse/h_retail_db.db/departments';

select * from h_departments;

VI- Scénario 2 : Importation de la base de données retail_db de MYSQL dans


HIVE avec métadonnées (AVRO files)
1. Importation des données dans HDFS

sqoop import-all-tables \

-m 1 \

--connect jdbc:mysql://localhost:3306/retail_db \

--username=root \

--compression-codec=snappy \

--as-avrodatafile \

--warehouse-dir=/user/hive/warehouse

hadoop fs -ls /user/hive/warehouse

2. Vérification de l'importation des données

3. Visualisation des fichiers avro correspondants à la table departments

4
hadoop fs -ls /user/hive/warehouse/departments Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

4. Visualisation des métadonnées (Le schéma Avro)


Sqoop a migré les donnes relationnelles vers un format binaire (Avro) tout en gardant leurs
structure dans un fichier de schéma d’extension « .avsc » (Avro schéma). Ce fichier se trouve
dans un répertoire local (centos). Pour lister les fichiers de schéma Avro (les fichiers
d'extension avsc), exécutez cette commande :

ls -l *.avsc

On peut visualiser le contenu du fichiers departments.avsc. Il contient le schéma relationnel


de la table departments. De ce fait, l’importation des tables sous le format Avro permet de
faciliter leurs importations dans Hive.

5. Importation des schémas des tables (fichiers .avsc )du local vers HDFS

Il est à noter que le schéma et les données sont stockés dans des fichiers séparés (.avro et
.avsc). Le schéma est appliqué uniquement lorsque les données sont interrogées en se basant
sur une technique appelée 'schema-on-read'.

Cela donne la souplesse nécessaire pour interroger les données avec SQL même si elles sont
dans un format Avro. Tandis que, si on manipule une base de données traditionnelle, il est
obligatoire de définir le schéma avant de gérer des données.

A ce niveau, nous avons importé une grande quantité de données (de SGBD vers HDFS) sans
préciser comment les interroger en utilisant leurs structures.

Les schémas Avro ont été générés dans le système local contrairement aux données qui sont
générées sous HDFS.

Pour interroger ces données avec Apache Hive, nous devons copier les fichiers d’extension
(.avsc) dans HDFS de cette manière :

hadoop fs -mkdir /user/cloudera/Retail_db_Schema

hadoop fs -put *.avsc /user/cloudera/Retail_db_Schema

5
Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

Après avoir importé les données et leur schéma dans HDFS, nous passons maintenant à
l’interrogation en utilisant Apache Hive.

6. Création des tables et importation des données sous Hive

Puisqu’on utilise la version CDH 4.7, et avant de créer les tables sous Hive, il faut apporter
quelques modifications sur les fichiers .avsc contenant les schémas. Ci-dessous est un
exemple du fichier departments.avsc.

Donc, on utilise l’interface graphique Hue pour apporter les modifications nécessaires. On
supprime les champs non indispensables. Il faut parcourir tous les fichiers .avsc et supprimer
les champs "doc", "columnName", "sqlType" et "tableName". (NB : N’oubliez pas de
supprimer les virgules supplémentaires entre les champs).

Pour créer des tables à partir des fichiers Avro nous devons exécuter ces requêtes de création
des tables comme suit :

a- Création de la table externe externe « Categories »

CREATE EXTERNAL TABLE categ

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'

STORED AS
6
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' Esprit 2019-2020

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
Big Data Analytics 4ERP-BI / 4DS

b- Création de la table externe « Customers »

CREATE EXTERNAL TABLE cust

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'

STORED AS

INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'

LOCATION '/user/hive/warehouse/customers'

TBLPROPERTIES ('avro.schema.url'= 'hdfs:///user/cloudera/Retail_db_Schema/customers.avsc');

Select * from cust;

c- Création de la table externe « Departments »

CREATE EXTERNAL TABLE depts

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'

STORED AS

INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'

LOCATION '/user/hive/warehouse/departments'

TBLPROPERTIES ('avro.schema.url'= 'hdfs:///user/cloudera/Retail_db_Schema/departments.avsc');

Select * from depts;

d- Création de la table externe « Order_items »

CREATE EXTERNAL TABLE ord_item

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'

STORED AS

INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'

LOCATION '/user/hive/warehouse/order_items'

TBLPROPERTIES ('avro.schema.url'= 'hdfs:///user/cloudera/Retail_db_Schema/order_items.avsc');


7
Esprit 2019-2020
Select * from ord_item;
Big Data Analytics 4ERP-BI / 4DS

e- Création de la table externe « Orders »

CREATE EXTERNAL TABLE Ord

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'

STORED AS

INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'

LOCATION '/user/hive/warehouse/Orders'

TBLPROPERTIES ('avro.schema.url'= 'hdfs:///user/cloudera/Retail_db_Schema/orders.avsc');

Select * from Ord;

f- Création de la table externe « Products »

CREATE EXTERNAL TABLE prod

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'

STORED AS

INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'

LOCATION '/user/hive/warehouse/products'

TBLPROPERTIES ('avro.schema.url'= 'hdfs:///user/cloudera/Retail_db_Schema/products.avsc');

Select * from prod;

VII. Scénario 3 : Importations des données à travers une sous interrogation directement
sous Hive

Dans ce scénario, on se propose d’importer quelques lignes de la table « catégories » de la


base de données MySQL directement dans Hive.

8
Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

Pour ce faire, il faut tout d’abord vérifier que le dossier « /user/cloudera » ne contient pas un
dossier « categories ». Dans le cas contraire, il faut le supprimer (Sqoop importe la copie de la
table dans un dossier portant le nom de la table dans « /user/cloudera » puis la transfère à
« hive/warehouse »).

La commande suivante permet de supprimer le dossier « catégorie ».

hadoop fs -rm -r /user/cloudera/categories

Maintenant, on exécute la commande suivante pour importer quelques lignes de la table


sqoop import --connect jdbc:mysql://localhost:3306/retail_db --username=root --hive-import
--table=categories --where "category_id between 1 and 22" --m=1

catégories.

Pour vérifier, on doit interroger la table catégories sous Hive.

VII. Corrélation des données structurées avec des données non structurées

DataCo dispose d’un site e-commerce pour vendre leurs produits en ligne. DataCo veut savoir
quelle sont les produits les plus vus aussi bien les plus vendus ?

Pour répondre à cette question, nous devons exploiter les fichiers logs de serveur web dont
lesquels sont stockés les urls, les adresses ip, …etc. Notons que ces fichiers logs peuvent
contenir un grand volume de données qu’on ne peut pas générer facilement avec les SGBDR
classiques.

Comme Hadoop peut à la fois traiter et stocker des données structurées et non structurées,
sans faire recours à redéfinir de nouvelles bases de données, nous pouvons importer ces
données non structurées contenues dans les fichiers logs sur HDFS et les interroger facilement
avec Hive. Dans ce workshop, nous allons exploiter un fichier access.log.2

Pour copier ce fichier vers HDFS, vous devez exécuter ces commandes dans le terminal pour
créer un répertoire original_access_logs sur HDFS ensuite copier le fichier « access.log »
depuis le système de fichiers local vers HDFS.

hdfs dfs -mkdir /user/hive/warehouse/original_access_logs

hdfs dfs -put access.log /user/hive/warehouse/original_access_logs

9
hadoop fs -ls /user/hive/warehouse/original_access_logs
Esprit 2019-2020
Big Data Analytics 4ERP-BI / 4DS

Maintenant le fichier log est présent sur HDFS mais avec sa forme brute, nous ne pouvons pas
l’exploiter pour répondre à notre question. Pour cette raison, nous allons générer une table
Hive afin de l’interroger avec Hive.

Pour construire cette table à partir de ce fichier, nous avons besoin de deux étapes. La
première étape permet d’extraire les champs à partir de fichier logs en utilisant des
expressions régulières et aussi en profitant de la capacité et la flexibilité de l’outil « SerDes
(serializers / deserializers) » fourni par Hive pour analyser (to parse) le fichier log. La seconde

CREATE EXTERNAL TABLE intermediate_access_logs (


ip STRING,
datee STRING,
method STRING,
url STRING,
http_version STRING,
code1 STRING,
code2 STRING,
dash STRING,
user_agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex' = '([^ ]*) - - \\[([^\\]]*)\\] "([^\ ]*) ([^\ ]*)
([^\ ]*)" (\\d*) (\\d*) "([^"]*)" "([^"]*)"',
'output.format.string' = "%1$$s %2$$s %3$$s %4$$s %5$$s %6$$s %7$$s
%8$$s %9$$s")
LOCATION '/user/hive/warehouse/original_access_logs';

étape permet de créer une

table Hive à partir de résultat de SerDes pour éviter chaque fois le recours à cet outil pour
analyser ce fichier. Cette requête permet de créer une table intermédiaire
intermediate_access_logs en utilisant SerDers offert par Hive. Ensuite la requête suivante
permet de créer une table tokenized_access_logs

CREATE EXTERNAL TABLE tokenized_access_logs (


ip STRING, 10
Esprit 2019-2020
datee STRING,
method STRING,
Big Data Analytics 4ERP-BI / 4DS

Par la suite, vous devez copier le contenu de cette table intermédiaire vers la table Hive en
utilisant l’instruction suivante :

Maintenant, une fois les données prêtes à analyser, on vous demande :

1- Quelles sont les catégories de produit les plus populaires ?


2- Quels sont les produits les plus visités et les plus vendues ?
3- Quels sont les produits les moins visités et le plus vendues ?

ADD JAR /usr/lib/hive/lib/hive-contrib-0.10.0-cdh4.7.0.jar;

INSERT OVERWRITE TABLE tokenized_access_logs SELECT * FROM


intermediate_access_logs;

11
Esprit 2019-2020

Vous aimerez peut-être aussi