Initiation à HBase la base de donnée de Hadoop

Le but de ce TP est de se familiariser avec la base de donnée BigTable de Hadoop appelée HBase. Pour ce TP on considère que nous disposons d'un serveur HDFS, d'un seveur HBase et des outils permettant de communiquer avec HBase et HDFS. Le port de l'interface web du serveur HBase est 16010.

  • Namenode (HDFS): $hdfs://10.0.NUM_SALLE.3:9000/$
  • Ressource manager (YARN): $10.0.NUM_SALLE.3:$
  • WebUI (HDFS): $http://10.0.NUM_SALLE.3:50070/$
  • WebUI (YARN): $http://10.0.NUM_SALLE.3:8088/$
  • WebUI (HBASE): $http://10.0.NUM_SALLE.3:16010/$

Partie I, SHELL CRUDS: Create, Read, Update, Delete, Scan

pour rappel, une liste détaillée des commandes Shell est disponible à cette adresse [shell commandes](http://

  • Lancez la commande "$./hbase\ shell$".
  • Créez une table portant votre nom (commande create) et ayant les "column families" suivantes : loc, name, reg, measure.
  • Afficher la liste des tables ainsi que la description de votre table (commandes : list, describe)
  • Changez le paramètre de la "column family" loc pour que 5 versions soient conservées et que la "column family" soit conservée en mémoire. Attention, il faut d'abord désactiver le table avant de modifier la structure des familles de colonnes. (commandes : disbale, enable et alter).
  • Ajouter dans votre table les informations contenues dans le dernière ligne du fichier worldcitiespop.txt (commandes: put, get ) on choisira la clé 0 pour cette ligne de notre table. Vous devriez obtenir l'affichage suivant quand vous demandez l'affichage (sauf le timestamp) de la ligne 0.
COLUMN                             CELL                                                                                                                                         
 loc:x                             timestamp=1418649413726, value=-20.33                                                                                                        
 loc:y                             timestamp=1418649440768, value=30.033                                                                                                        
 measure:pop                       timestamp=1418650556013, value=79876                                                                                                         
 name:short                        timestamp=1418649756935, value=zv                                                                                                            
 reg:code                          timestamp=1418649869255, value=07                                                                                                            
 reg:country                       timestamp=1418651236426, value=zw
  • Modifiez les valeurs de 'loc:x' et 'measure:pop' de la ligne 0 et appelez la commande

get 'auber', '0', {COLUMN => ['loc', 'measure'], VERSIONS => 5 }

  • Expliquez le résultat.
  • Remettez les bonnes valeurs dans votre table (commandes : put, delete ).
  • Ajoutez le contenu de l'avant dernière ligne du fichier worldcitiespop.txt.
  • Appelez la commande scan sur votre table.
  • En utilisant un filtre "SingleColumnValueFilter", ecrivez une commande scan qui ne retourne que les lignes qui ont le code région "06". (http://hbase.apache.org/book/client.filter.html)

scan 'TABLE', {FILTER=>"SingleColumnValueFilter('FAMILY','COLUMN',=,'binary:VALUE')"}

Partie II, JAVA CRUDS: Create, Read, Update, Delete, Scan

En utilisant le squelette d'application HBase minimale suivant :

//=====================================================================
/**
 * Squelette minimal d'une application HBase 0.99.1
 * A exporter dans un jar sans les librairies externes
 * Il faut initialiser la variable d'environement HADOOP_CLASSPATH
 * Il faut utiliser la commande hbase 
 * A exécuter avec la commande ./hadoop jar NOMDUFICHER.jar ARGUMENTS....
 */
package hbase;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;


public class TPHBase {

    public static class HBaseProg extends Configured implements Tool {
        private static final byte[] FAMILY = Bytes.toBytes("AAA");
        private static final byte[] ROW    = Bytes.toBytes("BBB");
        private static final byte[] TABLE_NAME = Bytes.toBytes("CCC");

        public static void createOrOverwrite(Admin admin, HTableDescriptor table) throws IOException {
            if (admin.tableExists(table.getTableName())) {
                admin.disableTable(table.getTableName());
                admin.deleteTable(table.getTableName());
            }
            admin.createTable(table);
        }

        public static void createTable(Connection connect) {
            try {
                final Admin admin = connect.getAdmin(); 
                HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
                HColumnDescriptor famLoc = new HColumnDescriptor(FAMILY); 
                //famLoc.set...
                tableDescriptor.addFamily(famLoc);
                createOrOverwrite(admin, tableDescriptor);
                admin.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(-1);
            }
        }

        public int run(String[] args) throws IOException {
            Connection connection = ConnectionFactory.createConnection(getConf());
            createTable(connection);
            Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
            Put put = new Put(Bytes.toBytes("KEY"));
            table.put(put);
            return 0;
        }

    }

    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(HBaseConfiguration.create(), new TPHBase.HBaseProg(), args);
        System.exit(exitCode);
    }
}

Archive du projet maven : hbase_maven.tgz

  • Ecrivez un programme Java qui crée la même table que celle créée avec le shell HBase.
  • En utilisant le fichier worldcitiespop.txt (en local) remplissez automatiquement la table. On utilisera le numéro de la ligne dans le fichier comme clé pour les lignes de la table.
  • Comparez les performances de votre programme en modifiant le type de stockage de vos "Column Families" (IN_MEMORY, VERSIONS), et en transmettant ou non les Put directement. (commandes: setAutoFlushTo,flushCommits, setInMemory, setMaxVersions )
  • En utilisant un Scan, effacez toutes les lignes qui ont une population inférieure à 10000 (commandes : Filter, SingleColumnValueFilter, CompareOp, ResultScanner, getScanner, getRow, Delete, delete).