Sistemas y servicios informáticos para Internet. Curso 2009-2010
Tabla de contenidos
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.
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 $
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.
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:
El nombre.
El sistema operativo.
La arquitectura.
Su estado actual (Claimed cuando ha sido reclamada para ejecutar un trabajo, Unclaimed cuando no está ejecutando trabajo u otros como Matched).
Tipicamente Busy or Idle.
La carga media de la máquina.
La memoria de la máquina en megabytes.
Tiempo durante el cual la máquina ha estado haciendo lo que indica actualmente.
Comprueba también el ClassAd de las máquinas del pool
$>
condor_status -l | more
...
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
Identificador el trabajo (Cluster.Proceso).
El dueño del trabajo.
Fecha en la que el trabajo fue enviado.
Tiempo durante el cual el trabajo ha estado en ejecución
Estado del trabajo (I significa idle y R running)
Indica la prioridad del trabajo, desde -20 a +20, donde los números mayores significan mayor prioridad.
El tamaño del ejecutable en megabytes.
El nombre del ejecutable.
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
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.
Ahora vamos a crear el fichero de descripción del trabajo para que condor lo ejecute.$>
chmod +x hola$>
./hola Hola mundo
$>
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
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
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.
Ahora vamos a crear un fichero de descripción que llame a este programa varias veces con parámetros distintos.$>
chmod +x print$>
./print hola Hola$>
./print 1 1
$>
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
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.