Prérequis :

Un parc de machines interconnectées sous linux avec un serveur ssh installé sur chaque machine. Dans le cadre de ce TP nous utiliserons les machines d'une salle de TDs. Un ensemble de machines virtuelles peut aussi être utilisé.

Etape 1: Téléchargement

Téléchargez les fichiers binaires de :

Décompressez install.tgz et placez tous les autres fichiers téléchargés dans le répertoire nommé install_files pour être compatible avec les scripts du tutorial.

Etape 2: Configuration des inter connexion entre les machines :

  • Récupérez les adresses IP des machines sur lesquelles vous voulez installer votre cluster hadoop. Au crémi les adresses sont de la forme 10.0.NUM_SALLE.NUM_MACHINE.
  • Créez un fichier host avec toutes les adresses IP les unes à la suite des autres (une ip par ligne du fichier). Placez ce fichier dans le répertoire nommé scripts pour rester compatible avec la suite du tutorial.
  • Utilisez le script - gen-cremi-hosts.sh pour vous simplifier le travail.

Etape 3: Connection ssh entre les machines

  • Créez une clé publique ssh, attention il ne faut pas mettre de passphrase dans la clé publique
ssh-keygen -t ecdsa -f ~/.ssh/id_ecdsa 
  • Copiez cette clé publique sur toutes les machines de votre cluster. Si vous utilisez un compte nfs partagé sur toutes les machines de votre cluster cette opération n'est pas indispensable.
MACHINE=`cat hosts`
for IP in $MACHINE
do
 ssh-copy-id $IP
done

