![]() |
|
| Главная | Инфраструктура | Первые шаги | ПОИ | Поддержка | Для разработчиков |
|
Table of Contents
Описание заданий и задач на языке JSONЗадания и задачи, направляемые в ГридННС, должны быть описаны на языке JSON (http://json.org/json-ru.html). Отметим, что во многих случаях пользователь может обойтись даже без знания того как конкретно это делается благодаря наличию интуитивно понятного графического веб-интерфейса ГридННС. Однако, для полноценного использования ресурсов ГридННС весьма желательно понимания и умения самостоятельно создавать описания заданий и задач. В этом руководстве после очень краткого определения собственно языка JSON, мы даем неформальное и простое введение в язык описания заданий/задач, направляемых в ГридННС. Язык JSONJSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Для понимания дальнейшего достаточно знать, что JSON строится на двух структурах: 1. Набор пар имя/значение.
2. Пронумерованный набор значений.
Значение может быть:
Эти структуры могут быть вложены друг в друга. Следующий пример показывает JSON-представление объекта, описывающего человека. В объекте есть строковые поля имени и фамилии, объект, описывающий адрес, и массив, содержащий список телефонов. {
"firstName": "Иван",
"lastName": "Иванов",
"address": {
"streetAddress": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101
},
"phoneNumbers": [
"812 123-1234",
"916 123-4567"
]
}
Описание заданий на языке JSONФормальное и строгое определение формата описания заданий и задач на языке JSON представлено с помощью языка JSON Schema (http://www.json-schema.org, http://json-schema.org/schema). Как любой строгий и формальный язык, JSON Schema требует некоторых усилий и времени для того, чтобы изучить и привыкнуть к нему. Поэтому здесь мы даем простое, менее формальное введение в язык описания заданий и задач, которое тем не менее вполне достаточно для их подготовки и запуска в ГридННС. Прежде всего, описание задания это объект в терминологии JSON. Поэтому, в соответствии с предыдущим разделом все описание должно быть заключено фигурные скобки: {
...
}
В нашем неформальном введении в язык описания многоточие обозначает любой набор элементов описания (в выше приведенном выражении это все описание задания). В объекте описания задания (то есть, в наборе пар имя/значение, описывающих задание) есть всего два обязательных элемента:
Таким образом, общий вид описания задания является таким: {
"version": N,
"tasks": [...]
...
}
В реальном описании вместо N надо подставить номер версии описания, например, 1, 2, 3, … . В дальнейшем мы будем использовать N=2 (текущая версия на момент написания данного Руководства). Многоточия здесь обозначают элементы массива описаний задач и необязательные элементы описания задания. Задание должно включать в себя хотя бы одну задачу, поэтому массив описания задач должен содержать один или более элементов. Описание задачи (элемент массива с именем “tasks”) является объектом (набором пар имя/значение) и содержит по крайней мере две пары:
Таким образом обязательная структура описания задания имеет следующий общий вид: {
"version": 2,
"tasks": [
{"id": "a",
"definition": {...},
...},
{"id": "b",
"filename": "b.js",
...},
{...}
]
...
}
В этом примере строки “a” и “b” в паре с именем “id” могут быть заменены на любые - по выбору пользователя. Они нужны для того, чтобы можно было ссылаться на данную задачу внутри задания. В задаче с идентификатором “a” используется вариант, когда описание задачи приводится непосредственно в файле описания задания (пара с именем “definition”). В задаче с идентификатором “b” используется вариант, когда описание задачи приводится в отдельном файле (пара с именем “filename”, название файла может быть любым). Остальные элементы описания вообще говоря не являются обязательными, но могут быть важными и даже необходимыми для описания того или иного задания. Они перечислены ниже.
{
"version": 2,
"description": "произвольный комментарий к описанию задания",
"tasks": [
{"id": "a",
"description": "произвольный комментарий к описанию задачи a",
"definition": {...},
...},
{"id": "b",
"description": "произвольный комментарий к описанию задачи b",
"filename": "b.js",
...},
{...}
]
...
}
{
"version": 2,
"description": "произвольный комментарий к описанию задания",
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"tasks": [
{"id": "a",
"description": "произвольный комментарий к описанию задачи a",
"definition": {...},
...},
{"id": "b",
"description": "произвольный комментарий к описанию задачи b",
"filename": "b.js",
...},
{...}
]
...
}
При наличии этого элемента описание выглядит следующим образом: {
"version": 2,
"description": "произвольный комментарий к описанию задания",
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"tasks": [
{"id": "a",
"description": "произвольный комментарий к описанию задачи a",
"definition": {...},
...},
{"id": "b",
"description": "произвольный комментарий к описанию задачи b",
"filename": "b.js",
...},
{...}
],
"requirements": {
"hostname": ["host.name.ru"],
"lrms": "lrms_name",
"queue": "queue_name",
"fork": "false/true"
}
}
Если пара “requirements” отсутствует, описание задания допускает любые ресурсы.
{ "version": 2,
"description": "произвольный комментарий к описанию задания",
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"tasks": [
{"id": "a",
"description": "произвольный комментарий к описанию задачи a",
"children": ["b"],
"definition": {...}
},
{"id": "b",
"description": "произвольный комментарий к описанию задачи b",
"filename": "b.js"
}
],
"requirements": {
"hostname": ["host.name.ru"],
"lrms": "lrms_name",
"queue": "queue_name",
"fork": "false/true"
}
}
Конечно, задач в задании может быть больше двух и зависимости могут быть более сложными. Соответствующие пояснения и примеры приведены в последнем разделе. В приведенном выше примере осталось одно многоточие - содержание объекта - значение пары “definition”, другими словами, описание задачи. Формат этого описания представлен в следующем разделе. Описание задач на языке JSONКак указано в предыдущем разделе описание задач дается непосредственно в описании всего задания (пара с именем “definition”) или в отдельном файле. В любом случае описание задачи является объектом. В объекте описания задачи есть два обязательных элемента:
Таким образом, общий вид описания задачи является таким: { "version": 2,
"executable": "/bin/ls",
...
}
Конечно, вместо исполнимого файла /bin/ls должен быть указан реальный исполнимый файл задачи. Остальные элементы описания вообще говоря не являются обязательными, но могут быть важными и даже необходимыми для описания того или иного задания. Они перечислены ниже.
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
...
}
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
...
}
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
...
}
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
"count": 8,
...
}
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
"count": 8,
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
...
}
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
"count": 8,
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"input_files": {
"input_file1": "datafilel",
"input_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/datafile2"
},
"output_files": {
"output_file1": "resultl",
"output_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/result2"
},
...
}
{ “version”: 2, "description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
"count": 8,
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"input_files": {
"input_file1": "datafilel",
"input_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/datafile2"
},
"output_files": {
"output_file1": "resultl",
"output_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/result2"
},
"stdin": "task1_stdin",
"stdout": "gsiftp://tb02.ngrid.ru/home/ivanov/data/task1_stdout",
"stderr": "gsiftp://tb02.ngrid.ru/home/ivanov/data/task1_stderr",
...
}
Кроме того, в “requirements” можно использовать и многие другие параметры, полный список которых можно найти в документации СУВЗ Pilot по адресу http://www.ngrid.ru/sw/pilot/docs/jobsyntax.html#id6 Информацию об URL вычислительных элементов ГридННС, названиях локальных менеджеров ресурсов и очередей можно найти в инфомационной системе (ИС) ГридННС. Для этого надо перейти на веб-страницу ИС (https://cis.ngrid.ru:4443) и кликнуть вверху на ссылку “Список очередей” в выпадающем списке после установки курсора на пункт меню “Очередь”. В первых трех колонках открывающейся таблицы содержится требуемая информация: колонка “Queue name” содержит значения параметра “queue”, колонка “GRAM Hostname” - соответствующие значения “hostname”, а подколонка LRMS/Type - значения “lrms”. Требования, указанные в задаче (если они указаны), полностью замещают требования, указанные в задании. Отсутствие требований (в задании или задаче) эквивалентно требованию «подходит любой ресурс». { "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
"count": 8,
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"input_files": {
"input_file1": "datafilel",
"input_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/datafile2"
},
"output_files": {
"output_file1": "resultl",
"output_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/result2"
},
"stdin": "task1_stdin",
"stdout": "gsiftp://tb02.ngrid.ru/home/ivanov/data/task1_stdout",
"stderr": "gsiftp://tb02.ngrid.ru/home/ivanov/data/task1_stderr",
"requirements": {
"hostname": ["host.name.ru"],
"lrms": "lrms_name",
"queue": "queue_name",
"fork": "false/true"
}
}
{ "version": 2,
"description": "произвольный комментарий к описанию задачи",
"executable": "/bin/ls",
"arguments": [ "/home", "/etc" ],
"environment": { "path": "/scratch/bin/",
"soft_location": "/opt/soft/"
},
"count": 8,
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/job1/",
"input_files": {
"input_file1": "datafilel",
"input_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/datafile2"
},
"output_files": {
"output_file1": "resultl",
"output_file2": "gsiftp://tb02.ngrid.ru/home/ivanov/data/result2"
},
"stdin": "task1_stdin",
"stdout": "gsiftp://tb02.ngrid.ru/home/ivanov/data/task1_stdout",
"stderr": "gsiftp://tb02.ngrid.ru/home/ivanov/data/task1_stderr",
"requirements": {
"hostname": ["host.name.ru"],
"lrms": "lrms_name",
"queue": "queue_name",
"fork": "false/true"
},
"meta": {
"name1": "value1",
"name2": "value2",
"name3": "value3"
}
}
Примеры описаний заданий и задач для выполнения в ГридННСПример 1.В данном тестовом задании на удаленном ресурсе выполняется команда whoami, которая определяет название локальной учетной записи, на которую отображается прокси-сертификат грид-пользователя и, соответственно, от имени которого выполняется задание. Результат записывается в файл test.txt на GridFTP-сервере, указанном в атрибуте default_storage_base. { "version": 2,
"description": "тестовое задание 1",
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/ivanov/jt/",
"tasks": [ { "id": "a",
"description": "задача #1",
"definition": { "version": 2,
"executable": "/usr/bin/whoami",
"stdout": "test.txt"
}
}
]
}
Пример 2В данном примере выполняется практически то же задание, что и в Примере 1, но описания задания и задачи разделены. Описание задания: { "version": 2,
"description": "тестовое задание 2",
"tasks": [ { "id": "a",
"description": "task whoami",
"filename": "task_whoami.js"
}
]
}
Файл описания задачи task_whoami.js: { "version": 2,
"description": "testing task 1",
"executable": "/usr/bin/whoami",
"stdout": "local_user.txt"
}
Пример 3Задание в этом примере состоит из четырех связанных между собой задач (то есть результаты части задач используются как входные данные для других. Направленный ациклический граф, описывающий эти связи (поток данных), представлен на следующем рисунке: Описание задания: {"version":2,
"default_storage_base": "gsiftp://tb01.ngrid.ru/home/demichev/tst/",
"tasks":[{ "id":"n0",
"description":"a",
"filename":"task_whoami.js",
"children":["n2","n1"]
},
{ "id":"n1",
"description":"b",
"filename":"task_md5sum.js",
"children":["n3"]
},
{ "id":"n2",
"description":"c",
"filename":"task_cksum.js",
"children":["n3"]
},
{ "id":"n3",
"description":"d",
"filename":"task_diff.js"
}
]
}
Задача task_whoami.js: { "version": 2,
"description": "testing task 1",
"executable": "/usr/bin/whoami",
"stdout": "local_user.txt"
}
Задача task_md5sum.js { “version”: 2, "description": "md5 sum of the input file",
"executable": "/usr/bin/md5sum",
"arguments": [ "local_user_b.txt" ],
"input_files": { "local_user_b.txt": "local_user.txt"
},
"stdout": "md5_result.txt"
}
Задача task_cksum.js: { "version": 2,
"description": "cksum sum of the input file",
"executable": "/usr/bin/cksum",
"arguments": [ "local_user_c.txt" ],
"input_files": { "local_user_c.txt": "local_user.txt"
},
"stdout": "cksum_result.txt"
}
Задача task_diff.js: { "version": 2,
"description": "diff of the input files",
"executable": "/usr/bin/diff",
"arguments": [ "md5_result_d.txt", "cksum_result_d.txt" ],
"input_files": { "md5_result_d.txt": "md5_result.txt",
"cksum_result_d.txt": "cksum_result.txt"
},
"stdout": "diff_result.txt"
}
|
|
|