Cours Hbase Polycopie
Cours Hbase Polycopie
Cours Hbase Polycopie
Jonathan Lejeune
Sorbonne Université/LIP6-INRIA
Bref historique
Nov 2006 : Google publie un papier sur BigTable
Oct 2007 : Premier Hbase "utilisable"
Mai 2010 : HBase devient un projet Apache top-level
Fev 2015 : Hbase 1.0.0
Stockage NoSQL :
orienté colonne :
⇒ adapté aux traitements analytiques en ligne (OLAP)
Schéma clé → valeur
⇒ accès rapide à une valeur par sa clé
triée
⇒ permet de récupérer les valeurs par intervalle de clés
API Java
⇒ intégration naturelle dans l’ecosystème Hadoop
Namespace1
Table1 ColumnFamily1 ColumnFamily2
Col1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Definition
Un groupement logique de table
Caractéristiques
Permet d’isoler des tables pour des raisons de quotas, de restrictions
géographiques, de sécurité
Deux namespace existent déjà par défaut
hbase : Contient toutes les tables des méta-données de HBase
default : namespace par défaut lorsque aucun namespace n’est spécifié
à la création d’une table
c Jonathan Lejeune (Sorbonne Univ.) Hbase 7 / 49
Table
Namespace1
Table1 ColumnFamily1 ColumnFamily2
Col1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Définition
Élément servant à organiser les données dans HBase
Le nom d’une table est une chaîne de caractère
Désignée de manière non ambiguë en préfixant son nom par le nom de
son namespace séparé par ’ :’
nom_namespace:nom_table
Namespace1
Table1 ColumnFamily1 ColumnFamily2
Col1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Définition
Permet d’organiser les données dans une table
Une ligne est identifiée par une clé unique : RowKey
La Rowkeys n’a pas de type, c’est un tableau d’octets.
Namespace1
Table1 ColumnFamily1 ColumnFamily2
Col1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Définition
Regroupe les données au sein d’une ligne
Toutes les lignes de la table ont les mêmes ColumnFamily, pouvant
être peuplée ou pas
Au moins une à la création de la table dans HBase
Namespace1
Table1 ColumnFamily1 ColumnFamily2
Col1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Définition
Permet de subdiviser les columnfamily
Désignée par une chaîne de caractères appelée column qualifier
Spécifiée au moment de l’insertion de la donnée
Non typée, le nom est un tableau d’octets
Namespace1
Table1 ColumnFamily ColumnFamily2
Col1 1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Définition
Identifiée par la combinaison d’un RowKey, de la Column Family et de
la Column
Les données stockées dans une cellule sont les valeurs de la cellule
on peut stocker différente version de la cellule (ou timestamp)
Namespace1
Table1 ColumnFamily1 ColumnFamily2
Col1 Col2 Col3 Col4 Col5
vers3 val10
vers2 val1
Rowkey1 vers1 val6 vers1 val7 vers2 val11
vers1 val2 vers1 val12
Définition
Les valeurs au sein d’une cellule sont versionnées
Les versions sont identifiées par défaut par un timestamp (de type
long)
Le nombre de version que l’on peut stocker par cellule est paramétrable
Définition
Une valeur est une donnée atomique de la base
Non typée et stockée au format binaire
Les valeurs null ne sont pas matérialisées (aucun stockage nécessaire)
Désignée par une clé multi-dimensionnelle :
(rowkey, column family, column, version)
Infrastructure
physique
Machine Machine Machine
esclave esclave esclave
Machine maître
RegionServer Rowkey3
Rowkey4
Region 2 Rowkey5
RegionServer Rowkey6
Rowkey7
Region 3 Rowkey8
RegionServer Rowkey9
Région
Sous ensemble contiguë de lignes de la table
Stockée sur un nœud physique esclave et triée selon la rowkey
Identifiée par un rowkey minimum et un rowkey maximum
c Jonathan Lejeune (Sorbonne Univ.) Hbase 16 / 49
RegionServer
HRegionServer
BlockCache
HRegion
WAL Store MemStore Store MemStore
StoreFile StoreFile StoreFile ... ...
HLog
... ...
HFile HFile HFile
Caractéristiques principales
Point d’entrée pour accéder à une donnée
Propose les services :
Données (get, put,delete,next, etc.)
Region (splitRegion, compactRegion, etc.)
c Jonathan Lejeune (Sorbonne Univ.) Hbase 17 / 49
RegionServer : BlockCache
HRegionServer
BlockCache
HRegion
WAL Store MemStore Store MemStore
StoreFile StoreFile StoreFile ... ...
HLog
... ...
HFile HFile HFile
Caractéristique du BlockCache
Cache LRU activé par défaut pour toutes les tables
⇒ Toute opération de lecture est chargée dans le cache LRU.
HRegion
WAL Store MemStore Store MemStore
StoreFile StoreFile StoreFile ... ...
HLog
... ...
HFile HFile HFile
HRegionServer
BlockCache
HRegion
WAL Store MemStore Store MemStore
StoreFile StoreFile StoreFile ... ...
HLog
... ...
HFile HFile HFile
HRegion
WAL Store MemStore Store MemStore
StoreFile StoreFile StoreFile ... ...
HLog
... ...
HFile HFile HFile
Résumé
Une table est segmentée en plusieurs partitions
Une partition d’une table est gérée par une Region
Un RegionServer gère plusieurs Region
Une Region contient plusieurs Store
Chaque Store gère une ColomnFamily d’une table
Un Store gère un MemStore et plusieurs StoreFile
Un StoreFile gère un fichier de stockage de la partition
Caractéristiques
Coordonne et surveille les RegionServer : les remplace si besoin
Interface pour tout changement des meta-données du système (table
hbase :meta) :
ex : création/suppression/modif d’une table ou d’une col family
Assure l’équilibre de charge entre RegionServer :
(dé)assigne/déplace les régions
Peut être répliqué
En cas de panne :
un des réplicas prend sa place
pendant la gestion de la panne, HBase peut continuer à fonctionner
car les clients s’adressent directement aux RegionServer
Caractéristiques
Logiciel Apache de de
coordination de systèmes
distribués
entrepôt de méta-données
partagées Machine Machine Machine
esclave esclave esclave
Machine maître
surveillance et notification
d’événements
Caractéristiques
Maintien la liste de toutes les régions du système
La localisation des régions est stockée dans ZooKeeper
hbase
meta info
regioninfo server serverstartcode
(nom_table, clé de départ, id_region) <info diverse> <adresseIP:port du <date a laquelle la
serveur> region a été crée sur
le serveur>
ZooKeeper JVM
HMaster
JVM
Client 3 : accès lecture
hbase:meta JVM
RegionServer
Machine cliente JVM
4 : retour localisation région
démandées RegionServer
JVM
5 : accès RegionServer
lecture/lecture
Machines esclaves
HRegionServer
BlockCache
HRegion
WAL Store MemStore
les API
un shell dédié en lançant la commande hbase shell
API JAVA native
API externes :
REST
Thrift
Commandes générales
status : retourne l’état des RegionServers du système
help : affiche une aide sur l’utilisation du shell HBase ainsi que la liste
des commandes possibles
Commandes table
create : créer une table
create ’<table name>’,’<colfam1>’, ’<colfam2>’, ...., ’<colfamN>’
Caractéristiques
"hbase.zookeeper.quorum" = machines serveurs de ZK (par def : localhost)
Recommandation : une unique connexion par JVM cliente
une connexion à ZooKeeper est coûteuse
les données de ZK sont en cache sur la machine cliente
c Jonathan Lejeune (Sorbonne Univ.) Hbase 34 / 49
API Java : le typage des données
RAPPEL
Dans Hbase les données ne sont pas typées et sont stockées au format
binaire :
⇒ Nécessité de convertir toutes les données du programme :
du type java d’origine vers byte[] avant une écriture
de byte[] vers le type Java d’origine après une lecture
Exemple d’utilisation
T a b l e t a b l e = . . . . ; // c o n n e x i o n à une t a b l e
Put p u t = new Put ( B y t e s . t o B y t e s ( " row1 " ) ) ;
// a j o u t d ’ une v a l e u r v1 d a n s l a c e l l u l e <row1 , c f 1 : c1>
p u t . addColumn ( B y t e s . t o B y t e s ( " c f 1 " ) , B y t e s . t o B y t e s ( " c1 " )
, B y t e s . t o B y t e s ( " v1 " ) ) ;
// a j o u t d ’ une v a l e u r v2 d a n s l a c e l l u l e <row1 , c f 1 : c2>
p u t . addColumn ( B y t e s . t o B y t e s ( " c f 1 " ) , B y t e s . t o B y t e s ( " c2 " )
, B y t e s . t o B y t e s ( " v2 " ) ) ;
t a b l e . p u t ( p u t ) ; // e n v o i de l a r e q u ê t e s u r l a t a b l e
c Jonathan Lejeune (Sorbonne Univ.) Hbase 38 / 49
API Java : les autres Mutations
les Deletes
Objet caractérisant la suppression partielle ou totale des colonnes
d’une ligne
constructeur : Delete(byte[] rowkey)
les Appends
Objet caractérisant une opération atomique de read-modify-write sur
la cellule d’une ligne
constructeur : Append(byte[] row)
méthode : Append add(byte[] family, byte[] col, byte[] value)
⇒ création d’une nouvelle version de la cellule en concaténant
l’ancienne valeur avec la nouvelle valeur
Exemple d’utilisation
T a b l e t a b l e = . . . . ; // c o n n e x i o n à une t a b l e
Get g e t = new Get ( B y t e s . t o B y t e s ( " row1 " ) ) ;
g e t . addColumn ( B y t e s . t o B y t e s ( " c f 1 " ) , B y t e s . t o B y t e s ( " c1 " ) ) ;
R e s u l t r e s = t a b l e . g e t ( g e t ) ; // e n v o i de l a r e q u ê t e s u r l a t a b l e
byte [ ] v a l = r e s . g e t V a l u e ( B y t e s . t o B y t e s ( " c f 1 " ) , B y t e s . t o B y t e s ( " c1 " ) ) ;
System . o u t . p r i n t l n ( B y t e s . t o S t r i n g ( v a l ) ) ;
c Jonathan Lejeune (Sorbonne Univ.) Hbase 40 / 49
API Java : les Query Scan
Caractéristiques
Objet caractérisant la lecture séquentielle de plusieurs lignes
constructeurs :
Scan() : toute la table
Scan(byte[] startRowKey) : à partir d’une ligne donnée
Scan(byte[] startRowkey, byte[] stopRowKey) : sur une portion
mêmes méthodes que Get
Exemple d’utilisation
T a b l e t a b l e = . . . . ; // c o n n e x i o n à une t a b l e
Scan s c a n = new Scan ( B y t e s . t o B y t e s ( "rowX" ) , B y t e s . t o B y t e s ( "rowY" ) ) ;
s c a n . addColumn ( B y t e s . t o B y t e s ( " c f z " ) , B y t e s . t o B y t e s ( " c o l " ) ) ;
ResultScanner r e s u l t s = t a b l e . getScanner ( scan ) ;
for ( R e s u l t r e s : r e s u l t s ) {
System . o u t . p r i n t l n ( r e s ) ;
}
Map
Table in task 1
Interfaçage Hadoop-Hbase
Une région = Un split
Un reduce = Un client Hbase
Configurer un TableOutputFormat
job . g e t C o n f i g u r a t i o n ( ) . s e t ( T a b l e O u t p u t F o r m a t . OUTPUT_TABLE, " tab_out " ) ;
job . s e t O u t p u t F o r m a t C l a s s ( T a b l e O u t p u t F o r m a t . class ) ;
job . s e t O u t p u t K e y C l a s s ( I m m u t a b l e B y t e s W r i t a b l e . class ) ;
job . s e t O u t p u t V a l u e C l a s s (< s o u s c l a s s e de M u t a t i o n >);
Atomicité
toute mutation est atomique pour une ligne entière et peut être :
soit "success" ⇒ réussite complète
soit "failed" ⇒ échec complet
L’ordre de mutations concurrentes pour une ligne se fait sans
entrelacement.
ex : si "a=1,b=1" k "a=2,b=2" alors soit "a=1,b=1" ou soit "a=2,b=2"
Cohérence
Tout get sur une ligne complète retournera une version de la ligne qui
a existé dans l’histoire de la table :
si 1 get k plusieurs mutations, alors le get retournera une ligne complète qui a existé a
un point donné dans le temps entre les mutations
Durabilité
Toute donnée visible est durable ⇒ un read concerne forcément une
donnée stockée sur disque
Toute opération acquittée réussie est durable
Toute opération acquittée échec ne sera pas durable
[3] HBase : The Definitive Guide, 2nd Edition, Lars George, O’Reilly Media,
Inc., ISBN : 9781491905845