hit counter

Sistemas y servicios informáticos para Internet. Curso 2009-2010

Capítulo 2. Gestión de trabajos en Condor

Tabla de contenidos

2.1. Introducción
2.2. Información sobre condor
2.3. Información sobre el pool
2.4. Información sobre los trabajos
2.5. Enviando trabajos a condor
2.6. Barrido de parámetros

2.1. Introducción

Antes de empezar hay que conectarse a tecgrid03.epv.uniovi.es, la máquina donde se van a realizar las prácticas. La conexión debe ser ssh, por lo que es necesario utilizar un cliente que soporte este protocolo. Se recomienda utilizar el PuTTY.

Nota

Se pueden transferir ficheros con un programa que soporte el protocolo SCP, como por ejemplo WinSCP. Este programa también se puede utilizar para editar los ficheros, en caso que tus conocimientos del emacs o del vi estén un poco oxidados.

2.2. Información sobre condor

En primer lugar vamos a comprobar que condor está instalado.

$> condor_version
$CondorVersion: 7.0.1 Feb 26 2008 BuildID: 76180 $
$CondorPlatform: I386-LINUX_RHEL3 $

Nota

Para obtener más información sobre un comando de condor concreto puedes utilizar el man o mirar el manual online en la página web de condor.

A continuación se puede ver donde está condor instalado y el resto de comandos disponibles.

$> condor_config_val BIN
/opt/condor/bin/
$> ls `condor_config_val BIN`
condor                 condor_q                    condor_userprio
condor_checkpoint      condor_qedit                condor_vacate
condor_check_userlogs  condor_release              condor_vacate_job
condor_cod             condor_reschedule           condor_version
condor_compile         condor_rm                   condor_wait
condor_config_val      condor_run                  stork_get_cred
condor_dagman          condor_stats                stork_list_cred
condor_dump_history    condor_status               stork_q
condor_findhost        condor_submit               stork_rm
condor_glidein         condor_submit_dag           stork_rm_cred
condor_history         condor_transfer_data        stork_status
condor_hold            condor_transferer           stork_store_cred
condor_load_history    condor_userlog              stork_submit
condor_prio            condor_userlog_job_counter

Condor accede a la configuración a través de la variable de entorno $CONDOR_CONFIG.

$> echo $CONDOR_CONFIG
/opt/condor/etc/condor_config

Se puede observar el contenido del fichero.

$> more $CONDOR_CONFIG

...

##  Part 1:  Settings you must customize:
######################################################################
######################################################################

##  What machine is your central manager?
CONDOR_HOST = iceage-ce-01.ct.infn.it

##--------------------------------------------------------------------

...

También se puede leer la configuración con el comando condor_config_val.

$> condor_config_val -v CONDOR_HOST
CONDOR_HOST: iceage-ce-01.ct.infn.it
  Defined in '/opt/condor/etc/condor_config', line 55.

Podemos ver dónde se encuentran todos los ficheros de configuración.

$> condor_config_val -config
Configuration source:
        /opt/condor/etc/condor_config
Local configuration source:
        /var/condor/condor_config.local

La lista de demonios en el fichero de configuración indica los servicios que tiene activos esta máquina.

$> cat /var/condor/condor_config.local | grep DAEMON_LIST
DAEMON_LIST = MASTER, SCHEDD

A continuación vamos a comprobar que dichos servicios de condor se están ejecutando.

$> ps aux | grep condor | grep -v grep
condor    5657  0.0  0.0  8160 3164 ?        Ss   Jan08   9:47 /opt/condor/sbin/condor_master
condor    5658  0.0  0.0  8876 4128 ?        Ss   Jan08   0:06 condor_schedd -f
root      5659  0.0  0.0  4860 2116 ?        S    Jan08   9:03 condor_procd -A /tmp/condor ...

El servicio master es el encargado de iniciar el resto de servicios en función del roll de la máquina. El servicio schedd indica que esta máquina es una máquina de envío. Por último, el servicio procd se encarga de tareas administrativas.

Nota

Si la máquina tuviera el rol de ejecución debería estar funcionando el servicio condor_startd.

2.3. Información sobre el pool

Para comprobar el estado del pool se puede utilizar el comando condor_status.

$> condor_status

Name               OpSys      Arch   State     Activity LoadAv Mem   ActvtyTime

