Главная / Обучение / Практикум / Запуск заданий сложных типов: DAG, Collections, parametric

Запуск заданий сложных типов: DAG, Collections, parametric.

Этот практикум демонстрирует как использовать различные возможности при запуске заданий через WMProxy. Особое внимание уделено запуску нескольких заданий при помощи единственного JDL файла.

Делегирование полномочий (Credentials delegation)

Модель аутентификации для WM proxy определяет следующее: в дополнение к действующему прокси-сертификату (если он у вас ещё не создан, то посмотрите здесь ) вы должны делегировать свои полномочия WM proxy серверу.

Пользователь может определить идентификатор delegationId, который будет ассоциирован с назначенным делегированием при помощи опции --delegationid (сокращённо -d):

  glite-wms-job-delegate-proxy -d myfirstdelegationid 

Если вы ещё не сделали это, создайте делегирование, используя в качестве идентификатора ваше пользовательское имя

  $ glite-wms-job-delegate-proxy -d $USER

  Connecting to the service https://glite-rb3.ct.infn.it:7443/glite_wms_wmproxy_server

  ================== glite-wms-job-delegate-proxy Success ==================

  Your proxy has been successfully delegated to the WMProxy:
  https://glite-rb3.ct.infn.it:7443/glite_wms_wmproxy_server

  with the delegation identifier: giorgio

  ==========================================================================

WM Proxy позволяет обслуживать различные типы запросов, как простых, так и сложных, то есть требующих запуска более чем одного задания. Например таких как DAG, collection или parametric. Заметим, что получение списка ресурсов, доступных для запуска задатия (list-matching) возможно только для простого задания, сложные типы заданий не позволяют этого

Job Collections

Коллекция заданий (Job Collection) - это множество взаимонезависимых заданий, которые по причинам, известным пользователю, запускаются, мониторируются и управляются, как один запрос. Одним из простых применений такого типа заданий является вариант, когда подзадания имеют общие входные файлы: фактически WM Proxy позволяет организацию общего доступа и наследования для sandboxes. Кроме того, оптимизируется сетевой трафик, передавая один экземпляр каждого файла даже в случае использования их несколькими подзаданиями.

[giorgio@glite-tutor WMProxy_ex]$ cat collection_ex.jdl
[
  Type = "collection";
  InputSandbox = {
    "input_common1.txt",
    "input_common2.txt"
  };
nodes = {
   [
     JobType = "Normal";
     NodeName = "node1";
     Executable = "/bin/sh";
     Arguments = "script_node1.sh";
     InputSandbox = {"script_node1.sh",
                      root.InputSandbox[0]
                    };
     StdOutput = "myoutput1";
     StdError  = "myerror1";
     OutputSandbox = {"myoutput1","myerror1"};
     ShallowRetryCount = 1;
   ],[
     JobType = "Normal";
     NodeName = "node2";
     Executable = "/bin/sh";
     InputSandbox = {"script_node2.sh",
                    root.InputSandbox[1]
                  };
     Arguments = "script_node2.sh";
     StdOutput = "myoutput2";
     StdError  = "myerror2";
     OutputSandbox = {"myoutput2","myerror2"};
    ShallowRetryCount = 1;
   ],[
     JobType = "Normal";
     NodeName = "node3";
     Executable = "/bin/cat";
     InputSandbox = {root.InputSandbox};
     Arguments = "*.txt";
     StdOutput = "myoutput3";
     StdError  = "myerror3";
     OutputSandbox = {"myoutput3","myerror3"};
    ShallowRetryCount = 1;
   ]
 };
]
  

В этом примере запускаются 3 задания, кроме того определён общий InputSandbox, из которого подзадания node1 и node2 наследуют по одному файлу каждое и распечатывают их содержимое каждое из своего собственного скрипта. Подзадание node3 наследует InputSandbox целиком и распечатывает содержимое обоих файлов. Bash скрипт только распечатывает некоторую информацию и содержимое каждого txt файла из рабочей директории. Прежде чем запустить задание, создадим общие входные файлы путём создания двух текстовых файлов с произвольным содержимым.

  [giorgio@glite-tutor WMProxy_ex]$ echo "first input" > input_common1.txt
  [giorgio@glite-tutor WMProxy_ex]$ echo "2nd input" > input_common2.txt
  [giorgio@glite-tutor WMProxy_ex]$ cat script_node1.sh
  #!/bin/sh

  echo "Current date is `date`"
  echo "Dumping now input files"
  echo "**********************"
  cat *.txt
  [giorgio@glite-tutor WMProxy_ex]$
  [giorgio@glite-tutor WMProxy_ex]$ cat script_node2.sh
  #!/bin/sh

  echo "Running machine is `hostname`"
  ls -l
  echo "Dumping now input files"
  echo "**********************"
  cat *.txt