Etape 4: Définition des paramètres d'installation d'Hadoop.

  • Choisissez un emplacement de répertoire dans lequel notre installation de hadoop sera effectuée. Dans toute la suite on utilise la variable CLUSTER_INSTALL_DIR pour faire référence à ce répertoire. Attention le système de fichier contenant CLUSTER_INSTALL_DIR sera utilisé pour stocker les données d'hadoop. Il faut donc qu'il soit en local (disque sur la machine) sur les machines du cluster. Au crémi, utilisez le répertoire /espace/VOTRE_NOM comme CLUSTER_INSTALL_DIR (attention à utiliser des anti slash dans vos path).
  • Dans la liste de vos machines, déterminez une machine qui servira de namenode (point d'entré de votre cluster). Utilisez la machine sur laquelle vous êtes connectés. Attention pour éviter les conflits de ports, il est préférable de ne pas faire tourner deux serveurs (namenode) sur la même machine. Dans la suite, on nomme cette machine CLUSTER_HOSTNAME et CLUSTER_HOST_NUMBER le dernier numéro de l'IP de cette machine.

Remplissez le fichier install-env.sh avec vos valeur.

Etape 5: Déploiement

copie des archives

  • Copiez et décompressez les archives hadoop, hbase et jdk dans le répertoire CLUSTER_INSTALL_DIR de toutes les machines du cluster.
#!/bin/bash                                                                                     
#                                                                                               
INSTALLDIR=$CLUSTER_INSTALL_DIR
TMPDIR=$CLUSTER_INSTALL_DIR/tmp
MACHINE=`cat hosts`
for IP in $MACHINE
do
 echo "[Start]: Computer "$IP
 echo "-- Copying"
 ssh $IP "mkdir -p $TMPDIR"
 scp -r ../install_files $IP:$TMPDIR/FILES
 echo "-- Untaring"
 ssh $IP "mkdir -p $INSTALLDIR"
 ssh $IP "cd $INSTALLDIR;tar xzvf $TMPDIR/FILES/hadoop* > $TMPDIR/res.txt"
 ssh $IP "cd $INSTALLDIR;tar xzvf $TMPDIR/FILES/jdk*    > $TMPDIR/res.txt"
 ssh $IP "cd $INSTALLDIR;tar xzvf $TMPDIR/FILES/hbase*  > $TMPDIR/res.txt"
 ssh $IP "mv $INSTALLDIR/jdk*     $INSTALLDIR/jdk"
 ssh $IP "mv $INSTALLDIR/hbase*   $INSTALLDIR/hbase"
 ssh $IP "mv $INSTALLDIR/hadoop*  $INSTALLDIR/hadoop"
 ssh $IP "rm -fr $TMPDIR/FILES; rm $TMPDIR/res.txt"
 echo "[done]"
done

Création du sytstème de fichier

Créez les répertoires nécessaires au stockage des données/métadonnées de hadoop et de hbase sur toutes vos machines.

  • namenode dir: réperoire ou toutes les métadonnées des blocs hdfs seront stockées
  • datanode_dir: réperoire ou les blocs de données seront stockées.
  • zookeeper_dir: répertoire de travail de zookeeper utlisé par HBASE
#!/bin/bash
#
INSTALLDIR=$CLUSTER_INSTALL_DIR
MACHINE=`cat hosts`
for IP in $MACHINE
do
 echo "[Start]: Computer "$IP
 echo "-- Installation"
 ssh $IP "mkdir -p $INSTALLDIR/DATA/namenode_dir"
 ssh $IP "mkdir -p $INSTALLDIR/DATA/datanode_dir"
 ssh $IP "mkdir -p $INSTALLDIR/DATA/zookeeper_dir"
 echo "[done]"
done

Utilisez le scritp copy_all_files.sh pour faire tout le déploiement. N'oubliez pas de nettoyer les fichiers de votre cluster à la fin du TP en utilisant le script clean_all.sh.

Etape 6: Configuration du cluster hadoop

Pour configurer hadoop et hbase il faut modififer les 7 fichiers de configuration suivants:

  • hadoop-env.sh : Fichier déclaration des variables d'environnement de hadoop.
  • hbase-env.sh : Fichier déclaration des variables d'environnement de hbase.
  • core-site.xml : Fichier commun pour les clients hdfs/yarn
  • hdfs-site.xml : Fichier de configuration du serveur hdfs et des répertoires de stockage des données.
  • yarn-site.xml configuration du gestionaire de ressources YARN
  • mapred-site.xml : Fichier de configuration pour utiliser map reduce
  • mapred-site.xml : Fichier de configuration pour utiliser hbase

hadoop-env.sh

Mofifiez la ligne:
 export JAVA_HOME=${JAVA_HOME}
en
 export JAVA_HOME=CLUSTER_INSTALL_DIR/jdk

hadoop-env.sh

habase-env.sh

Mofifiez les lignes:
 export JAVA_HOME=${JAVA_HOME}
 export HBASE_CLASSPATH=``
en
 export JAVA_HOME=CLUSTER_INSTALL_DIR/jdk
 export HBASE_CLASSPATH=`CLUSTER_INSTALL_DIR/hadoop/bin/hadoop classpath`

habase-env.sh

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
  <name>fs.default.name</name>
  <value>hdfs://CLUSTER_HOSTNAME:CLUSTER_HDFS_PORT</value>
 </property>
</configuration>

core-site.xml

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file://CLUSTER_INSTALL_DIR/DATA/namenode_dir</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file://CLUSTER_INSTALL_DIR/DATA/datanode_dir</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-bind-host</name>
    <value>0.0.0.0</value>
  </property>
</configuration>

hdfs-site.xml

mapred-site.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>mapreduce.jobtracker.address</name>
    <value>CLUSTER_HOSTNAME:8021</value>
  </property>

  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <description>Execution framework.</description>
  </property>

  <property>
    <name>yarn.app.mapreduce.am.resource.mb</name>
    <value>1024</value>
  </property>

  <property>
    <name>mapreduce.map.cpu.vcores</name>
    <value>1</value>
    <description>The number of virtual cores required for each map task.</description>
  </property>

  <property>
    <name>mapreduce.reduce.cpu.vcores</name>
    <value>1</value>
    <description>The number of virtual cores required for each map task.</description>
  </property>

  <property>
    <name>mapreduce.map.memory.mb</name>
    <value>1024</value>
    <description>Larger resource limit for maps.</description>
  </property>

  <property>
    <name>mapreduce.map.java.opts</name>
    <value>-Xmx1024m</value>
    <description>Heap-size for child jvms of maps.</description>
  </property>

  <property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>1024</value>
    <description>Larger resource limit for reduces.</description>
  </property>

  <property>
    <name>mapreduce.reduce.java.opts</name>
    <value>-Xmx1024m</value>
    <description>Heap-size for child jvms of reduces.</description>
  </property>
</configuration>

mapred-site.xml

yarn-site.xml

<?xml version="1.0"?>
<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>CLUSTER_HOSTNAME</value>
    <description>The hostname of the RM.</description>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    <description>shuffle service that needs to be set for Map Reduce to run </description>
  </property>
 <property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>Whether virtual memory limits will be enforced for containers</description>
 </property>
 <property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>10</value>
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
 </property>
 <property>
  <name>yarn.resourcemanager.bind-host</name>
  <value>0.0.0.0</value>
 </property>
</configuration>

yarn-site.xml

hbase-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://CLUSTER_HOSTNAME:CLUSTER_HDFS_PORT/hbase</value>
  </property>

  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>

  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>HBASE_QUORUM</value>
  </property>

   <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>file://CLUSTER_INSTALL_DIR/DATA/zookeeper_dir</value>
    <description>Property from ZooKeeper's config zoo.cfg.
      The directory where the snapshot is stored.
    </description>
   </property>

</configuration>

hbase-site.xml

Utilisez les script generate_conf.sh pour créer automatiquement tous ces fichiers. Utiliszer le script install_conf_files.sh pour déployer vos configurations sur le cluster.

Etape 7: Démarrage du cluster

  • lancez la commande source CLUSTER_INSTALL_DIR/user-env.sh
  • Formatez votre système de fichier distribué avec la commande hdfs namenode -format BigData_VOTRE_NOM
  • lancez la commande start-dfs.sh pour démarrer le cluster HDFS (Distributed file system)
  • lancez la commande start-yarn.sh pour démarrer le cluster YARN (ressource negociator)

Félicitation, votre cluster est installé !