Я пытаюсь настроить некоторые bash-скрипты, чтобы они запускались на (pbs) кластер.
Отдельные задачи выполняются несколькими сценариями, которые запускаются основным сценарием. Пока что эти основные сценарии запускают несколько сценариев в фоновом режиме (путем добавления &
), заставляя их работать параллельно на одной многоядерной машине. Я хочу заменить эти вызовы на qsub
s, чтобы распределить нагрузку по узлам кластера.
Однако некоторые задания зависят от завершения других до того, как они смогут начаться. До сих пор это достигалось wait
операторами в основном скрипте. Но как лучше всего это сделать с помощью grid engine?
Я уже нашел этот вопрос, а также -W after:jobid[:jobid...]
документацию в справочную страницу qsub
, но я надеюсь, что есть лучший способ. Мы говорим о нескольких тысячах заданий, которые сначала должны выполняться параллельно, и о другом наборе того же размера, который будет выполняться одновременно после завершения последнего из них. Это означало бы, что мне пришлось ставить в очередь много заданий в зависимости от большого количества заданий.
Я мог бы снизить это, используя фиктивное задание между ними, ничего не делая, но полагаясь на первую группу заданий, от которых могла бы зависеть вторая группа. Это уменьшит количество зависимостей с миллионов до тысяч, но все же: это кажется неправильным, и я даже не уверен, что такая длинная командная строка будет принята оболочкой.
- Нет ли способа дождаться завершения всех моих заданий (что-то вроде
qwait -u <user>
)? - Или все задания, отправленные с помощью этого скрипта (что-то вроде
qwait [-p <PID>]
)?
Конечно, можно было бы написать что-то подобное, используя qstat
и sleep
в цикле while
, но я думаю, что этот вариант использования достаточно важен, чтобы иметь встроенное решение, и я просто не мог его понять.
Что бы вы порекомендовали/использовали в такой ситуации?
Приложение I:
Поскольку это было запрошено в комментарии:
$ qsub --version
version: 2.4.8
Может быть также полезно определить точную систему pbs:
$ qsub --help
usage: qsub [-a date_time] [-A account_string] [-b secs]
[-c [ none | { enabled | periodic | shutdown |
depth=<int> | dir=<path> | interval=<minutes>}... ]
[-C directive_prefix] [-d path] [-D path]
[-e path] [-h] [-I] [-j oe] [-k {oe}] [-l resource_list] [-m n|{abe}]
[-M user_list] [-N jobname] [-o path] [-p priority] [-P proxy_user] [-q queue]
[-r y|n] [-S path] [-t number_to_submit] [-T type] [-u user_list] [-w] path
[-W otherattributes=value...] [-v variable_list] [-V] [-x] [-X] [-z] [script]
Поскольку комментарии указывают на массивы заданий, я просмотрел справочную страницу qsub
со следующими результатами:
[...]
DESCRIPTION
[...]
In addition to the above, the following environment variables will be available to the batch job.
[...]
PBS_ARRAYID
each member of a job array is assigned a unique identifier (see -t)
[...]
OPTIONS
[...]
-t array_request
Specifies the task ids of a job array. Single task arrays are allowed.
The array_request argument is an integer id or a range of integers. Multiple ids or id ranges can be combined in a comman delimeted list. Examples : -t 1-100 or -t 1,10,50-100
[...]
Приложение II:
Я попробовал решение torque, предложенное Дмитрием Чубаровым, но это не работает, как описано.
Без массива заданий он работает так, как ожидалось:
testuser@headnode ~ $ qsub -W depend=afterok:`qsub ./test1.sh` ./test2 && qstat
2553.testserver.domain
Job id Name User Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver Test1 testuser 0 Q testqueue
2553.testserver Test2 testuser 0 H testqueue
testuser@headnode ~ $ qstat
Job id Name User Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver Test1 testuser 0 R testqueue
2553.testserver Test2 testuser 0 H testqueue
testuser@headnode ~ $ qstat
Job id Name User Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2553.testserver Test2 testuser 0 R testqueue
Однако при использовании массивов заданий второе задание не запустится:
testuser@headnode ~ $ qsub -W depend=afterok:`qsub -t 1-2 ./test1.sh` ./test2 && qstat
2555.testserver.domain
Job id Name User Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver Test1-1 testuser 0 Q testqueue
2554-2.testserver Test1-1 testuser 0 Q testqueue
2555.testserver Test2 testuser 0 H testqueue
testuser@headnode ~ $ qstat
Job id Name User Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver Test1-1 testuser 0 R testqueue
2554-2.testserver Test1-2 testuser 0 R testqueue
2555.testserver Test2 testuser 0 H testqueue
testuser@headnode ~ $ qstat
Job id Name User Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2555.testserver Test2 testuser 0 H testqueue
Я предполагаю, что это связано с отсутствием указания массива в идентификаторе задания, который возвращается первым qsub
:
testuser@headnode ~ $ qsub -t 1-2 ./test1.sh
2556.testserver.domain
Как видите, ...[]
не указывает на то, что это массив заданий. Кроме того, в выводе qsub
нет ...[]
, но ...-1
и ...-2
указывают на массив.
Таким образом, остается вопрос, как отформатировать -W depend=afterok:...
, чтобы задание зависело от указанного массива заданий.
--version
не сообщает ничего, кроме номера версии, и справочная страница также не содержит никаких подробностей. Если нет возможности узнать на себе, я могу написать администратору кластера в крайнем случае. - person mschilli   schedule 26.08.2013--version
и--help
. Надеюсь, это пойдет на пользу. - person mschilli   schedule 27.08.2013