Запустим и будем контролировать состояние задания. Это будет легче, если сохранять идентификатор задания в файле, в данном случае в файле jobid.

[giorgio@glite-tutor WMProxy_ex]$ glite-wms-job-submit -d $USER -o jobId collection_ex.jdl

Connecting to the service https://glite-rb3.ct.infn.it:7443/glite_wms_wmproxy_server

====================== glite-wms-job-submit Success ======================

The job has been successfully submitted to the WMProxy
Your job identifier is:

https://glite-rb3.ct.infn.it:9000/06zotEhQcQavkMOrrengnw

The job identifier has been saved in the following file:
/home/giorgio/WMProxy_ex/jobId

==========================================================================

[giorgio@glite-tutor WMProxy_ex]$ glite-wms-job-status -i jobId

*************************************************************
BOOKKEEPING INFORMATION:

Status info for the Job : https://glite-rb3.ct.infn.it:9000/06zotEhQcQavkMOrrengnw
Current Status:     Running
Status Reason:      unavailable
Destination:        dagman
Submitted:          Thu Jul 20 10:12:14 2006 CEST
*************************************************************

- Nodes information:
    Status info for the Job : https://glite-rb3.ct.infn.it:9000/Oya0mK9e41_8gFsjXi_FHQ
    Node Name:          node1
    Current Status:     Ready
    Destination:        gilda01.ihep.ac.cn:2119/jobmanager-lcgpbs-long
    Submitted:          Thu Jul 20 10:12:14 2006 CEST
*************************************************************
    Status info for the Job : https://glite-rb3.ct.infn.it:9000/SYh5ArEgzExv-30lk0A7eA
    Node Name:          node2
    Current Status:     Waiting
    Destination:        gilda01.ihep.ac.cn:2119/jobmanager-lcgpbs-short
    Submitted:          Thu Jul 20 10:12:14 2006 CEST
*************************************************************
    Status info for the Job : https://glite-rb3.ct.infn.it:9000/rjIEqDoIxLAP12yWrXszZw
    Node Name:          node3
    Current Status:     Ready
    Destination:        gildace.oact.inaf.it:2119/jobmanager-lcgpbs-short
    Submitted:          Thu Jul 20 10:12:14 2006 CEST
*************************************************************
  

Заметим, что имена узлов коллекции (Node Name) точно такие, как они определены в JDL файле. Когда все задания завершатся, получите выходные файлы и проверьте их. Следующий пример демонстрирует использование опции --dir для создания новой директории на UI, куда будут направлены выходные файлы

  glite-wms-job-output --dir ./myOp  -i jobId

DAG jobs

DAG (direct acyclic graph) представляет множество заданий, для которых входные данные, выходные данные или запуск задания на выполнение для одного или нескольких заданий зависят от других одного или нескольких заданий. Задания представляют собой узлы (вершины) графа, а рёбра (дуги) обозначают зависимости. Например:

[giorgio@glite-tutor WMProxy_ex]$ cat dag_1.jdl
[
  Type = "dag";
  InputSandbox = {
    "son.sh"
  };
nodes = [
   father = [
    description = [
     JobType = "Normal";
     Executable = "/bin/sh";
     Arguments = "father_script.sh";
     InputSandbox = {"father_script.sh"};
     StdOutput = "father_output";
     StdError  = "father_error";
     OutputSandbox = {"father_output","father_error","son1.input","son2.input"};
    ShallowRetryCount = 1;
   ];
  ];
  son1 =  [
   description = [
     JobType = "Normal";
     Executable = "/bin/sh";
     InputSandbox = {root.InputSandbox,root.nodes.father.description.OutputSandbox[2]};
     Arguments = "son.sh 1";
     StdOutput = "son1.output";
     StdError  = "son1.error";
     OutputSandbox = {"final1.input","son1.output","son1.error"};
    ShallowRetryCount = 1;
   ];
  ];
   son2  =  [
    description = [
     JobType = "Normal";
     Executable = "/bin/sh";
     InputSandbox = {root.InputSandbox,root.nodes.father.description.OutputSandbox[3]};
     Arguments = "son.sh 2";
     StdOutput = "son2.output";
     StdError  = "son2.error";
     OutputSandbox = {"final2.input","son2.output","son2.error"};
    ShallowRetryCount = 1;
   ];
  ];
  final =  [
   description = [
     JobType = "Normal";
     Executable = "/bin/sh";
     InputSandbox = {"final.sh",root.nodes.son1.description.OutputSandbox[0],root.nodes.son2.description.OutputSandbox[0]};
     Arguments = "final.sh";
     StdOutput = "dag.out";
     StdError  = "dag.err";
     OutputSandbox = {"dag.out","dag.err"};
    ShallowRetryCount = 1;
   ];
  ];
   dependencies =  {
       {father,{son1,son2}},
       {son1,final}, {son2,final}
     };
 ];
]
  

