Lorsque l’on commence à débattre sur le «BIG DATA», on finit toujours par discuter du stockage. «Hadoop», de par son architecture et son fonctionnement, n’impose aucune contrainte technique sur le stockage de la donnée. Intégrant nativement le concept de Map & Reduce, «Hadoop» est un candidat sérieux pour les besoins de stockage massif et d’extraction qu’impose le «BIG DATA». Facebook a retenu «Hadoop» comme entrepôt de données pour ses calculs de statistiques marketing. Dans un précédent article consacré à «CASSANDRA», nous avions conclu «qu’une architecture permettant l’extraction, la manipulation et l’interprétation socio-économique de données massives, était composée de plusieurs maillons technologiques». «Hadoop» est l’un de ces chainons.

Architecture technique Hadoop

Architecture technique Hadoop

Le schéma ci-dessus décrit l’architecture technique d’une entreprise de e-commerce vendant des produits alimentaires pour animaux. L’objectif pour la direction opérationnelle est d’extraire des métriques marketing afin d’orienter le catalogue de vente et d’augmenter son CA. Nous allons, avec ce support, découvrir «Hadoop», la manipulation de son système de fichier et par la suite utiliser un outil pour extraire des métriques : «HIVE». Je vous propose d’aborder les points suivants :

  • installation d’«Hadoop»,
  • découverte et manipulation d’«HDFS»,
  • réalisation de Map et de Reduce en PHP avec «Hadoop streaming»,
  • découverte de «HIVE»,

Installation du framework HADOOP

Apache «Hadoop» est un framework écrit en JAVA qui permet entre autre, de distribuer au sein d’un cluster, des taches de type Map Reduce et d’y stocker le résultat final. Son but est de proposer des mécanismes intégrés pour manipuler de très gros volumes de données en provenance :

  • de l’extérieur : agrégation de fichiers de log par exemple,
  • de son propre système de fichier : Extraction de données et opération de manipulation (SQL) via «HIVE» par exemple,
  • d’un mix des deux.

Le système de fichier «HDFS» (Hadoop Distributed File Sytem) sur lequel repose «Hadoop» est directement géré par l’outil et n’ a pas besoin de créer de partition au sens stricte du terme. Il embarque tout l’outillage nécessaire pour le créer («bin/hadoop namenode -format») et le manipuler.

Un nombre important de projets OpenSources s’appuyant sur le framework ont vu le jour :

  • HIVE,
  • PIG,
  • ZOOKEEPER,
  • AVRO,
  • WHIRR,
  • et bien d’autres encore.

Voyons maintenant comment installer le framework «Hadoop».

Préparation de l’environnement d’exécution d’Hadoop

»Hadoop» peut être installé de plusieurs manières : local (1 node) ; mono cluster (1 node) ; cluster (multi nodes). Nous ferons une installation de type «cluster». Le projet est délivré sous forme de «tarball» et nécessite une préparation de votre environnement d’exécution avant de pouvoir paramétrer le service.

Librairie JAVA et user système

Etant un projet développé en JAVA, il est nécessaire d’avoir un jdk installé sur votre machine. Mettez à jour votre SDK pour une version de type 1.6.x.

Le lancement d’«Hadoop» se fera par l’intermédiaire de son utilisateur. Vous pouvez choisir le nom de «user» que vous souhaitez. Dans un souci de simplicité, créez le «user system» «hadoop». Le démarrage des services, le lancement des jobs, la gestion du cluster se feront au travers de connexions SSH. Il est donc nécessaire de mettre en place le service SSHd et d’autoriser le user «hadoop» à se connecter aux différents noeuds qui composeront le cluster. Si vous êtes sur un Mac, rendez vous dans le panneau «préférence systeme», onglet «systeme» et choisissez «comptes». Ajoutez votre utilisateur «hadoop» avec un droit standard. Sur linux, un «user add» permettra de le créer.

Service SSHd

