Version 37 (modified by 16 years ago) (diff) | ,
---|
Soumission des Jobs
Table of Contents
Tous les fichiers nécessaires se trouvent dans le répertoire tutorial/material
que vous avez récupéré.
Premiers pas…
Principales Commandes
Les commandes permettant de soumettre et gérer un job commencent toutes par glite-wms-job-
et utilise les services d'un gLite WMS.
Note : pour soumettre et gérer un job avec l'ancien LCG RB, il faut utiliser les commandes edg-job-
. Ces commandes sont obsolètes et il faut préférer l'utilisation d'un WMS, sauf raisons très particulières. De même il ne faut pas utiliser les commandes glite-job-xxx
, elles-mêmes obsolètes.
Les principales commandes sont :
glite-wms-job-submit
: soumission d'un job. Cette commande nécessite un delegation proxy qui peut être créé automatiquement si on utilise l'option-a
ou être créé avec la commandeglite-wms-job-delegation-proxy
et être spécifié avec l'option-d identifieur
. L'utilisation de-d
doit être préférée si on soumet plusieurs jobs car elle est beaucoup plus efficace.
glite-wms-job-status
: affichage de l'état d'un job (en attente, en cours d'exécution, terminé...).
glite-wms-job-output
: récupération de l'output du job. Le répertoire utilisé pour stocker les résultats dépend de la configuration du site. Au LAL, le répertoire est~/JobOutput/
. Ce répertoire doit exister avant l'exécution de la commande : il faut le créer si nécessaire.
glite-wms-job-logging-info
: affichage d'informations détaillées sur l'exécution du job et les éventuelles erreurs rencontrées.
glite-wms-job-delegation-proxy -d identifieur
: obtention d'undelegation proxy
pour soumettre plusieurs jobs.identifieur
est un nom arbitraire qui sera utilisé pour désigner le delegation proxy et l'utiliser dans avec les commandes commeglite-wms-job-submit
.
Note: l'utilisation des commandes glite-wms-job-xxx
nécessite d'avoir un proxy valide.
Toutes les commandes ont une aide en ligne accessible en utilisant l'option --help
ou la commande man
.
La commande glite-wms-job-submit
retourne un jobid qui est un URL. Ce jobid devra être utilisé pour désigner le job dans les autres commandes. Il doit être conservé sans quoi il n'est plus possible d'interagir avec le job (connaitre son état ou récupérer son output). Quand on soumet plusieurs jobs, il peut être plus pratique d'utiliser l'option -o fichier
lors du submit : dans ce cas, le jobid sera écrit dans le fichier. Le même fichier pourra être utilisé à la place du paramètre jobid dans les autres commandes en utilisant l'option -i
.
Les commandes glite-wms-job-xxx
nécessitant d'avoir un proxy valide, il n'y a pas besoin de spécifier la VO utilisée pour ces commandes. Elle est obtenue à partir du proxy.
Il existe également des APIs (Java, C, C++) qui permettent la gestion des jobs depuis une application. Ce tutorial ne couvre pas la description de ces APIs.
Soumission d'un Job "Hello World"
Cette exercice consiste à soumettre un job très simple qui écrira "Hello World" dans le fichier d'output. Le job en lui-même n'a pas d'intérêt particulier mais permet d'illuster la soumission et le suivi de l'exécution d'un job. Un job grille est décrit dans un langage particulier appelé JDL], décrit dans la partie suivante.
- Si ce n'est pas déjà fait, créez un proxy à l'aide de la fonction
voms-proxy-init
. - Soumettez le job
HelloWorld.jdl
se trouvant dans le matériel du tutorial récupéré précédemment, en utilisant la commandeglite-wms-job-submit
. Sauver le jobid retourné ou utiliser l'option-o
. - Vérifiez le statut du job en utilisant la commande
glite-wms-job-status
. On peut utiliser la commandewatch
pour exécuter une commande dans une boucle (pour effectuer la commandeglite-wms-job-status
toutes les 15 secondes, utilisezwatch -n 15 glite-wms-job-status <jobid>
et taper ctrl-c pour sortir).- Suivez les modifications de l'état du job jusqu'à l'état "Done(Success)".
- Combien d'états différents pouvez-vous distinguer ?
- Si le job se termine dans l'état "Aborted", c'est qu'il y a eu une erreur. On peut trouver plus d'informations avec la commande
glite-wms-job-get-logging-info
.
- Lorsque le job est terminé (Status: Done (Success)), récupérez les données générées à l'aide de la commande
glite-wms-job-output
. - Vérifiez que tout s'est déroulé correctement en consultant les fichiers
std.out
etstd.err
. Le fichierstd.err
doit être vide etstd.out
doit contenir "Hello World". Cette procédure simple est utilisée pour le suivi de tous les jobs.
Description des Jobs (JDL)
Modification et Edition
Le fichier de description des jobs (JDL) utilise 1 langage particulier pour décrire les attributs et besoins du job. Ces informations sont utilisés par le WMS pour sélectionner le CE approprié à l'exécution du job et par le CE pour lancer l'application de l'utilisateur.
Le format de ce fichier est un ensemble de définition attribut/valeur, en utilisant le format suivant :
Attribut: Valeur;
Note: Attribut
n'est pas case sensitive. Certaines valeurs le sont, par exemple des noms de fichiers. Les chaines de caractères doivent être entre '
.
Les principaux attributs sont:
Executable
(obligatoire) : définit la commande à exécuter. S'il s'agit d'un shell script, le shell utilisé par le script (indiqué dans la ligne#!
) doit exister dans le worker node.Argument
(facultatif) : une chaine de caractère passée comme argument de la commande, en utilisant la syntaxe attendue par la commande.InputSandbox
(facultatif) : liste des fichiers locaux à transférer avec le job.OutputSandbox
(obligatoire) : liste des fichiers produits par le job et devant être retournés par la commandeglite-wms-job-output
. Il doit y avoir au moinsstdout
etstderr
.
Exercices :
- Modifiez le fichier
HelloWorld.jdl
de manière à ce qu'il n'appelle plus/bin/echo
mais le scriptHelloWorldScript.sh
. Pour cela :- la ligne
Executable
doit êtreHelloWorldScript.sh
- la ligne
Argument
peut rester avecHello World
- Il faut définir le paramètre
InputSandbox
. Tous les fichiers listés dansInputSandbox
sont transfèrés avec le job. Quand on soumet plusieurs jobs avec les mêmes fichiers d'entrée, une nouvelle copie des fichiers est créée pour chaque job.
- la ligne
- Modifier de nouveau
HelloWorld.jdl
de manière à ce qu'il appelle cette fois l'exécutablemyhostname
. Vous pouvez visualiser la source de cet exécutable, qui est un programme C :myhostname.c
. Vous n'avez cette fois pas besoin de définir d'argument. Il faut modifier la ligneInputSandbox
. Exécutez le job et vérifiez que tout fonctionne. Sur quel ordinateur a tourné votre job? - L'exécution d'un programme en C compilé n'est pas forcément pratique : l'exécutable peut être d'une grande taille, dépendre de plusieurs fichiers, ou dépendre d'un environnement d'exécution particulier.Une solution consiste à compiler le programme directement sur le CE. Modifier une nouvelle fois
HelloWorld.jdl
de manière à ce qu'il appelle le scriptbuildandrun.sh
, avec pour argumentmyhostname
. Testez ce script seul pour comprendre l'argument nécessaire.Exécutez le job et vérifiez qu'il fonctionne toujours. Votre job a-t-il tourné sur le même ordinateur que précédemment?
Note : si la VO que vous utilisez est acceptée par plusieurs CE, il peut être utile d'ajouter la ligne suivante dans votre JDL pour forcer le job à aller sur un CE particulier (au LAL dans l'exemple) :
Requirements = regexp(`.*\.lal\.in2p3\.fr:.*`, other.GlueCEUniqueID)
Pour comprendre les Requirements
and Rank
Il y a deux mots-clés très importants dans les fichiers JDL : Requirements
et `Rank . Leurs valeurs sont des expressions. Ces 2 mot-clés servent à sélectionner le CE auxquels sera envoyé le job.
Requirements
: ce mot-clé permet de sélectionner les CE qui ont les ressources requises pour exécuter le job. L'expression des ressources peut porter sur n'importe quelle information publié dans le système d'information (BDII). En particulier, le nombre de CPUs libres, le temps d'exécution minimum, la quantité de mémoire... La valeur est une condition logique utilisant une syntaxe assez habituelle (proche de celle du langage C). On peut utiliser desregular expressions
avec les chaines de caractères, en utilisant la fonctionRegExp(
pattern,attribut)
. Par exemple, pour sélectionner un CE appartenant au domainelal.in2p3.fr
, on pourra utiliser l'expression :Requirements = regexp(`.*\.lal\.in2p3\.fr:.*`, other.GlueCEUniqueID);
Rank
: cet mot-clé définit l'ordre de classement des CEs sélectionnés par la clauseRequirements
. Le CE sélectionné pour exécuter le job est celui ayant le meilleur classement suivant le critère défini parRank
. En cas d'ex-aequo, le CE est choisi aléatoirement parmi eux. Par exemple pour trier sur le nombre de CPUs libres dans le CE :Rank = other.GlueCEStateFreeCPUs;
Le résultat de l'évaluation de Requirements
et Rank
est différent suivant la VO utilisée car toutes les sites n'acceptent pas les mêmes VOs. On peut connaitre le résultat de l'évaluation de Requirements
et Rank
avant de soumettre le job en utilisant la commande glite-wms-job-list-match
et en indiquant le fichier JDL en paramètre. Cette commande retourne la liste des CEs sélectionnés par Requirements, classés dans l'ordre indiqué par Rank
. On peut exécuter cette commande pour une VO pour laquelle on a pas de proxy en ajoutant l'option --vo voname
(par exemple : --vo dteam
).
Exercices :
Dans les exercices proposés, vous allez éditer le fichier HelloWorld.jdl
pour modifier les expressions Requirements
et Rank
. Pour voir l'effet de la modification, utiliser la commande glite-wms-job-list-match
puis essayer de soumettre le job en utilisant la commande glite-wms-job-submit
. Pour soumettre le job, vous devez avoir un proxy valide.
- Sélectionner les sites qui acceptent des jobs nécessitant plus de 1 heure de CPU :
Requirements = (other.GlueCEPolicyMaxCPUTime > 60);
- Essayer de modifier la clause
Requirements
pour demander plus de 2h, plus de 12h. Indiquer le besoin en temps d'exécution total plutôt qu'en temps CPU (other.GlueCEPolicyMaxWallClockTime
). - Choisir uniquement des sites francais. Pour cela on peut utiliser la valeur suivante (d'abord seule puis en la combinant avec la précédente avec l'opérateur
&&
) :RegExp(`.*\.fr:.*`,other.GlueCEUniqueID)
- Ajoutez les lignes suivantes pour utiliser la ressource avec le plus grand nombre des CPUs libres et comparer le CE qui sera sélectionné.
Rank = other.GlueCEStateFreeCPUs;
- Utiliser la valeur
-other.GlueCEStateFreeCPUs
: quelle est l'effet ? - Que se passe-t-il si on utilise
Rank = 1;
?
Note : Une option
-r existe pour la commande
glite-wms-job-submit qui permet de choisir une ressource spécifique. Cependant cette option évite tous le processus
MatchMaking de Resource Broker et n'ajoute pasle fichier nécessaire (le fichier
BrokerInfo) pour la gestion de données. La technique avec other.GlueCEUniqueID est plus flexible et plus sûre.
Pour plus d'information, consulter la liste des attributs JDL valides.
L'environnent d'exécution sur le Worker Node
Chaque utilisateur de la grille est associé à un compte local, spécifique à chaque site. L'accès aux ressources locales est contrôlé par les droits de ce compte. Si on soumet plusieurs jobs en utilisant des proxies différents (VO et/ou groupe/rôle), on n'est pas associé au même compte sur le worker node. L'exercice suivant permet de l'illustrer.
Exercices :
- Initialiser votre proxy sans utiliser de groupe/rôle particulier.
- Visualisez le contenu du fichier JDL
whoami.jdl
. Lancez le job et récupérez l'output. Visualisez le fichierstd.out
. Sur quel compte êtes-vous mappé? - Visualisez le contenu du script
envvar.jdl
. Soumettez un job qui lance ce script dans la grille. Regardez la liste des variables. Combien de variables concernent la grille? - Ecrivez un job qui liste les versions des logiciels disponibles dans le
Worker Node
. On peut utiliser la commanderpm
pour le faire. - Initialiser un nouveau proxy en utilisant le rôle
Tutorial1
ouTutorial2
, suivant celui que vous avez le droit d'utiliser et reexécuter le fichier JDLwhoami.jdl
.
Renouveler le proxy en cours de job
Par défaut, la validité d'un proxy est relativement courte, généralement entre 12 et 96h. La durée maximale est fixée par le serveur VOMS de la VO. Si le proxy expire avant la fin du job, il ne sera pas possible de récupérer les résultats. S'il expire avant le début du job, le job échouera.
Pour permettre à un job de s'exécuter sans problème quelque soit son temps d'attente et sa durée, il faut utiliser un service de renouvellement de proxy, appelé MyProxy. Son utilisation est très simple. Il faut d'abord ajouter la ligne suivante dans le JDL du job (la valeur du paramètre doit être un serveur MyProxy acceptant la VO utilisée pour le voms-proxy-init
et le resource broker utilisé pour soumettre le job, myproxy.grif.fr
est le serveur MyProxy de GRIF) :
MyProxyServer = `myproxy.grif.fr`;
Après avoir fait le voms-proxy-init
et avant de soumettre le job, il faut exécuter la commande myproxy-init
, comme suit :
myproxy-init -d -s myproxy.grif.fr
La configuration d'un serveur MyProxy détermine les resource brokers autorisés à utiliser le service pour renouveler des proxies. Le serveur MyProxy de GRIF, myproxy.grif.fr
, accepte les demandes de renouvellement en provenance du RB de GRIF, grid09.lal.in2p3.fr
.
On peut voir la liste des proxies valides avec la commande myproxy-info
et on peut mettre fin au renouvellement du proxy (avant ou pendant l'exécution du job) avec la commande myproxy-destroy
. L'option
-d doit être toujours être utilisée avec l'ensemble des commandes myproxy-*.
Note : les commandes
myproxy-xxx utilisent un nom de fichier différent des autres commandes gLite si on utilise un fichier unique pour le certificat et la clé privée (extension
.p12). Pour résoudre le problème, il faut créer le lien symbolique suivant :
cd ~/.globus ln -s usercert.p12 usercred.p12
Soumission d'un job MPI
Beaucoup de disciplines utilisent des jobs parallèles. MPI (Message PassingInterface) est un protocole qui permet la communication entre les tâches parallèles. Les jobs MPIs sont supportés dans la grille. La grille permet d'utiliser les différentes versions et implémentations de MPI :
- MPI v1 : LAM MPICH
- MPI v2 : openMPI et MPICH2
Le logiciel mpi-start
développé par le projet européen int.eu.grid facilite l'utilisation du MPI dans la grille. L'utilisateur peut définir :
- Un script à exécuter avant le binaire MPI (par exemple pour compiler le programme),
- Le programme lui-même, et
- Un script à exécuter après le binaire MPI (par exemple pour enregistrer les résultats dans un SE).
Le fichier mpi-hooks.sh
définit les scripts à exécuter avant et après le binaire MPI. Le fichier JDL définit les paramètres comme des nombres de CPU pour le job.
- Lancez un job avec
mpi-start-lam.jdl
Regardez la sortie du job. S'il a fonctionné correctement, on pourra lire des lignes telles que:Hello world! from processor 3 out of 8
- Changez le nombre de CPUs utilisé par le job. Vérifiez que le job marche toujours. Fonctionne t-il aussi si vous spécifiez 1000 CPU?
La grille supporte les jobs MPI sur un seul site. MPI avec esclaves sur plusieurs sites n'est pas supporté. Le support du MPI évolue très rapidement dans la grille en ce moment. Ceci va se stabiliser dans quelques mois.
Les informations officielles à jour pour l'utilisation de MPI sur la grille EGEE sont disponibles sur le site EGEE UIG. Plus de détails sont disponibles sur le site du MPI Working Group.