sujet TP
Transcription
sujet TP
Travaux pratiques : HBase Jonathan Lejeune Objectifs Ce sujet de travaux pratiques vous permettra de vous initier à l'utilisation de Hbase ainsi que son installation dans un environnement UNIX. Exercice 1 Installation et démarrage Tapez la commande : Question 1 cat /etc/hosts Vériez que la sortie de cette commande comporte bien les lignes suivantes 127.0.0.1 localhost 127.0.1.1 <nom de votre machine locale> Téléchargez Hbase à l'URL suivante. Question 2 http://apache.crihan.fr/dist/hbase/stable/hbase-1.2.4-bin.tar.gz . Extrayez le contenu de l'archive dans votre home (attention aux quota). Au même titre qu'Hadoop, Hbase a besoin que la variable d'environnement JAVA_HOME soit dénie. ajoutez la ligne suivante dans votre : .bashrc Si ce n'est pas déjà fait export JAVA_HOME=<chemin vers la JVM courante de votre machine> Ajouter ensuite les lignes suivantes : export MY_HBASE_HOME=<votre_repertoire_installation_hbase> export PATH=$PATH:$MY_HBASE_HOME/bin Pour prendre en compte ces modications dans votre terminal ouvert tapez : source ~/.bashrc 1 Vériez que Hbase est opérationnel en tapant : hbase version La sortie terminale de cette commande doit être : HBase 1.2.4 Source code repository git://asf-dev/home/busbey/projects/hbase revision=67592f3d062743907f8c5ae00dbbe1ae4f69e5af Compiled by busbey on Tue Oct 25 18:10:20 CDT 2016 From source with checksum b45f19b5ac28d9651aa2433a5fa33aa0 Nous allons congurer Hbase en mode pseudo-distribué (tout les démons Hbase en une seule machine) sur le HDFS. Pour cela éditez le chier en ajoutant les properties suivantes : <property> Question 3 conf/hbase-site.xml <name>hbase.cluster.distributed</name> <value>true</value> </property> Ceci indique que Hbase sera en mode distribué (plusieurs processus). <property> <name>hbase.rootdir</name> <value>hdfs://localhost:9000/hbase</value> </property> Ceci indique le chemin HDFS à utiliser pour stocker les données. Ici ça sera le dossier . /hbase <property> <name>hbase.zookeeper.property.dataDir</name> <value>/tmp/zookeeper</value> </property> Ceci indique où Zookeeper stockera ses informations sur votre système de chiers local. Démarrez les démons du HDFS et de Hbase. Question 4 start-dfs.sh start-hbase.sh Ceci démarre trois démons : Zookeeper, hbase master et regionserver. Vériez que ces trois démons ont bien été démarrés en tapant la commande ps aux | grep jvm Vériez que le dossier Question 5 Found 8 items drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x -rw-r--r-- 1 hbase jlejeune jlejeune jlejeune jlejeune jlejeune a bien été créé sur le HDFS et que son contenu soit : supergroup supergroup supergroup supergroup supergroup Page 2 0 0 0 0 42 2016-06-13 2016-06-13 2016-06-13 2016-06-13 2016-06-13 12:26 12:26 12:27 12:19 12:19 /hbase/.tmp /hbase/MasterProcWALs /hbase/WALs /hbase/data /hbase/hbase.id -rw-r--r-drwxr-xr-x 1 jlejeune supergroup - jlejeune supergroup 7 2016-06-13 12:19 /hbase/hbase.version 0 2016-06-13 12:26 /hbase/oldWALs Contrairement à Hadoop, il est possible de lancer plusieurs démons du même type sur la même machine. Nous allons démarrer 3 regionServer supplémentaires. Bien que ceci n'ai pas beaucoup de sens en réalité, ce mécanisme nous permettra cependant d'émuler un cluster en considérant plusieurs n÷uds regionServer. Le regionServer écoute sur 2 ports : 16201 et 16301. Pour éviter le conit de port d'écoute, il existe une commande qui permet de démarrer des démons supplémentaires en décalant le numéro de port d'écoute de ces dernier. Pour cela tapez : Question 6 local-regionservers.sh start 2 3 4 Ceci démarrera trois regionServer supplémentaires, écoutant respectivement sur 16202/16302, 16203/16303 et 16204/16304 N.B. : Sur ce même principe il est également possible de lancer des masters de backup en local mais nous nous limiterons à un seul master dans ce TP. Une fois que la plate-forme est démarrée, chaque démon démarre un serveur web sur la machine hôte (localhost) an de pouvoir superviser son état à l'aide d'un navigateur. Vous pouvez voir l'interface Web du master au port 16010 et les interfaces des diérents RegionServer au port 1630X où X représente l'oset. Pour taper des commandes shell Hbase, il vous est possible de lancer la commande : Question 7 Question 8 hbase shell qui vous ouvrira un nouvel invite de commande et vous permettra de lancer des commandes Hbase en mode interactif (pour revenir au shell bash, taper ). Il est également possible d'utiliser le shell hbase en mode non interactif, c'est à dire en lançant les commandes Hbase directement depuis le shell bash. Pour cela il sut d'envoyer la commande à exécuter sur l'entrée standard de . Achez le contenu de la table hbase : meta avec le mode non interactif. exit hbase shell Exercice 2 Création d'une table Dans cet exercice nous allons créer une table HBase pour stocker des données de l'entreprise Booble (voir TD Map-Reduce). Nous souhaitons donc avoir la table ayant le schéma suivant : cf1 rowkey date hour address keywords ... ... ... ... ... connections Créez une telle table. An de remplir cette table nous allons créer un chier de données qui sera lu par un programme. Au fur et à mesure de la lecture les données seront insérées dans la table. Question 1 Page 3 Créez un chier de données de 8 Mo correspondant au format Booble grâce au script python generateData.py qui vous a été fourni. Une première solution serait de remplir la table à partir du chier de données créé à la question précédente avec l'utilisation d'un script bash suivant que l'on écrirait dans un chier Question 2 Question 3 script.sh #!/bin/bash cpt=0 while read date hour adress keywords do echo "put echo "put echo "put echo "put cpt=`expr 'connections','row$cpt','cf1:date','$date'" 'connections','row$cpt','cf1:hour','$hour'" 'connections','row$cpt','cf1:adress','$adress'" 'connections','row$cpt','cf1:keywords','$keywords'" $cpt + 1` # attention ici ce sont des back-quotes (AltGR - 7) done et que l'on appellerait de la manière suivante cat fichier_donne | script.sh | hbase shell Cette solution est-elle une bonne solution? Pour la suite, repartir d'une table vierge (eacez-la et recréez-la si nécessaire). La deuxième solution que nous proposons pour remplir la table est l'utilisation d'un programme Map-Reduce. Pour cela démarrez yarn et copiez le chier de données sur la racine du HDFS. Pour que la compilation se passe bien dans Eclipse, pensez à ajouter dans le build path de votre projet eclipse les chiers jar présents dans le dossier Question 4 connections Question 5 Question 6 $MY_HBASE_HOME/lib Attention il peut y avoir des conit de nom de classe lors de l'ajout automatique des import. Le cas échéant, choississez les classes issues des packages : org.apache.hadoop.mapreduce org.apache.hadoop.fs org.apache.hadoop.conf org.apache.hadoop.fs org.apache.hadoop.io org.apache.hadoop.hbase.client org.apache.hadoop.hbase.mapreduce org.apache.hadoop.hbase.util Page 4 Créez dans votre projet Eclipse un package hbase. Dans ce package créez une classe FileToHbase qui sera un programme map-reduce. Ce programme map-reduce aura pour entrée un chier de donnée et qui écrira sa sortie dans une base Hbase. Ce programme doit permettre d'importer n'importe quel chier texte vers une table de Hbase. Ainsi ce programme prendra 3 arguments : le nom de la table HBase à remplir le chemin HDFS du chier source le nom des colonnes de la table séparées par des " ". Le nieme nom de colonne cet argument Dansdenotre exemple correspond la commandeau ànieme lancermot serad'une : ligne de chier Question 7 _ yarn jar votre_jar.jar hbase.FileToHbase connections /Booble_0 "cf1:date_cf1:hour_cf1:address_cf1:keywords" Les rowkeys seront un hashage md5 de la ligne. Vous utiliserez la méthode byte[] DigestUtils.md5(String line); pour passer aux diérentes tâches de map ou reduce des informations depuis le programme main, vous pouvez utiliser les méthodes set et gets de la classe Conguration. Par exemple, si l'on souhaite communiquer la valeur du 3ème argument faire dans le main conf.set("argument3", args[2]); Vous pouvez récupérer l'information dans les tâches de map ou de reduce via le contexte passé en paramètre : Indications complémentaires : context.getConfiguration().get("argument3"); , créez votre chier jar (appelons-le foo.jar) avec les chiers class de votre programme (voir TP Hadoop pour la commande). Avant de lancer le job map-reduce, il faut ajouter dans l'archive jar créées précédemment les chiers jar de HBase. Pour cela tapez : Question 8 Une fois que votre programme compile correctement tmp=$PWD && cd $MY_HBASE_HOME && jar uvf $tmp/foo.jar lib && cd $tmp Lancez votre programme et assurez vous que la table "connections" est remplie correctement. Testez votre programme avec un chier plus gros. Testez votre programme avec les autres type de données comme LastFM et StereoPrix. Question 9 Question 10 Exercice 3 Table HBase vers chier HDFS A présent notre objectif est l'inverse du précédent exercice : lire une table HBase et de produire en sortie un seul chier texte ayant le même format que le chier initial. Nous garderons comme table d'entrée, la table "connections" stockant les données de l'entreprise Booble. Cependant nous souhaiterons que les lignes du chier de sortie apparaissent dans l'ordre chronologique (date + heure croissantes). Expliquez pourquoi la clé intermédiaire nécessitera la création d'une classe spécique qui implémentera l'interface WritableComparable. Question 1 Page 5 Dans votre package Java hbase, écrivez la classe permettant d'implémenter la clé intermédiaire. Codez la classe BoobleHBaseToFile qui sera un programme map-reduce permettant de réaliser l'objectif de l'exercice. Question 2 Question 3 Exercice 4 MapReduce et Hbase en lecture/écriture Recoder le calcul map-reduce de Booble en utilisant en entrée et en sortie une table HBase. Question 1 Page 6