Pour gérer ses «nodes», lancer ses jobs, «Hadoop» utilise le service de communication «ssh». Normalement, vous devriez avoir un serveur SSHd d’installé. Dans le cas contraire, faîtes une installation basic de SSHd en fonction de votre distribution et démarrez-le. Sur un Mac, le serveur est présent et normalement démarré. Rendez vous dans «Préférences système» puis sélectionnez «partage» pour vérifier que le serveur est démarré et que l’utilisateur «hadoop» que vous venez de créer ait les droits d’utiliser ce dernier. L’image ci- dessus est une vue de ce que vous devriez avoir.

Hadoop : activer le service ssh

Hadoop : activer le service ssh

Création de la clé RSA pour l’utilisateur «hadoop»

La clé RSA va permettre à l’utilisateur «hadoop» de se connecter automatiquement sur le serveur via le service SSHd. Pour générer la clé, ouvrez un terminal et faîtes les opérations suivantes :

su hadoop
=>demande du mot de passe pour l’utilisateur hadoop
cd ~
ssh-keygen -t rsa -P ""

La clé RSA qui vient d’être générée a été mise dans le répertoire «~/.ssh». Vous trouverez votre clé publique (id_rsa.pub) qui servira d’identifiant sur les serveurs hôtes et la clé privée (id_rsa) qui ne doit pas être transmise. Vous devez maintenant activer votre clé publique pour qu’SSHd accepte les connexions de l’utilisateur «hadoop» sur votre machine.

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Il ne reste plus qu’à renseigner les «hosts» pour lesquels la clé sera utilisée. Pour cela, éditez ou créez le fichier «known_hosts» et associez la cle publique avec les «hosts» «localhost» et «127.0.0.1»

vi ~/.ssh/known_hosts

#Remplacer la chaine de caractère après «localhost ssh-rsa» ci-dessous par celle de votre clé publique ainsi qu’après «127.0.0.1 ssh-rsa»
localhost ssh-rsa AZAAB3NzaC1yc2EAAAABIwAAAQEAv1GHHzkWHxNJjlyaizVsR75z6FY4XdeDm3zDFgomETLxmi0iO8v1rX6/2CJxONE7AzIS391VoyLIIxc9mRY1FlbwVCL5Iy+h3ZGgN+d6nv/7lGBFQEWOGpuMfeLht3dFydDvfC+Q4whvM4EUqEhM5DvZXnsSHPmf8YWKIelRinL3CdZEKEYsSwGKny5uXZoaP30jbs2wY52kxjS9fx0Ldy7Vl41OlMJo7C2ycEq4jcdBp65TUIKG5BgZh1aSkejApVp9YgThyEibq8Kv04s52QgSXGOWPrqCZ6qTCvqt0WrftSwxKOuHawBBlWEWuCJcFq8demz0tv1CId898Kql5w==
127.0.0.1 ssh-rsa AZAAB3NzaC1yc2EAAAABIwAAAQEAv1GHHzkWHxNJjlyaizVsR75z6FY4XdeDm3zDFgomETLxmi0iO8v1rX6/2CJxONE7AzIS391VoyLIIxc9mRY1FlbwVCL5Iy+h3ZGgN+d6nv/7lGBFQEWOGpuMfeLht3dFydDvfC+Q4whvM4EUqEhM5DvZXnsSHPmf8YWKIelRinL3CdZEKEYsSwGKny5uXZoaP30jbs2wY52kxjS9fx0Ldy7Vl41OlMJo7C2ycEq4jcdBp65TUIKG5BgZh1aSkejApVp9YgThyEibq8Kv04s52QgSXGOWPrqCZ6qTCvqt0WrftSwxKOuHawBBlWEWuCJcFq8demz0tv1CId898Kql5w==

L’image ci-dessous vous résume les opérations que vous avez dû réaliser.

Hadoop génération des cles SSH

Hadoop génération des cles SSH

