tp4 Hbase
tp4 Hbase
tp4 Hbase
Télécharger PDF
[../tp4.pdf]
Objectifs du TP
Manipulation de données avec HBase, et traitement co-localisé avec Spark.
127.0.0.1:8000/tp4/ 1/18
01/02/2020 TP4 - HBase - TP Big Data
Outils et Versions
Apache HBase [https://hbase.apache.org/] Version 1.4.7
Java
[http://www.oracle.com/technetwork/java/javase/downloads/index.html]
Version 1.8
Apache HBase
Présentation
Modèle de données
Table : dans HBase les données sont organisées dans des tables. Les noms
des tables sont des chaînes de caractères.
127.0.0.1:8000/tp4/ 2/18
01/02/2020 TP4 - HBase - TP Big Data
Row : dans chaque table, les données sont organisées dans des lignes. Une
ligne est identi ée par une clé unique (RowKey). La Rowkey n’a pas de type,
elle est traitée comme un tableau d’octets.
Column Family : Les données au sein d’une ligne sont regroupées par
column family. Chaque ligne de la table a les mêmes column families, qui
peuvent être peuplées ou pas. Les column families sont dé nies à la
création de la table dans HBase. Les noms des column families sont des
chaînes de caractères.
Column quali er : L’accès aux données au sein d’une column family se fait
via le column quali er ou column. Ce dernier n’est pas spéci é à la création
de la table mais plutôt à l’insertion de la donnée. Comme les rowkeys, le
column quali er n’est pas typé, il est traité comme un tableau d’octets.
Version : Les valeurs au sein d’une cellule sont versionnés. Les versions
sont identi és par leur timestamp (de type long). Le nombre de versions est
con guré via la Column Family. Par défaut, ce nombre est égal à trois.
127.0.0.1:8000/tp4/ 3/18
01/02/2020 TP4 - HBase - TP Big Data
Les données dans HBase sont stockées sous forme de HFiles, par colonnes,
dans HDFS. Chaque HFile se charge de stocker des données correspondantes à
une column family particulière.
127.0.0.1:8000/tp4/ 4/18
01/02/2020 TP4 - HBase - TP Big Data
HBase n'a pas de schéma prédé ni, sauf qu'il faut dé nir les familles de
colonnes à la création des tables, car elles représentent l'organisation
physique des données
Architecture
127.0.0.1:8000/tp4/ 5/18
01/02/2020 TP4 - HBase - TP Big Data
Les tables HBase sont divisées horizontalement, par row en plusieurs Regions.
Une region contient toutes les lignes de la table comprises entre deux clefs
données. Les regions sont affectées à des noeuds dans le cluster, appelés
Region Servers, qui permettent de servir les données pour la lecture et l'écriture.
Un region server peut servir jusqu'à 1000 régions.
Installation
127.0.0.1:8000/tp4/ 6/18
01/02/2020 TP4 - HBase - TP Big Data
HBase est installé sur le même cluster que précédemment. Suivre les étapes
décrites dans la partie Installation du TP1 [../tp1/index.html#installation] pour
télécharger l'image et exécuter les trois contenaires. Si cela est déjà fait, il su t
de lancer vos machines grâce aux commandes suivantes:
./start-hadoop.sh
start-hbase.sh
Une fois c'est fait, en tapant jps , vous devriez avoir un résultat ressemblant au
suivant:
161 NameNode
1138 HRegionServer
499 ResourceManager
1028 HMaster
966 HQuorumPeer
1499 Jps
348 SecondaryNameNode
127.0.0.1:8000/tp4/ 7/18
01/02/2020 TP4 - HBase - TP Big Data
Pour manipuler votre base de données avec son shell interactif, vous devez
lancer le script suivant:
hbase shell
Nous allons créer une base de données qui contient les données suivantes:
create 'sales_ledger','customer','sales'
list
127.0.0.1:8000/tp4/ 8/18
01/02/2020 TP4 - HBase - TP Big Data
scan 'sales_ledger'
127.0.0.1:8000/tp4/ 9/18
01/02/2020 TP4 - HBase - TP Big Data
Vous obtiendrez:
exit
HBase API
HBase fournit une API en Java pour pouvoir manipuler programmatiquement les
données de la base. Nous allons montrer ici un exemple très simple.
mkdir hbase-code
cd hbase-code
mkdir -p tn/insat/tp4
vim tn/insat/tp4/HelloHBase.java
package tn.insat.tp4;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
127.0.0.1:8000/tp4/ 10/18
01/02/2020 TP4 - HBase - TP Big Data
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
System.out.println("Creating Table");
createOrOverwrite(admin, ht);
System.out.println("Done......");
table1 = connection.getTable(TableName.valueOf(tableName)
try {
System.out.println("Adding user: user1");
byte[] row1 = Bytes.toBytes("user1");
Put p = new Put(row1);
p.addColumn(family1.getBytes(), "name".getBytes(), By
p.addColumn(family1.getBytes(), "address".getBytes(),
p.addColumn(family2.getBytes(), "company".getBytes(),
p.addColumn(family2.getBytes(), "salary".getBytes(),
table1.put(p);
127.0.0.1:8000/tp4/ 11/18
01/02/2020 TP4 - HBase - TP Big Data
table1.put(p2);
System.out.println("reading data...");
Get g = new Get(row1);
Result r = table1.get(g);
System.out.println(Bytes.toString(r.getValue(family1.
} catch (Exception e) {
e.printStackTrace();
} finally {
table1.close();
connection.close();
}
}
javac tn/insat/tp4/HelloHBase.java
Remarque
127.0.0.1:8000/tp4/ 12/18
01/02/2020 TP4 - HBase - TP Big Data
Ce code devrait compiler sans problèmes, car la librairie HBase est déjà incluse dans le
classpath par défaut, grâce à la variable d'environnement $CLASSPATH.
Exécuter ce code:
java tn.insat.tp4.HelloHBase
Chargement de chiers
Il est possible de charger des chiers volumineux dans la base HBase, à partir de
HDFS. Nous vous fournissons pour cela le chier purchases2.txt que vous
trouverez directement sous le répertoire /root de votre contenaire.
Remarque
Ce chier n'est autre que le chier purchases.txt, légèrement modi é: un numéro unique est
rajouté au début de chaque ligne, que nous utiliserons comme clef pour chaque
enregistrement, et la séparation entre les colonnes a été remplacée par une virgule (,) au
lieu d'une tabluation.
127.0.0.1:8000/tp4/ 13/18
01/02/2020 TP4 - HBase - TP Big Data
hbase shell
create 'products','cf'
exit
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.separator=',' \
-Dimporttsv.columns=HBASE_ROW_KEY,cf:date,cf:time,cf:town,cf:
products input
hbase shell
get 'products','2000',{COLUMN => 'cf:town'}
127.0.0.1:8000/tp4/ 14/18
01/02/2020 TP4 - HBase - TP Big Data
Nous allons réaliser un traitement simple pour montrer comment greffer spark
sur HBase.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 ht
<modelVersion>4.0.0</modelVersion>
<groupId>hbase.spark</groupId>
<artifactId>processing</artifactId>
<version>1</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
127.0.0.1:8000/tp4/ 15/18
01/02/2020 TP4 - HBase - TP Big Data
<artifactId>hbase</artifactId>
<version>2.1.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-spark</artifactId>
<version>2.0.0-alpha4</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
</project>
package tn.insat.tp4;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
config.set(TableInputFormat.INPUT_TABLE,"products");
127.0.0.1:8000/tp4/ 16/18
01/02/2020 TP4 - HBase - TP Big Data
cp -r $HBASE_HOME/lib/* $SPARK_HOME/jars
127.0.0.1:8000/tp4/ 17/18
01/02/2020 TP4 - HBase - TP Big Data
Activité
Modi er ce code pour qu'il puisse faire la somme des ventes de tous les produits.
127.0.0.1:8000/tp4/ 18/18