Вы можете заметить несколько фактов:

Вы можете запустить этот пример (необходимые скрипты можно взять здесь) и контролировать его статус, пока он не выполнится. Затем обычным образом получите выходные файлы и проверьте из содержимое, чтобы убедиться что зависимости были выполнены

   wget http://egee.pnpi.nw.ru/doc/dag-example-script.tar.gz && tar xzvf dag-example-script.tar.gz

   glite-wms-job-submit -d $USER -o jobidWMP dag_1.jdl

   glite-wms-job-status -i jobidWMP 
  

Parametric jobs

Параметрические задания приводят к генерации множества заданий из одного JDL файла. Это очень полезно в тех случаях, когда должно быть выполнено множество похожих (но не идентичных) заданий. Для параметрического задания это достигается определением одного или нескольких атрибутов в JDL файле, как параметров. Эти атрибуты отличаются тем, что в их значении используется ключевое слово _PARAM_; это значение будет заменено фактическим значением, взятым из атрибута Parameters во время обработки JDL файла. Значение атрибута JobType в JDL файле должно быть равно Parametric.

В следующем примере мпожество значений параметров определяется тремя атрибутами: Parameters, ParameterStep и ParameterStart. ParameterStart задаёт начальное значение параметра; ParameterStep определяет шаг итерации для изменения значения параметра и Parameters определяет конечное значение, при котором прекращается изменение парамера (при этом само конечное значение не используется в качестве величины параметра). Таким образом, общее количество сгенерированных заданий будет равно (Parameters – ParameterStart) / ParameterStep.

[giorgio@glite-tutor WMProxy_ex]$ cat parametric.jdl
 [
    JobType = "Parametric";
    Executable = "/bin/sh";
    Arguments = "message_PARAM_.sh";
    InputSandbox = "message_PARAM_.sh";
    Parameters= 6;
    ParameterStep =2;
    ParameterStart = 0;
    StdOutput = "myoutput_PARAM_.txt";
    StdError = "myerror_PARAM_.txt";
    OutputSandbox  = {"myoutput_PARAM_.txt", "myerror_PARAM_.txt"};
    ShallowRetryCount = 1;
]
  

В этом случае будут сгенерированны три задания для выполнения скриптов message0.sh, message2.sh и так далее до message4.sh (последнее значение Parameters исключается). Заметим, что за согласованность InputSandbox отвечает пользователь. Для этого примера это означает, что пользователь должен создать 3 файла с именами message0.sh,message2.sh и так далее, для передачи их через InputSandbox. В нашем примере это можно легко сделать следующим образом:

for ((i=0;i<6;i+=2)) ; do echo "echo message number $i" > message$i.sh; done

и затем запустить задание и мониторировать его состояние

  glite-wms-job-submit -o jobIdWMP -d $USER parametric.jdl

  glite-wms-job-status -i jobIdWMP 
  

Когда задание завершится, вы можете увидеть в различных поддиректориях выходные файлы, с различными параметризованными именами.

Использование Input и Output sandboxes

Очень важное преимущество, обеспечиваемое WM proxy, это возможность указывать в InputSandbox файлы, которые расположены на gridftp серверах, также как и возможность автоматичесски записывать выходные файлы на gridftp сервер.Эта воможность может быть использована для всех типов заданий, запускаемых через WM proxy (parametric,collection, DAG...), но для простоты мы продемонстрируем это для простого задания. В первом примере мы покажем как описать в InputSandbox файл, находящийся на Grid Storage Element. Здесь можно посмотреть, как скопировать и зарегистрировать файл на Storage Element и как получить его SURL. SURL файла должен быть указан в InputSandbox именно таким образом (заметим, что имя протокола доступа изменяется с srm на gsiftp). Проверьте, что у вас есть доступ к этому файлу ДО ТОГО, как задание будет запущено, иначе подобный пример работать не будет

  InputSandbox = {
                 "gsiftp://aliserv6.ct.infn.it/dpm/ct.infn.it/home/gilda/generated/2006-05-26/filea5f5a851-8cec-4494-9afb-0c59e0625380",
                 "script_gridftp_input_data.sh"
               };
  

