Ещё о JDL (Job Description Language)
- Простейший JDL
- JDL c атрибутами input/output sandbox
- Выполнение программы пользователя
- JDL с ограничениями
- Проблемы при запуске задания
- JDL и ранжирование ресурсов
Простейший JDL
Ниже представлен простейший пример описания задания для запуска в Грид. Здесь просто на рабочем узле (Worker Node) запускается команда, заданная в атрибуте Executable. Атрибут OutputSandbox задаёт файлы, которые вы хотите получить обратно после завершения задания; в данном случае это файлы, куда переправляются потоки со стандартным выводом и сообщениями об ошибках, которые определяются атрибутами StdOutput и StdError соответственно. Также задаётся количество попыток перезапуска в случае какого-либо сбоя.
$ cat hostname.jdl Type = "Job"; JobType = "Normal"; Executable = "/bin/hostname"; StdOutput = "hostname.out"; StdError = "hostname.err"; OutputSandbox = {"hostname.err","hostname.out"}; Arguments = "-f"; ShallowRetryCount = 1;
Можно получить результаты выполнения задания после того как его статус стал Done и просмотреть результаты (как это сделать, можно посмотреть в практикуме Запуск задания с использованием интерфейса WMS proxy).
$ cat /tmp/glite/glite-ui/catania41_xSyW18HoE_hIbfCdDHr10w/hostname.out grid026.ct.infn.it
JDL c атрибутами input/output sandbox
- В этом примере будет продемонстрировано следующее:
- в список файлов, задаваемых атрибутом InputSandbox добавляется входной файл, с тем чтобы он был скопирован на узел с WMS (Workload Management System), а затем передан на рабочий узел, где будет выполняться задание.
- стандартные выходные файлы добавляются в атрибут OutputSandbox, который задаёт строку или список строк с именами файлов, которые создаются на рабочем узле в результате выполнения задания и которые пользователь хочет получить обратно.
Это задание просто запускает команду ls
на ресурсе, выбраном для выполнения задания.
$ cat testsandbox.jdl Type = "Job"; JobType = "Normal"; Executable = "/bin/sh"; Arguments = "testsandbox.sh"; StdOutput = "testsandbox.out"; StdError = "testsandbox.err"; InputSandbox = "testsandbox.sh"; OutputSandbox = {"testsandbox.err","testsandbox.out"}; ShallowRetryCount = 1;
Ниже показан сам скрипт, который вызывает команду ls
.
$ cat testsandbox.sh #!/bin/bash ls -l
Вы можете запустить задание, как обычно, создав два файла testsandbox.jdl и testsandbox.sh и заполнить их вышеприведённым содержимым. Затем запустить задание на выполнение:
$ glite-wms-job-submit -d $USER -o jobid testsandbox.jdl
Проверяем статус задания при помощи команды glite-wms-job-status и после того, как статус стал Done, получаем выходные файлы. В директории с результатами можно увидеть файлы, имена которых были указаны в атрибуте OutputSandbox.
$ ll /tmp/glite/glite-ui/catania41_S0g7xr7QZ4jSrWlkektvXA total 4 -rw-r--r-- 1 catania41 users 0 Jul 24 13:00 testsandbox.err -rw-r--r-- 1 catania41 users 352 Jul 24 13:00 testsandbox.out
Проверяем содержимое выходных файлов:
$ cat /tmp/glite/glite-ui/catania41_S0g7xr7QZ4jSrWlkektvXA/testsandbox.out total 3 -rw-r--r-- 1 gilda008 gilda 0 Jul 24 12:55 testsandbox.err -rw-r--r-- 1 gilda008 gilda 0 Jul 24 12:55 testsandbox.out -rw-r--r-- 1 gilda008 gilda 18 Jul 24 12:55 testsandbox.sh
Выполнение программы пользователя
Этот короткий пример показывает самый общий путь, которому должны следовать пользователи для того чтобы запускать в Грид свои собственные задания; если исполняемый файл не очень большой (в пределах 10МБ) его можно передать через InputSandbox. Заметим, что исполняемый файл не указывается напосредственно в атрибуте Executable, но он запускается из скрипта, который устанавливает правильные переменные окружения и выполняет другие необходимые действия для корректного запуска задания.
Создадим файл с именем yourexe.jdl и занесём в него следующе описание задания:
$ cat yourexe.jdl Type = "Job"; JobType = "Normal"; Executable = "/bin/sh"; Arguments = "script.sh INSERT_YOUR_NAME"; StdOutput = "script.out"; StdError = "script.err"; InputSandbox = {"script.sh","myexecutable"}; OutputSandbox = {"script.out","script.err","exe.out"}; ShallowRetryCount = 1;
Бинарный файл myexecutable просто распечатывает некоторый текст приветствия и аргумент, полученный как входной параметр. Скрипт только обеспечивает правильную установку окружения. Сам файл можно скачать отсюда: myexecutable.
Если Вы хотите скачать его прямо из linux shell, то используйте wget:wget http://egee.pnpi.nw.ru/files/myexecutable
И, наконец, Вы должны в той же самой директории, где находятся бинарный файл и файл описания задания, создать файл скрипта script.sh со следующим содержимым:
cat script.sh #!/bin/sh # On the worker node you may have not # execution rights echo "setting right permissions" chmod 755 myexecutable # run example passing as argument the shell script argument # and redirecting its output on exe.out file echo "executing program now..." ./myexecutable $1 > exe.out
Проверьте, так ли всё работает, как надо, запустив задание и получив выходные файлы.
JDL с ограничениями
Атрибут Requirements позволяет вводить ограничения на вычислительные ресурсы, например Вы можете запросить определённые ресурсы, которые удовлетворяют определённым условиям на установленное программное обеспечение.
В первом примере задание может быть передано для выполнения в одну из трёх очередей, которые заданы в атрибуте Requirements. Отметим логическиё оператор ||, обозначающий логическое ИЛИ.
$ cat hostnamereq1.jdl [ Type="Job"; JobType="Normal"; Executable = "/bin/hostname"; Arguments = "-f"; StdError = "stderr.log"; StdOutput = "stdout.log"; OutputSandbox = {"stderr.log", "stdout.log"}; ShallowRetryCount = 1; Requirements = ( other.GlueCEUniqueID == "grid010.ct.infn.it:2119/jobmanager-lcgpbs-short" || other.GlueCEUniqueID == "grid004.iucc.ac.il:2119/jobmanager-lcgpbs-long" || other.GlueCEUniqueID == "gildace.oact.inaf.it:2119/jobmanager-lcgpbs-short" ); ]
Создайте файл с вышеприведённым содержимым (можно просто модифицировать файл hostname.jdl, созданый ранее) и запустите задание на выполнение:
$ glite-wms-job-submit -d $USER hostnamereq1.jdl Selected Virtual Organisation name (from proxy certificate extension): gilda Connecting to host glite-rb3.ct.infn.it, port 7772 Logging to host glite-rb3.ct.infn.it, port 9002 ********************************************************************************************* JOB SUBMIT OUTCOME The job has been successfully submitted to the Network Server. Use glite-job-status command to check job current status. Your job identifier is: - https://glite-rb3.ct.infn.it:9000/dFtME3LzNw46H-_v9uI0EQ *********************************************************************************************
Проверьте Job Status и Вы увидите, что задание будет выполняться на одном из вычислительных ресурсов, указанных в файле описания задания. Можно проверить это, не выполняя запуск задания, при помощи команды glite-wms-job-list-match
$ glite-wms-job-status https://glite-rb3.ct.infn.it:9000/dFtME3LzNw46H-_v9uI0EQ ************************************************************* BOOKKEEPING INFORMATION: Status info for the Job : https://glite-rb3.ct.infn.it:9000/dFtME3LzNw46H-_v9uI0EQ Current Status: Ready Status Reason: unavailable Destination: grid010.ct.infn.it:2119/jobmanager-lcgpbs-short Submitted: Mon Jul 24 12:41:39 2006 CEST *************************************************************
Выбраный CE - это один из трёх, указанный в атрибуте Requirements JDL файла.
Во втором примере будет указано, как требование для выполнения задания, чтобы оно выполнялось на узле из домена infn.it и кроме того, чтобы у этого узла была "метка" GEANT4-6, что обозначает, что требуется, чтобы на CE было установленно определённое программное обеспечение (правда для данного примера это программное обеспечение не требуется). Как обычно, создаём JDL файл с именем hostnamereq2.jdl
$ cat hostnamereq2.jdl [ Type="Job"; JobType="Normal"; Executable = "/bin/hostname"; Arguments = "-f"; StdError = "stderr.log"; StdOutput = "stdout.log"; OutputSandbox = {"stderr.log", "stdout.log"}; Requirements = ( RegExp("infn.it",other.GlueCEUniqueId) && Member("GEANT4-6",other.GlueHostApplicationSoftwareRunTimeEnvironment)); ShallowRetryCount = 3; ]
Запустите задание и проверьте правильность выполнения. Вы можете посмотреть здесь перечень "меток", которые могут быть использованы для выбора ресурса.
Проблемы при запуске задания
Если при запуске задания на одном сайте произошёл сбой, а на другом оно успешно запустилось, то одной из причин сбоя может быть неправильная конфигурация сбойного сайта. Чтобы заставить систему запуска заданий игнорировать этот сайт, добавьте в JDL файл примерно такую строку, в которую подставьте имя этого сайта :
Requirements = !(RegExp("a.b.institute.country",other.GlueCEUniqueID));
Кроме того, очень полезно потребовать от системы запуска заданий перезапустить задание, если сбой произошёл до того момента, когда оно попало на рабочий узел. Это можно сделать, например, вот так:
ShallowRetryCount = 1;
Обычные значения для этого атрибута 1, 2 или 3.
JDL и ранжирование ресурсов
Атрибут Rank - это выражение, результат вычисления которого является числом с плавающей точкой и которое определяет, в соответствии с какой величиной упорядочивать список ресурсов, которые уже удовлетворяют условиям атрибута Requirements. Значение выражения, вычисленного для каждого из ресурсов является его рангом. Большее значение соответствует более высокому рангу.
Получим список всех CE, доступных в данный момент:
$ lcg-infosites --vo gilda ce valor del bdii: glite-rb.ct.infn.it:2170 #CPU Free Total Jobs Running Waiting ComputingElement ---------------------------------------------------------- 2 2 0 0 0 gilda01.ihep.ac.cn:2119/jobmanager-lcgpbs-long 62 56 1 1 0 grid010.ct.infn.it:2119/jobmanager-lcgpbs-long 14 11 1 1 0 grid011f.cnaf.infn.it:2119/jobmanager-lcgpbs-long 2 2 0 0 0 gilda01.ihep.ac.cn:2119/jobmanager-lcgpbs-short 62 56 1 1 0 grid010.ct.infn.it:2119/jobmanager-lcgpbs-short 14 11 0 0 0 grid011f.cnaf.infn.it:2119/jobmanager-lcgpbs-short 3 0 3 1 2 gildace.oact.inaf.it:2119/jobmanager-lcgpbs-long 3 0 3 2 1 gildace.oact.inaf.it:2119/jobmanager-lcgpbs-short 2 2 0 0 0 gilda01.ihep.ac.cn:2119/jobmanager-lcgpbs-infinite 2 0 1 0 1 gildace01.roma3.infn.it:2119/jobmanager-lcgpbs-long 62 56 0 0 0 grid010.ct.infn.it:2119/jobmanager-lcgpbs-infinite 14 11 0 0 0 grid011f.cnaf.infn.it:2119/jobmanager-lcgpbs-infinite 2 2 0 0 0 trigrid-ce00.unime.it:2119/jobmanager-lcgpbs-long 2 0 2 0 2 gildace01.roma3.infn.it:2119/jobmanager-lcgpbs-short 2 2 0 0 0 trigrid-ce00.unime.it:2119/jobmanager-lcgpbs-short 3 0 5 1 4 gildace.oact.inaf.it:2119/jobmanager-lcgpbs-infinite 6 3 3 3 0 grid-ce.bio.dist.unige.it:2119/jobmanager-lcgpbs-long 2 2 0 0 0 grid036.ct.infn.it:2119/jobmanager-lcgpbs-long 6 3 0 0 0 grid-ce.bio.dist.unige.it:2119/jobmanager-lcgpbs-short 2 2 0 0 0 grid036.ct.infn.it:2119/jobmanager-lcgpbs-short 2 0 3 2 1 gildace01.roma3.infn.it:2119/jobmanager-lcgpbs-infinite 2 2 0 0 0 trigrid-ce00.unime.it:2119/jobmanager-lcgpbs-infinite 6 3 0 0 0 grid-ce.bio.dist.unige.it:2119/jobmanager-lcgpbs-infinite 2 2 0 0 0 grid036.ct.infn.it:2119/jobmanager-lcgpbs-infinite
Пример простейшего задания, использующего Rank:
$ cat hostnamerank.jdl Type = "Job"; JobType = "Normal"; Executable = "/bin/hostname"; StdOutput = "hostname.out"; StdError = "hostname.err"; OutputSandbox = {"hostname.err","hostname.out"}; RetryCount = 7; Requirements = other.GlueCEInfoLRMSType == "PBS"; Rank = other.GlueCEStateFreeCPUs;
Запустим задание в Грид:
$ glite-wms-job-submit -a hostnamerank.jdl Selected Virtual Organisation name (from proxy certificate extension): gilda Connecting to host glite-rb3.ct.infn.it, port 7772 Logging to host glite-rb3.ct.infn.it, port 9002 ********************************************************************************************* JOB SUBMIT OUTCOME The job has been successfully submitted to the Network Server. Use glite-job-status command to check job current status. Your job identifier is: - https://glite-rb3.ct.infn.it:9000/orvKJ4KhC5vHuc2UfONbEg *********************************************************************************************
Проверим Job Status:
$ glite-wms-job-status https://glite-rb3.ct.infn.it:9000/orvKJ4KhC5vHuc2UfONbEg ************************************************************* BOOKKEEPING INFORMATION: Status info for the Job : https://glite-rb3.ct.infn.it:9000/orvKJ4KhC5vHuc2UfONbEg Current Status: Scheduled Status Reason: Job successfully submitted to Globus Destination: grid010.ct.infn.it:2119/jobmanager-lcgpbs-long Submitted: Mon Jul 24 13:11:24 2006 CEST *************************************************************
Как можно увидеть, задание было послано на CE с самым большим количеством свободных CPU.