Skip to content

Utilisation de goofys sur HPC2

Vous pouvez choisir de faire apparaître, dans un répertoire de votre système de fichiers, le contenu d'un bucket que vous possédez sur le stockage S3 du Mésocentre. Cela peut présenter plusieurs avantages :

  • vous naviguez dans vos objets facilement : pas besoin d'utiliser s3cmd pour lister ou parcourir, les commandes standard ls et find fonctionnent.
  • vous gérez vos objets facilement : renommage, copie, se font comme sur des fichiers normaux.
  • vous consultez vos objets sans avoir à les copier localement dans un répertoire auparavant : plus besoin de faire un s3cmd get, vos objets sont présents dans votre arborescence de fichiers. Ainsi, vos tâches de calcul qui nécessitent en entrée de gros fichiers de données peuvent y accéder sans avoir à les copier au préalable.

Configuration préalable pour goofys

Vous disposez déjà de votre compte S3 au Mésocentre, vous avez donc en votre possession votre clé d'accès et votre clé secrète (MYACCESSKEY et MYSECRETKEY).

$ export AWS_ACCESS_KEY_ID=MYACCESSKEY
$ export AWS_SECRET_ACCESS_KEY=MYSECRETKEY
Si vous n'avez pas besoin d'accéder à internet, pensez à effacer les proxy afin d'améliorer la rapidité des transferts:
$ unset http_proxy
$ unset https_proxy

Montage d'un bucket

On suppose :

  • que vous disposez dans votre S3 d'un bucket nommé monbucket42 (pour votre bucket, n'oubliez pas de respecter les contraintes de nommages énoncées ici sans quoi vous ne pourrez pas utiliser goofys) ;
  • qu'un répertoire mountpoint est disponible dans votre home (mkdir -p ~/mountpoint) même si en pratique il vaut mieux que ce répertoire soit dans /tmp;

On commence par charger le module goofys :

$ module load goofys/0.24.0

Puis on tape :

$ goofys --stat-cache-ttl 3600s --type-cache-ttl 3600s -uid $UID -gid $(id -g) --dir-mode=0777 --file-mode=0777 --cheap \
  --endpoint https://s3.mesocentre.uca.fr monbucket42 $HOME/mountpoint

Notes

En cas d'erreur du type main.FATAL Unable to mount file system, see syslog for details, vérifiez que votre clé d'accès et votre clé secrète sont correctes et exportées. Assurez-vous également que votre point de montage correspond à un dossier vide.

$ ls -alh ~/mountpoint
total 14K
drwx------  1 kalimos  crri  0 Jan  1  1970 .
drwx--x--x 28 kalimos  crri 48 Jun 13 15:22 ..
d---------  1 kalimos  root  0 Jan  1  1970 formation
d---------  1 kalimos  root  0 Jan  1  1970 matlabtest
$ find ~/mountpoint/
/home/kalimos/mountpoint/
/home/kalimos/mountpoint/formation
/home/kalimos/mountpoint/formation/tutoriel.txt
/home/kalimos/mountpoint/matlabtest
/home/kalimos/mountpoint/matlabtest/img00.tif
/home/kalimos/mountpoint/matlabtest/office_1.jpg
/home/kalimos/mountpoint/matlabtest/office_2.jpg
/home/kalimos/mountpoint/matlabtest/office_3.jpg
/home/kalimos/mountpoint/matlabtest/office_4.jpg
/home/kalimos/mountpoint/matlabtest/office_5.jpg
/home/kalimos/mountpoint/matlabtest/office_6.jpg
$ cat ~/mountpoint/formation/tutoriel.txt 
La première ligne de ce fichier texte ne contient rien d'intéressant.
La seconde ligne non plus.

Pour démonter le bucket :

$ fusermount -u ~/mountpoint

Le bucket est monté dans le répertoire spécifié uniquement sur le noeud à partir duquel la commande a été tapée. Par conséquent, pour un calcul sur plusieurs noeuds qui aurait besoin d'accéder à des données dans un bucket via goofys, on peut imaginer que le script du job fasse quelque chose comme :

#!/bin/bash

#SBATCH --job-name=monjobdecalcul
#SBATCH ...
#SBATCH ...

module load goofys
mount_dir=$(mktemp -d)
goofys --stat-cache-ttl 3600s --type-cache-ttl 3600s -uid $UID -gid $(id -g) --dir-mode=0777 --file-mode=0777 --cheap \
  --endpoint https://s3.mesocentre.uca.fr monbucket42 $mount_dir

mkdir -p $mount_dir/output_job_${SLURM_JOB_ID}

...
python moncalcul.py --repertoire_donnees=$mount_dir --repertoire_sortie=$mount_dir/output_job_${SLURM_JOB_ID}
...

fusermount -u $mount_dir
rmdir $mount_dir

Règles de bonnes pratiques

Dans le cas d'un job effectuant des accès concurrents aux objets S3 montés dans le répertoire, il est préférable que les données en entrée soient bien séparées des données en sortie, et qu'il n'y ait pas d'écriture ou de mouvement sur les objets consistituant les données en entrée. On peut faire comme dans l'exemple ci-dessus en s'assurant que notre calcul dépose ses données produites dans un autre répertoire du bucket que les répertoires servant aux données d'entrée. Il est préférable de monter le répertoire dans l'espace temporaire et non dans le home de l'utilisateur. Pour résumer : le job n'écrit pas sur les données en entrée, et met ses données en sortie dans un autre répertoire que les données en entrée.