3.4. Job Array

3.4.1. Generalidades

Por lo general, se presenta el caso en lo cual tenemos que mandar un numero largo de jobs, que son casi idénticos en los comandos a correr, cambiando por algún parámetro. Por ejemplo, un conjunto de 1000 grupos de secuencias que se requiere analizar con Blast. La primera idea suele ser escribir 1000 jobs, y mandarlos a correr. Allí es donde el Job Array ayuda.

El job Array es un script que sera ejecutado varias veces. Cada ejecución tendrá los mismos derechos que un script normal, en cuanto a tiempo, memoria , etc... La diferencia entre cada ejecución sera el valor de una variable de ambiente SGE_TASK_ID. Esta a cargo del script del job a utilizar de manera adecuada este valor para realizar la tarea correspondiente. La opción de qsub para iniciar un Job Array es -t [1]

$ qsub -t 1-1000 miscript.sh
Your job-array 53.1-1000:1 ("TestArray") has been submitted 
	

El script miscript correrá 1000 veces, la primera vez el valor de SGE_TASK_ID sera de 1, luego valdrá 2, y así enseguida hasta llegar a 1000. Si se requiere por una razón especifica, cada tercer numero, se usara la opción -t de esta manera. Y se verifica el estado de los jobs :

$ qsub -t 1-1000 miscript.sh
Your job-array 54.1-1000:4 ("TestArray") has been submitted
$ qstat
job-ID  prior   name       user         state submit/start at     queue                          slots ja-task-ID 
-----------------------------------------------------------------------------------------------------------------
53 0.55500 TestArray  jerome       qw    02/17/2016 11:37:46                                    1 1-1000:1
54 0.55500 TestArray  jerome       qw    02/17/2016 11:38:29                                    1 1-997:4
	

Como se puede notar, un job Array tiene un solo numero de job (JOBID), pero con numero de tareas. Y se pueden suprimir de manera muy eficiente, son el solo JOBID:

$ qdel 53 54
jerome has deleted job 53
jerome has deleted job 54
$ qstat
$
	

En caso de ser mas especifico, se puede suprimir una sola tarea, por ejemplo la 112, utilizando el qdel JOBID.112

3.4.2. Un primer caso concreto

Se presenta un ejemplo de uso de Job Array: se supone que se tiene 100 archivos nombrados muestras.X con X variando de 1 hasta 100. Se debe de procesar por un programa analyze disponible desde el PATH del usuario. La salida sera llamada resultados.X. El script siguiente generara el Job Array adecuado:

!#/bin/bash

# Nombre del Job
#$ -N AnalysisviaArray

# Para asegurar que todo va bien
echo "valor de task id : $SGE_TASK_ID"

# opción del programa  -i : input ; -o : output
analyze -i muestras.$SGE_TASK_ID -o resultados.$SGE_TASK_ID
	

3.4.3. Caso con Blast

Un job array es idóneo cuando se trata de analizar numero largo de secuencia con Blast. Se propone un ejemplo con 100 secuencias fasta (o grupos de secuencia) de nucleótidos. Como se trata de secuencias de supuestos genes, la búsqueda se hará sobre la base de datos de proteínas nr., con blastx. Queremos buscar las Se ha generado la lista de estos archivos fasta en un archivo llamado lista-secuencias.txt.

El script aquí propuesto debe de contemplar como sacar el nombre del archivo de secuencias que le toca, y entregar el resultado con un nombre relacionado con su numero de tarea. Si se usaría un nombre de salida común, ¡se sobrescribirían los resultados! una solución a este problema es lo siguiente:

#!/bin/bash

#$ -N ArrayBlast

# Tenemos 100 archivos a analizar
#$ -t 1-100

# Para el PATH
/share/apps/Profiles/share-profile.sh

# Ubicación de las bases de datos formateadas
export BLASTDB=/scratch/BlastDB/

# Nombre de la lista
LISTA=$HOME/lista-secuencias.txt

OutFile=out-$SGE_TASK_ID.txt

# Extraer el nombre del archivo que lo toca:
# tarea 10: linea 10 !
FILE=$(awk "NR==$SGE_TASK_ID" $LISTA)

# Ejecutar la búsqueda
blastx -query $FILE -db nr -evalue 0.001 -out $OutFile 
	

Notes

[1]

Ver el manual de qsub para mas detalles http://gridscheduler.sourceforge.net/htmlman/htmlman1/qsub.html