slot1@iceage-wn-01 LINUX      INTEL  Unclaimed Idle     0.000  1012  1+18:07:44
slot2@iceage-wn-01 LINUX      INTEL  Unclaimed Idle     0.000  1012  3+23:00:32
slot3@iceage-wn-01 LINUX      INTEL  Unclaimed Idle     0.000  1012195+14:00:39
slot4@iceage-wn-01 LINUX      INTEL  Unclaimed Idle     0.000  1012  0+03:15:07
slot1@iceage-wn-02 LINUX      INTEL  Unclaimed Idle     0.000  1012195+14:00:44
slot2@iceage-wn-02 LINUX      INTEL  Unclaimed Idle     0.000  1012195+14:00:45
slot3@iceage-wn-02 LINUX      INTEL  Unclaimed Idle     0.000  1012195+14:21:30
slot4@iceage-wn-02 LINUX      INTEL  Unclaimed Idle     0.010  1012  0+03:15:07
slot1@iceage-wn-03 LINUX      INTEL  Unclaimed Idle     0.000  1012195+14:21:30
slot2@iceage-wn-03 LINUX      INTEL  Unclaimed Idle     0.000  1012  0+03:15:07

...

slot3@iceage-wn-12 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:30:54
slot4@iceage-wn-12 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:30:55
slot1@iceage-wn-13 LINUX      INTEL  Unclaimed Idle     0.020  1012  0+02:20:04
slot2@iceage-wn-13 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:31:06
slot3@iceage-wn-13 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:31:07
slot4@iceage-wn-13 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:31:08
slot1@iceage-wn-14 LINUX      INTEL  Unclaimed Idle     0.100  1012  0+02:20:04
slot2@iceage-wn-14 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:31:10
slot3@iceage-wn-14 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:31:11
slot4@iceage-wn-14 LINUX      INTEL  Unclaimed Idle     0.000  1012 20+18:31:12

                     Total Owner Claimed Unclaimed Matched Preempting Backfill

         INTEL/LINUX    56     0       0        56       0          0        0

               Total    56     0       0        56       0          0        0
Para cada máquina se obtiene la siguiente información:
Name

El nombre.

OpSys

El sistema operativo.

Arch

La arquitectura.

State

Su estado actual (Claimed cuando ha sido reclamada para ejecutar un trabajo, Unclaimed cuando no está ejecutando trabajo u otros como Matched).

Activity

Tipicamente Busy or Idle.

LoadAv

La carga media de la máquina.

Mem

La memoria de la máquina en megabytes.

ActivityTime

Tiempo durante el cual la máquina ha estado haciendo lo que indica actualmente.

Nota

Para obtener más información sobre el comando que muestra el estado del pool se puede ejecutar condor_status -h

Comprueba también el ClassAd de las máquinas del pool

$> condor_status -l | more

...

2.4. Información sobre los trabajos

Para obtener información sobre los trabajos que se están ejecutando en el pool se puede utilizar el comando condor_q.

$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD

0 jobs; 0 idle, 0 running, 0 held
No hay ningún trabajo ejecutándose en el pool. En caso de que hubiera algún trabajo el resultado de la ejecución del comando anterior sería diferente.
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD
  26.0   ruf             1/28 11:21   0+00:00:00 R  0   0.0  mi_programa

1 jobs; 0 idle, 1 running, 0 held

Nota

Para obtener información sobre los trabajos en todas las colas se puede usar condor_q -global
La información que se proporciona para cada trabajo es la siguiente:
ID

Identificador el trabajo (Cluster.Proceso).

OWNER

El dueño del trabajo.

SUBMITTED

Fecha en la que el trabajo fue enviado.

RUN_TIME

Tiempo durante el cual el trabajo ha estado en ejecución

ST

Estado del trabajo (I significa idle y R running)

PRI

Indica la prioridad del trabajo, desde -20 a +20, donde los números mayores significan mayor prioridad.

SIZE

El tamaño del ejecutable en megabytes.

CMD

El nombre del ejecutable.

Nota

Al igual que con el comando condor_status se puede ejecutar condor_q -h para ver las posibilidades que ofrece este comando.

2.5. Enviando trabajos a condor

Antes de empezar, vamos a crear una estructura de directorios que organicen los ejercicios que se van a realizar.

$> cd ~
$> mkdir condor
$> cd condor

Vamos a crear también un shell script que se encargue de borrar los ficheros que se van a ir generando como salida de los trabajos.

$> cat > clean

A continuación copia y pega el siguiente listado y, por último, pulsa Ctrl-D.