Installation des sources

L’installation du «framework» n’impose pas de répertoire de travail en particulier. Je vous propose l’installation suivante :

  • Création du répertoire «hadoop-1.0.0» dans «/opt» : «mkdir /opt/hadoop-1.0.0»
  • Téléchargement du tarball
  • Décompression du tarball dans «/opt/hadoop-1.0.0/»
    • Modification des permissions :

    • «chown -R hadoop /opt/hadoop-1.0.0»
    • «chmod -R 755 hadoop /opt/hadoop-1.0.0»
  • édition du «.bashrc» (vi ~/.bashrc) pour rajouter à la variable «PATH» le chemin «/opt/hadoop-1.0.0/bin». Vous devrez adapter en fonction de votre répertoire d’installation. N’oubliez pas de «sourcer» votre «.bashrc».
    • Création des répertoires qui vont accueillir le HDFS

    • «mkdir /var/log/hadoop»
    • «mkdir /var/hdfs»
    • «mkdir /var/hdfs/metadata»
    • «mkdir /var/hdfs/data»
    • «mkdir /var/hdfs/tmp»
    • «chmod -R 755 /var/hdfs/»
    • «chown -R hadoop /var/hdfs/»
    • «chown hadoop /var/log/hadoop»

Configuration d’Hadoop

«Hadoop» embarque une configuration par défaut permettant le démarrage d’une instance en mode local avec un noeud. Nous allons démarrer «Hadoop» en mode cluster. Les fichiers de configuration se trouvent tous dans le répertoire «conf» soit «/opt/hadoop-1.0.0/conf» dans le cadre de notre installation.

    hadoop-env.sh

  • Il est nécessaire de renseigner le chemin de votre JVM. Recherchez la ligne «# The java implementation to use. Required» et adapter en fonction de votre installation : «export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home/»
  • Il peut y avoir des problèmes avec IPV6 et il est préférable d’utiliser IPV4. Recherchez la ligne suivante «# export HADOOP_OPTS=-server» et rajouter la ligne suivante : «export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true»
  • Renseignez le chemin du répertoire de log. Décommenter la ligne Il peut y avoir des problèmes avec IPV6 et il est préférable d’utiliser IPV4. Recherchez la ligne suivante «# export HADOOP_OPTS=-server» et rajoutez la ligne adéquate et adaptez à votre configuration
  • Ci-dessous, une image de ce que devrait ressembler votre fichier «hadoop-env.conf». Attention au chemin de votre JVM ! adaptez-le à votre configuration.
Hadoop : fichier de configuration

Hadoop : fichier de configuration

    core-site.xml

  • Ce fichier de configuration permet de définir entre autre le répertoire temporaire de travail du «file system» et de son nom par défaut. Il est tout à fait possible d’utiliser d’autres files systèmes compatibles avec le design HDFS. Nous pouvons citer celui de CASSANDRA «CFS».
  • Les fichiers de configuration sont presque tous des fichiers XML. Ils sont utilisés pour surcharger la configuration par défaut de votre «tarball». Vous trouverez ici l’ensemble des directives liées à ce fichier de configuration.
  • Ci-dessous, ce que devra contenir le fichier de configuration «core-site.xml»
<configuration>

<property>
  <name>hadoop.tmp.dir</name>
  <value>/var/hdfs/tmp</value>
</property>

<property>
  <name>fs.default.name</name>
  <value>hdfs://127.0.0.1:9000</value>
</property>

</configuration>
    hdf-site.xml

  • Il permet de définir la manière dont sera stockée les données au sein du file système. D’autres directives permettent de définir par exemple la stratégie de réplication au sein du cluster. Reportez-vous à la documentation pour plus d’information.
  • ci-dessous les directives en fonction de notre installation

<configuration>

<property>
  <name>dfs.data.dir</name>
  <value>/var/hdfs/data</value>
</property>

