Utilisation de HDFSAuteur : Julien Gauchet le 03/07/2017 (1 revision)

Ce cours explique comment est constitué et comment accéder au système de fichier distribué (HDFS) en ligne de ocmmandes ou grâce à java

1. 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.

2. 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.

2.1. Dialoguer avec HDFS

2.1.1 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"

2.1.2 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"

2.2. Parcourir les données

2.2.1 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

2.2.2 Afficher un fichier

Pour afficher un fichier, on utilise la commande cat

hadoop fs -cat /user/cloudera/fichier/part-m-00000

2.3. Modifier les données

2.3.1 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/'*'

2.3.2 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

2.3.3 Déplacer un fichier

Pour déplacer un fichier, on utilise la commande mv

hadoop fs -mv /user/cloudera/d1/'*' /user/cloudera/d2

2.3.4 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

3. Dans un programme java

3.1. 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>

3.2. 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();
}

3.3. 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