#!/bin/sh
rm -f `find ~/condor -name '*.log'`
rm -f `find ~/condor -name '*.out'`
rm -f `find ~/condor -name '*.error'`
rm -f `find ~/condor -name '*.err'`

Verifica que el contenido del fichero es el correcto y dale permisos de ejecución.

$> cat clean
#!/bin/sh
rm -f `find ~/condor -name '*.log'`
rm -f `find ~/condor -name '*.out'`
rm -f `find ~/condor -name '*.error'`
rm -f `find ~/condor -name '*.err'`
$> chmod +x clean
$> ./clean

Nota

La forma en la que se acaba de crear el fichero clean será la que utilicemos para crear la mayoría de los ficheros durante estas prácticas.

Como no podía ser de otra forma, vamos a empezar con un clásico: el hola mundo. En primer lugar vamos a crear una carpeta para contener los ficheros que vamos a crear.

$> mkdir ~/condor/hola
$> cd ~/condor/hola

Ahora vamos a crear un shell script que imprima el mensaje.

$> cat > hola

Pega el siguiente listado y pulsa Ctrl-D.

#!/bin/sh
echo "Hola mundo"

Le damos permisos de ejecución y verificamos que funciona.

$> chmod +x hola
$> ./hola
Hola mundo
Ahora vamos a crear el fichero de descripción del trabajo para que condor lo ejecute.
$> cat > hola.sub

Pega el siguiente listado y pulsa Ctrl-D.

Universe                = vanilla
Executable              = hola
Log                     = hola.log
Output                  = hola.out
Error                   = hola.error
should_transfer_files   = YES
when_to_transfer_output = ON_EXIT
Queue

El significado de los parámetros del fichero de descripción queda bastante claro. De momento se está utilizando el universo vanilla, válido para cualquier trabajo secuencial.

Ahora utilizamos el comando condor_submit para que ejecutar el trabajo sobre el pool de condor.

$> condor_submit hola.sub
Submitting job(s).
Logging submit event(s).
1 job(s) submitted to cluster 28.

A continuación vamos a esperar a que se termine de ejecutar.

$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD
  28.0   ruf             1/29 08:30   0+00:00:01 R  0   0.0  hola

1 jobs; 0 idle, 1 running, 0 held
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD

0 jobs; 0 idle, 0 running, 0 held

Atención

Si el trabajo queda en estado held quiere decir que hubo un problema durante la ejecución. Comprueba el log para obtener más obtener más detalles.

Cuando el trabajo ha terminado su ejecución desaparece de la lista. Para comprobar lo que ocurrió durante la ejecución del trabajo se puede mirar el contenido del fichero de log.

$> cat hola.log
000 (029.000.000) 01/29 08:39:06 Job submitted from host: <193.206.208.149:9602>
...
001 (029.000.000) 01/29 08:39:15 Job executing on host: <193.206.208.205:9680>
...
005 (029.000.000) 01/29 08:39:15 Job terminated.
        (1) Normal termination (return value 0)
                Usr 0 00:00:00, Sys 0 00:00:00  -  Run Remote Usage
                Usr 0 00:00:00, Sys 0 00:00:00  -  Run Local Usage
                Usr 0 00:00:00, Sys 0 00:00:00  -  Total Remote Usage
                Usr 0 00:00:00, Sys 0 00:00:00  -  Total Local Usage
        11  -  Run Bytes Sent By Job
        28  -  Run Bytes Received By Job
        11  -  Total Bytes Sent By Job
        28  -  Total Bytes Received By Job
...

Parece que todo ha ido bien, sólo queda comprobar el resultado de la ejecución del trabajo.

$> cat hola.out
Hola mundo

2.6. Barrido de parámetros

Un fichero de descripción de un trabajo en condor puede servir para enviar más de un trabajo. Por ejemplo, se puede tener un programa que se quiere que se ejecute con diferentes parámetros u opciones. Vamos a hacer un ejemplo que compruebe esta funcionalidad.

En primer lugar, vamos crear un directorio que contenga el nuevo ejercicio.

$> mkdir ~/condor/print
$> cd ~/condor/print

Ahora vamos a crear un shell script que imprima el valor que recibe como parámetro.

$> cat > print

Pega el siguiente listado y pulsa Ctrl-D.

#!/bin/sh
echo $1

Le damos permisos de ejecución y verificamos que funciona.

$> chmod +x print
$> ./print hola
Hola
$> ./print 1
1
Ahora vamos a crear un fichero de descripción que llame a este programa varias veces con parámetros distintos.
$> cat > print.sub
Universe                = vanilla
Executable              = print
Log                     = print.$(Process).log
Output                  = print.$(Process).out
Error                   = print.$(Process).error
should_transfer_files   = YES
when_to_transfer_output = ON_EXIT

