Introduction
On appelle HDFS (Hadoop Distributed File System) le composant permettant de gérer les fichiers sur le cluser hadoop.
HDFS propose des outils permettant de gérer les fichiers comme s'il s'agissait d'un système de fichier classique à la différence qu'il n'est pas solidaire du noyau d'un système.
HDFS reprend de nombreux concepts proposés par des systèmes de fichiers classiques. Nous retrouvons donc la notion de blocs (la plus petite unité que l'unité de stockage peut gérer), les métadonnées qui permettent de retrouver les blocs à partir d'un nom de fichier, les droits ou encore l'arborescence des répertoires.
Un cluster HDFS se compose principalement d'un NameNode qui gère les métadonnées et DataNodes qui stockent les données réelles.
Les commandes hadoop fs
HDFS est piloté à l'aide de la commande hadoop fs. Cette commande possède des options qui sont les commandes associé au système de fichier distribué.
Les commandes hadoop fs possèdent des options qui sont proches des commandes linux de gestion du système de fichiers.
Dialoguer avec HDFS
Envoyer un fichier sur hdfs
Pour envoyer un fichier sur hdfs, on utilise la commande copyFromLocal de la manière suivante
hadoop fs -copyFromLocal -f "/home/fichier.txt" "/user/cloudera/fichier"
Récupérer en local un fichier sur hdfs
Pour récupérer un fichier présent sur hdfs, on utilise la commande copyToLocal
hadoop fs -copyToLocal "/user/cloudera/fichier" "/home/fichier.txt"
Parcourir les données
Lister les fichiers d'un répertoire sur hdfs
Pour lister les fichiers présents sur un répertoire, on utilise la commande ls
hadoop fs -ls /user/cloudera
Found 3 items
drwxr-xr-x - cloudera cloudera 0 2015-12-29 05:54 /user/cloudera/chargement
drwxr-xr-x - cloudera cloudera 0 2015-12-29 05:53 /user/cloudera/reception
drwxr-xr-x - cloudera cloudera 0 2015-12-29 05:55 /user/cloudera/tables_hive
Afficher un fichier
Pour afficher un fichier, on utilise la commande cat
hadoop fs -cat /user/cloudera/fichier/part-m-00000
Modifier les données
Supprimer un élément
Pour supprimer un fichier, on utilise rm
hadoop fs -rm /user/cloudera/fichier/part-m-00000
Pour supprimer un répertoire, on utilise l'option de rm -r. On peut supprimer la demande de confirmation à l'aide de l'option -f
hadoop fs -rm -f -r /user/cloudera/fichier
Pour supprimer le contenu d'un répertoire, on peut utiliser le caractère *, mais attention, il faut que celui-ci soit interprété par la commande hadoop fs et non par le shell. Il faut donc protéger * avec des quotes ou un backslash :
hadoop fs -rm -f /user/cloudera/fichier/'*'
Copier un fichier
Pour copier un fichier, on utilise la commande cp
hadoop fs -cp /user/cloudera/d1/'*' /user/cloudera/d2
L'option -f permet de supprimer les fichiers ayant le même nom que la source sans confirmation :
hadoop fs -cp -f /user/cloudera/d1/'*' /user/cloudera/d2
Déplacer un fichier
Pour déplacer un fichier, on utilise la commande mv
hadoop fs -mv /user/cloudera/d1/'*' /user/cloudera/d2
Créer un répertoire
Pour créer un répertoire, on utilise la commande mkdir
hadoop fs -mkdir /user/rep1
Pour recréer toute une arborescence, on utilise mkdir -p
hadoop fs -mkdir -p /user/r1/r2/r3
Dans un programme java
Utilisation des jars hadoop
Afin de pouvoir utiliser la classe FileSystem gérant les fichiers sur hdfs, il faut importer hadoop-common dans son projet. Ctte librairie ne sera utilisée que pour le développement, elle n'a pas besoin d'être exportée dans le livrable. Une fois sur le serveur, c'est la librairie du serveur qui sera utilisée.
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>jdk.tools</artifactId>
<groupId>jdk.tools</groupId>
</exclusion>
</exclusions>
</dependency>
Ecriture d'un programme java
La classe FileSystem permet de réaliser l'ensemble des opérations décrites ci-dessus. Pour plus d'informations sur cette classe, consultez la documentation sur internet. Le code ci-dessous montre comment initialiser cette classe.
/* Initialisation du FileSystem avec les fichiers de configuration d'hadoop */
Path hadoopConf = new Path("/etc/hadoop/conf");
Configuration conf = new Configuration();
conf.addResource(new Path(hadoopConf, "core-site.xml"));
conf.addResource(new Path(hadoopConf, "hdfs-site.xml"));
conf.addResource(new Path(hadoopConf, "mapred-site.xml"));
/* Création de l'instance de FileSystem */
try(FileSystem fs = FileSystem.newInstance(conf)){
/* Exemple d'envoi de fichier vers hdfs */
fs.copyFromLocalFile(new Path("/home/fichier"), new Path("/user/cloudera/reception/fichier"));
}
catch (IOException e) {
e.printStackTrace();
}
Lancement du programme java
Les librairies hadoop ne doivent pas faire partie de la livraison du programme, le classpath devrai être modifié afin d'inclure les librairies déjà présentes sur le serveur dans les dossiers suivants :
- /usr/lib/hadoop/client
- /usr/lib/hadoop
Le dossier /etc/hadoop/conf devra également être ajouté au classpath.
dosier_lib="/lib"
dossier_properties="/properties"
function creer_classpath {
classpath=
for jar in $1/*.jar
do
classpath="$classpath:$jar"
done
echo $classpath
}
classpath="$(creer_classpath $dossier_lib)"
hadoop_classpath="$(creer_classpath /usr/lib/hadoop/client)"
hadoop_classpath="$hadoop_classpath:$(creer_classpath /usr/lib/hadoop)"
hadoop_classpath="$hadoop_classpath:/etc/hadoop/conf"
java7 -cp "$hadoop_classpath:$classpath" -Dproperties.path=$dossier_properties package.Lanceur