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
etfind
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
$ 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 utilisergoofys
) ; - 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.