Arguments  = Hola
Queue

Arguments  = Adios
Queue

Como se puede observar, se hace uso de la macro $(Process) que condor sustituye por el número de proceso. De esta forma, se pueden parametrizar los ficheros que utiliza cada trabajo. La opción Arguments permite especificar argumentos al programa ejecutable. La opción Queue, en este caso, se pone dos veces para enviar dos trabajos.

Vamos a enviar los trabajos y a comprobar el resultado.

$> condor_submit print.sub
Submitting job(s)..
Logging submit event(s)..
2 job(s) submitted to cluster 33.
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD
  33.0   ruf             1/29 09:13   0+00:00:00 I  0   0.0  print Hola
  33.1   ruf             1/29 09:13   0+00:00:00 I  0   0.0  print Adios

2 jobs; 2 idle, 0 running, 0 held
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD

0 jobs; 0 idle, 0 running, 0 held
$> ls *.out *.log
print.0.log  print.0.out  print.1.log  print.1.out
$> cat print.0.out print.1.out
Hola
Adios

Nota

Recuerda que puedes borrar los ficheros que se crean durante la ejecución de los trabajo con el script clean que se creó al principio, basta con ejecutar ~/condor/clean

Vamos a crear un nuevo fichero de descripción de trabajo para ejecutar 10 veces el shell script.

$> cat > print10.sub
Universe                = vanilla
Executable              = print
Log                     = print.$(Process).log
Output                  = print.$(Process).out
Error                   = print.$(Process).error
should_transfer_files   = YES
when_to_transfer_output = ON_EXIT

Arguments  = $(Process)
Queue 10

A continuación, se pueden enviar los trabajos y observar el resultado.

$> condor_submit print10.sub
Submitting job(s)..........
Logging submit event(s)..........
10 job(s) submitted to cluster 36.
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD
  36.0   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 0
  36.1   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 1
  36.2   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 2
  36.3   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 3
  36.4   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 4
  36.5   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 5
  36.6   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 6
  36.7   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 7
  36.8   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 8
  36.9   ruf             1/29 09:31   0+00:00:00 R  0   0.0  print 9

10 jobs; 0 idle, 10 running, 0 held
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD
  36.1   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 1
  36.2   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 2
  36.3   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 3
  36.5   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 5
  36.6   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 6
  36.7   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 7
  36.8   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 8
  36.9   ruf             1/29 09:31   0+00:00:02 R  0   0.0  print 9

8 jobs; 0 idle, 8 running, 0 held
$> condor_q


-- Submitter: glite-tutor2.ct.infn.it : <193.206.208.149:9602> : glite-tutor2.ct.infn.it
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD

0 jobs; 0 idle, 0 running, 0 held

Comprueba que los ficheros generados contienen los datos esperados (10 ficheros con 10 números del 0 al 9).

Verifica donde se han ejecutado los trabajos.

$> cat *.log | grep executing

...

Si se vuelven a enviar estos trabajos se pueden observar los procesos que se crean.

$> condor_submit print10.sub
Submitting job(s)..........
Logging submit event(s)..........
10 job(s) submitted to cluster 36.
$> ps aux | grep condor
condor    5657  0.0  0.0  8160 3164 ?        Ss   Jan08  10:35 /opt/condor/sbin/condor_master
condor    5658  0.0  0.1  9352 4724 ?        Ss   Jan08   0:08 condor_schedd -f
root      5659  0.0  0.0  4860 2116 ?        S    Jan08   9:49 condor_procd -A /tmp/condor...
condor   14723  0.0  0.0  8536 2432 ?        S    09:37   0:00 condor_shadow -f 37.9 --schedd=...
condor   14724  0.0  0.0  8260 2444 ?        S    09:37   0:00 condor_shadow -f 37.1 --schedd=...
condor   14725  0.0  0.0  7452 2436 ?        S    09:37   0:00 condor_shadow -f 37.4 --schedd=...

...

En la máquina de envio se crea un proceso condor_shadow por cada trabajo enviado, cuyo cometido es monitorizar la ejecución de cada uno de ellos.

Atención

Cuando termines la sesión de prácticas, borra los ficheros que se han ido generando durante la ejecución de los trabajos con ~/condor/clean y guarda una copia del resto (Puede usar el WinSCP).