Главная / Обучение / Практикум / Ещё о JDL (Job Description Language)

Ещё о JDL (Job Description Language)

Простейший 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

Это задание просто запускает команду 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.


egee@pnpi.nw.ru

©2004-2010 ПИЯФ РАН им. Б.П.Константинова

СтатистикаСтатистика сайта