<property>
  <name>dfs.name.dir</name>
  <value>/var/hdfs/metadata</value>
</property>

<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>

</configuration>
    mapred-site.xml

  • Il définit le comportement des jobs de type Map Reduce.
  • Il existe de nombreuses options (http://hadoop.apache.org/common/docs/current/mapred-default.html) vous permettant de définir par exemple la mémoire à allouer ainsi que le nombre de map possible pour un job.
  • ci-dessous, nos directives de configuration
<configuration>

<property>
  <name>mapred.job.tracker</name>
  <value>127.0.0.1:54311</value>
</property>

<configuration/>
    hadoop-policy.xml & mapred-queue-acl.xml

  • La version 1.0.0 d’«Hadoop» introduit les ACL et la possibilité de restreindre certaines opérations sur la gestion des noeuds, sur les commandes d’administration et la soumission de jobs.
  • Pour notre installation, nous allons utiliser «hadoop». Vous pouvez aussi utiliser le caractère spécial «*» qui permet de désactiver les règles ACL et autoriser de-facto notre utilisateur «hadoop».
    log4j.properties

  • Comme dans tous les projets JAVA, «log4j» est utilisé pour la gestion des erreurs et l’enregistrement des évènements sur le service. Visitez le site du projet pour plus de détails sur les possibilités de configuration.
    masters & slaves

  • Ces fichiers permettent de définir les noeuds secondaires (slave) et le noeud principal (master).
  • Dans notre configuration, nous sommes à la fois «Master & Slave».
Hadoop : fichier de configuration

Hadoop : fichier de configuration

Formatage et lancement du service

Avant de pouvoir manipuler le HDFS ou de lancer des taches «Map Reduce», nous devons formater le HDFS. «Hadoop» embarque l’outillage de gestion et d’administration nécessaires. Veillez à exécuter les commandes de gestion et d’administration avec l’utilisateur «hadoop». Comme pour tout formatage, cette commande ne doit en aucun cas être faite sur un cluster démarré au risque de perdre l’intégralité des données.

Les commandes qui pourront être lancées, seront principalement du type : [nom de l’outil] [commande] [- option]. Pour le formatage du HDFS, nous lancerons la commande suivante : « bin/hadoop namenode -format». L’image ci-dessous vous montre ce que vous devriez obtenir.

Formatage du HDFS d'hadoop

Formatage du HDFS d'hadoop

»Haddop» est fin prêt pour être démarré ! Pour lancer l’ensemble des services, exécutez le script de démarrage global et vous devriez obtenir le résultat ci-dessous :

cd /opt/hadoop-1.0.0
bin/start-all.sh
demarrage hadoop

demarrage hadoop

En exécutant le script global, nous avons démarré l’ensemble des services nécessaires à la bonne exécution de nos futurs jobs «Map / Reduce». Ces services démarrent également des webUi qui vous permettront de contrôler l’exécution de vos jobs, de visualiser les logs liés aux tâches et de visualiser le contenu du HDFS.

  • http://127.0.0.1:50030/jobtracker.jsp : liste l’ensemble des tâches en cours de traitement, terminées et échouées,
  • http://127.0.0.1:50060/tasktracker.jsp : permet de visualiser une tâche,
  • http://127.0.0.1:50070/dfshealth.jsp : permet de visualiser le contenu du HDFS.
Gestion UI Hadoop

Gestion UI Hadoop

Gestion UI Hadoop

Gestion UI Hadoop

A la découverte du HDFS d’Hadoop

HDFS est un système de fichier distribué et se comporte comme n’importe quel système de fichiers standard. En plus des commandes usuelles, il nous permet d’importer des données depuis un autre système de fichiers et à l’inverse, d’en extraire sur le système de fichiers de votre machine. HDFS ne permet pas d’agir à la volée sur le contenu du contenant. Cela veut dire que si tout est fichier sur le HDFS, vous ne pouvez que lire le contenu d’un fichier. Par contre, le fichier en lui même peut être manipulé.

A travers la liste des commandes que nous allons aborder ci-dessous, nous ferons nos premières manipulations sur le HDFS. Pour cela, utiliser l’utilisateur «hadoop» que vous avez créé. Visitez la page d’Hadoop pour prendre connaissance de l’ensemble des commandes mises à votre disposition.

#Démarrage d’hadoop si ce n’est pas déjà fait
cd /opt/adoop-1.0.0
bin/start-all.sh

#Création du répertoire de «test»
hadoop fs -mkdir test

#Liste le contenu du hdfs par rapport à la racine du «home dir» du «user» «hadoop»
hadoop fs -ls

#Importation de fichiers de log d’hadoop dans le hdfs : adapter selon votre machine
hadoop fs -put /opt/hadoop-1.0.0/logs/hadoop-hadoop-datanode-Macintosh-2.local.log mon_log
hadoop fs -put /opt/hadoop-1.0.0/logs/hadoop-hadoop-datanode-Macintosh-2.local.log mon_log-2

#Bouger les log dans le répertoire test en utilisant le wildcard «*»
hadoop fs -mv mon* test/

#Extraction du fichiers de log «mon_log» sur le file système local
hadoop fs -get test/mon_log /var/hdfs/mon_log.txt
Hadoop manipulation hdfs

Hadoop manipulation hdfs

A la découverte d’Hadoop et de son système de fichiers HDFS : conclusion

Nous avons créé un environnement de stockage de BIG DATA. Dans notre exposé, nous avons importé des données de logs au sein du cluster. Il est d’usage d’importer dans l’entrepôt, des données dites nettoyées : c’est-à-dire utilisables par d’autres outils de BI.

Pour nettoyer les données et les rendre utilisables, c’est-à-dire requettable par un outil de BI, nous écrirons un script shell qui se chargera de lancer les tâches de Map / Reduce écrit en PHP à travers «Haddop streaming».

Nous aborderons tout cela dans un prochain billet : stay tuned !. Vos commentaires et vos retours d’expériences sur cette première partie sont les bienvenues !.

5 réflexions au sujet de « HADOOP, HIVE, Map Reduce avec PHP : part 1 »

  1. Bonjour,

    Merci pour votre tuto.
    J’ai un soucis lorsque je lance la commande hadoop fs -mkdir test
    La commande semble être lancée mais il ne se passe rien …. Rien dans les logs non plus….

    Auriez vous une idée?

    Cdt,

    • Bonjour,
      Lorsqu’une commande de type hadoop fs -[param] [chemin / name] aboutit, Hadoop ne retourne rien dans la console. Dans le cas d’un rmr, il vous signale la suppression du fichier ou du dossier.
      Comme vous avez créé un répertoire, vous devriez le visualiser avec la commande :
      hadoop fs -ls
      /user/hadoop/test

      Vous devriez visualiser l’action en faisant un tail -f [chemin_log]/hadoop-namenode[votre nom de machine].log
      Ce qui donne dans mon cas : tail -f /var/log/hadoop/hadoop-hadoop-namenode-Macintosh-2.local.log

  2. Ping : Big data et NoSQL - Arnaud Guignant

  3. Bonjour,

    J’ai lu pas mal de tuto sur ce sujet , je n’ai qu’une chose à dire « BRAVO ».
    Votre tuto est très clair , j’ai compris facilement comment résoudre tout les problèmes rencontrés lors de l’install .

    Encore un grand merci :-)

    • Merci bien pour votre commentaire et excusez moi du retard pour la publication. Je suis pas mal pris sur ces sujets de BigData. Je prépare un petit article sur le fonctionnement interne de CASSANDRA au niveau de l’écriture d’une Data. Cela donnera quelques explications sur le fonctionnement du Commitlog, de Memtable, de SSTable et de la compaction.

Répondre à sraymond Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>