Мы будем использовать эту функциональность для запуска скрипта, который выводит содержимое рабочей директории и распечатывает файл, имя которого передаётся, как аргумент.

  [giorgio@glite-tutor WMProxy_ex]$ cat script_gridftp_input_data.sh
  #!/bin/sh
  echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
  echo "Running on `hostname`"
  ls -l
  echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
  cat $1
  echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
  

JDL файл для этого задания выглядит следующим образом (заметим, что собственно имя файла также передаётся как параметр, оно выделено жирным шрифтом в атрибуте Arguments ):

  [giorgio@glite-tutor WMProxy_ex]$ cat gridftp_input_data.jdl
  [
  Type = "Job";
  JobType = "Normal";
  Executable = "/bin/sh";
  Arguments = "script_gridftp_input_data.sh filea5f5a851-8cec-4494-9afb-0c59e0625380";
  InputSandbox = {
                 "gsiftp://aliserv6.ct.infn.it/dpm/ct.infn.it/home/gilda/generated/2006-05-26/filea5f5a851-8cec-4494-9afb-0c59e0625380",
                 "script_gridftp_input_data.sh"
               };
  StdOutput = "mytest.out";
  StdError = "mytest.err";
  OutputSandbox = {"mytest.err","mytest.out"};
  ShallowRetryCount = 1;
  ]
  

Вы можете запустить его и отслеживать состояние обычным образом:

  [giorgio@glite-tutor WMProxy_ex]$ glite-wms-job-submit -a gridftp_input_data.jdl

  Connecting to the service https://glite-rb3.ct.infn.it:7443/glite_wms_wmproxy_server

  ====================== glite-wms-job-submit Success ======================

  The job has been successfully submitted to the WMProxy
  Your job identifier is:

  https://glite-rb3.ct.infn.it:9000/SogqNjxN8LUxc_xVWgJLtQ

  ==========================================================================

  [giorgio@glite-tutor WMProxy_ex]$ glite-wms-job-status https://glite-rb3.ct.infn.it:9000/SogqNjxN8LUxc_xVWgJLtQ

  *************************************************************
  BOOKKEEPING INFORMATION:

  Status info for the Job : https://glite-rb3.ct.infn.it:9000/SogqNjxN8LUxc_xVWgJLtQ
  Current Status:     Done (Success)
  Exit code:          0
  Status Reason:      Job terminated successfully
  Destination:        gildace01.roma3.infn.it:2119/jobmanager-lcgpbs-infinite
  Submitted:          Wed Jul 19 16:57:59 2006 CEST
  *************************************************************
  

Когда статус задания станет Done, можно получить выходные файлы при помощи команды glite-wms-job-output и вы увидите в файле с результатами содержимое файла, предварительно сохранённого на Storage Element (в данном примере - JDL файл)

  [giorgio@glite-tutor WMProxy_ex]$ glite-wms-job-output https://glite-rb3.ct.infn.it:9000/SogqNjxN8LUxc_xVWgJLtQ

  Connecting to the service https://193.206.208.138:7443/glite_wms_wmproxy_server
  ================================================================================

                        JOB GET OUTPUT OUTCOME

  Output sandbox files for the job:
  https://glite-rb3.ct.infn.it:9000/SogqNjxN8LUxc_xVWgJLtQ
  have been successfully retrieved and stored in the directory:
  /tmp/glite/glite-ui/giorgio_SogqNjxN8LUxc_xVWgJLtQ

  ================================================================================

  [giorgio@glite-tutor WMProxy_ex]$ cat /tmp/glite/glite-ui/giorgio_SogqNjxN8LUxc_xVWgJLtQ/mytest.out
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  Running on gildawn01.roma3.infn.it
  total 12
  -rw-r--r--    1 gilda063 gilda         202 Jul 19 16:59 filea5f5a851-8cec-4494-9afb-0c59e0625380
  -rw-r--r--    1 gilda063 gilda           0 Jul 19 16:59 https_3a_2f_2fglite-rb3.ct.infn.it_3a9000_2fSogqNjxN8LUxc_5fxVWgJLtQ.output
  -rw-r--r--    1 gilda063 gilda           0 Jul 19 16:59 mytest.err
  -rw-r--r--    1 gilda063 gilda          85 Jul 19 16:59 mytest.out
  -rw-r--r--    1 gilda063 gilda         246 Jul 19 16:59 script_gridftp_input_data.sh
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  Type = "Job";
  JobType = "Normal";
  Executable = "/bin/hostname";
  StdOutput = "hostname.out";
  StdError = "hostname.err";
  OutputSandbox = {"hostname.err","hostname.out"};
  Arguments = "-f";
  ShallowRetryCount = 1;
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  

Ссылки

WM proxy user guide

JDL Attributes guide for WM proxy

Datamat -- WM proxy quickstart


egee@pnpi.nw.ru

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

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