Заметки о разработке стыка с GRAM и ЛРМ
Table of Contents
Общие положения
Данный документ описывает как надо создавать такой стык с задачей минимизации временных расходов и потраченных нервных клеток разработчиков. Задача интеграция нового Локального Менеджера Ресурсов(далее ЛРМ) в Grid на основе Globus Toolkit 4 (в частности NGrid) осложнена несколькими факторами: отсутствует адеквантая документация как писать такой стык, концепции и методы работы GRAM(не WS GRAM) имеют legacy происхождение (тянутся с Globus Toolkit 2.x)
Перед прочтением этого документа настоятельно рекомендуется ознакомится с документацией по устройству подсистемы выполнения задач в Globus Toolkit 4(http://globus.org)
Предполагается что ЛРМ обладает всей стандартной функциональностью (запуск, останов, опрос состояния и т.д. задачи) доступной через CLI и ведет файлы журнала событий.
Как показал практический опыт проще всего разработать стык с ЛРБ на основе уже существующих стыков для PBS, Condor, LSF и т.д. Проще говоря форкнуть уже существующих стык. Разработку целесообразно вести отдельно от дерева с исходными текстами Globus Toolkit 4 (но с установленным Globus Toolkit 4).
С практической точки зрения нас интересуют следующие компоненты (в смысле компонент GPT; <LRM> название ЛКР в нужном регистре, в разных местах по разному)
- globus_gram_job_manager_setup_<LRM> расположен в gram/jobmanager/setup/<LRM>
- globus_scheduler_event_generator_<LRM> расположен в ws-gram/job_monitoring/<LRM>/c/source
- globus_scheduler_event_generator_<LRM>_setup расположен в ws-gram/job_monitoring/<LRM>/c/setup
- globus_scheduler_provider_setup_<LRM> расположен в ws-gram/service/java/setup/<LRM>
- globus_wsrf_gram_service_java_setup_<LRM> расположен в ws-gram/service/java/setup/<LRM>
Для любой существующей ЛРМ забрать эти компоненты можно из CVS или из source bundle(лишние файлы не указанные в разделе о компонентах лучше удалить). Стоит заметить что структура того что лежит в source bundle или CVS не способствует пониманию того из чего состоит Globus Toolkit 4 и что из этого относится к стыку. За исключением существенных файлов указанных в каждой компоненте для порта новой <LRM> нужно произвести переименование старых файлов и замены в текстах названия ЛРМ с сохранением регистра.
О компонентах
Все рассматриваемые компоненты содержат некоторые стандартные файлы и директории:
- doxygen - директория существует во всех компонентах
- pkgdata - директория существует во всех компонентах
- pkgdata/pkg_data_src.gpt.in - файл с описанием GPT компоненты(может быть взят из другого ЛРМ)
- bootstrap - файл с инструкциями по запуску autoconf/automake для создания configure и т.д.
- dirt.sh - пустой файл
- configure.in - стаб для configure (может быть взят с заменой из другого ЛРМ)
- Makefile.am - стаб для Makefile.in, Makefile (может быть взят из другого ЛРМ)
globus_gram_job_manager_setup_<LRM>
Данная компонента обеспечивает Sheduler Adapter(SA) для ЛРМ. Компонента ответственна за создание perl модуля(именно создание поскольку perl модуль создаётся по шаблону уже после инсталяции компоненты с помощью setup скрипта) который отвечает за реализацию методов submit, cancel, poll для конкретной ЛРМ. Этот модуль perl в совокупности с модулями perl входящими в GRAM(не WS-GRAM) обеспечивает GRAM интерфейс к ЛРМ. WS-GRAM обеспечивается автоматически, как надстройка над GRAM.
В данной компоненте имеются следующие файлы/директории:
- <LRM>.in — стаб для <LRM>.pm (<LRM>.pm создается после инсталяции этой компоненты путем запуска setup-globus-job-manager-<LRM>.pl, весь ценный код находится здесь, подробнее далее)
- setup-globus-job-manager-<LRM>.pl - скрип по созданию perl модуля <LRM>.pm из <LRM>.in(фактически ищет где находятся утилиты CLI ЛРМ, файлы журналов и т.д.; может быть взят из другого ЛРМ)
- globus_gram_job_manager_<LRM>.dox - dox описание для setup-globus-job-manager-<LRM>.pl
- find-<LRM>-tools.in — ac файл описывающий преобразования <LRM>.in в <LRM>.pm(запускается из setup-globus-job-manager-<LRM>.pl и выполняет различные подстановки строк вида @MACROS@ в значения; может быть взят из другого ЛРМ)
В данной компоненте 1 существенный файл <LRM>.in. За исключением вставок вида @MACROS@ он является модулем perl и должен обеспечивать методы submit, cancel, poll. Метод poll нужен только если вы собираетесь работать с этой системой через GRAM. Для WS-GRAM он не нужен поскольку там используется SEG механизм. Проще всего файл форкнуть из другой ЛРМ в заменой части кода.
Hints:
Стоит отметить что метод sumbit возвращает структуру вида {JOB_ID => $job_id, JOB_STATE => Globus::GRAM::JobState::PENDING }. Здесь $job_id должен быть уникальным идентификатором задания внутри ЛРМ. Если он уникален только внутри конкретной очереди ЛРМ то стоит возвращать что то типа $queue-$job_id. Использовать символ ';' не стоит он зарезервирован внутри SEG. Кроме того существенно брать идентификатор в виде в котором он может легко идентифицировать задание в файлах журнала ЛРМ.
globus_scheduler_event_generator_<LRM>
Данная компонента обеспечивает Sheduler Event Generator(SEG) для ЛРМ. Компонента обеспечивает разделяемую библиотеку которая преобразует файл журнала ЛРМ в поток состояний конкретных заданий вида (001;<timestamp>;<job_id>;<status>;0). Эта библиотека в совокупности с исполняемым файлом $GLOBUS_LOCATION/libexec/globus-scheduler-event-generator обеспечивает WS-GRAM информацией о состоянии заданий в стандартизованной форме. WS-GRAM автоматически запускает globus-scheduler-event-generator с ключами -s <LRM> -t <timestamp> обеспечивая себя тем самым информацией о статусах заданий ЛРМ <LRM> после времени <timestamp>.
В данной компоненте имеются следующие файлы/директории:
- pkgdata/MyFilelists.pm - переопределяет некоторые метода для GPT чтобы правильно установить разделяемую библиотеку(может быть взят из другого ЛРМ)
- seg_<LRM>_module.c исходнный тест C для разделяемой библиотеки(весь ценный код находится здесь, подробнее далее)
В данной компоненте 1 существенный файл seg_<LRM>_module.c. Является исходным текстом на C и должен обеспечивать функции globus_l_<LRM>_module_activate, globus_l_<LRM>_module_deactivate, globus_l_<LRM>_clean_buffer, globus_l_<LRM>_increase_buffer, globus_l_<LRM>_find_logfile, globus_l_<LRM>_parse_events, globus_l_<LRM>_read_callback. Проще всего файл форкнуть из другой ЛРМ в заменой части кода(а именно функций globus_l_<LRM>_find_logfile, globus_l_<LRM>_parse_events, globus_l_<LRM>_read_callback).
Функция globus_l_<LRM>_find_logfile отвечает за поиск текущего файла журнала(обычно парсит файл $GLOBUS_LOCATION/etc/globus-<LRM>.conf и просто возвращает имя файла, но может совершать и более сложные действия в случае если журнал ротируется, разбивается по датам), функция globus_l_<LRM>_parse_events отвечает за разбор буфера чтения с конкретной строкой из журнала и генерацией потока событий в стандартной форме, функция globus_l_<LRM>_read_callback отвечает за чтение строк из журнала(в случае с если журнал ротируется или разбивается по датам вызывает globus_l_<LRM>_find_logfile после дочитки текущего файла журнала).
Hints:
Лучше начинать и заканчивать каждую функцию конструкцией вида
GlobusFuncName(globus_l_<LRM>_module_deactivate); SEG<LRM>Enter(); // код SEG<LRM>Exit();
Используете где только можно макрос SEG<LRM>Debug(<INFO_TYPE>, (<INFO_STRING>) для выдачи сообщений об ошибках, предупреждений, трассировок и т.д. Сообщения будут выдаваться если переменная окружения SEG_<LRM>_DEBUG установлена в отличное от нуля значение(на самом деле битовая маска). При значении 15 выдаются все сообщения. Отладку проще вести запуском globus-scheduler-event-generator -s <LRM> -t <timestamp>.
Для разбора даты в файле журнала используйте функцию globus_strptime. Все что нужно для разбора даты/времени в любом разумном виде там есть.
globus_scheduler_event_generator_<LRM>_setup
Данная компонента обеспечивает скрипт настройки для Sheduler Event Generator(SEG) для модуля ЛРМ globus_scheduler_event_generator_<LRM>.
В данной компоненте имеются следующие файлы/директории:
- setup-seg-<LRM>.pl — скрипт по созданию файла $GLOBUS_LOCATION/etc/globus-<LRM>.conf (фактически ищет где находятся файлы журнала ЛРМ; может быть взят из другого ЛРМ)
Существенных файлов данная компонента не имеет.
globus_scheduler_provider_setup_<LRM>
Данная компонента обеспечивает Sheduler Provider(SP) для ЛРМ. Компонента обеспечивает исполняемый файл perl который выдает в стандартной форме информацию о ресурсах кластера(очереди, полное/свободное количество CPU и т.д.). В совокупности с MDS4 обеспечивает в информационной системе текущую информацию о ЛРМ.
В данной компоненте имеются следующие файлы/директории:
- setup-globus-scheduler-provider-<LRM> - bash скрипт который запускает ./setup-globus-scheduler-provider-<LRM>.pl (может быть взят из другого ЛРМ)
- setup-globus-scheduler-provider-<LRM>.pl - скрип по созданию файла модуля globus-scheduler-provider-<LRM>.pl из globus-scheduler-provider-<LRM>.in (фактически ищет где находятся утилиты CLI ЛРМ, файлы журналов и т.д.; может быть взят из другого ЛРМ)
- find-<LRM>-provider-tools.in — ac файл описывающий преобразование globus-scheduler-provider-<LRM>.in из globus-scheduler-provider-<LRM>.pl(запускается из setup-globus-scheduler-provider-<LRM>.pl и выполняет различные подстановки строк вида @MACROS@ в значения; может быть взят из другого ЛРМ)
- globus-scheduler-provider-<LRM>.in - стаб для globus-scheduler-provider-<LRM>.pl (<LRM>.pm создается после инсталяции этой компоненты путем запуска setup-globus-scheduler-provider-<LRM>.pl, весь ценный код находится здесь, подробнее далее)
В данной компоненте 1 существенный файл globus-scheduler-provider-<LRM>.in. Проще всего файл форкнуть из другой ЛРМ в заменой части кода. За исключением вставок вида @MACROS@ он является программой perl и должен выдавать в стандартный поток вывода информацию вида:
<scheduler xmlns="http://mds.globus.org/batchproviders/2004/09" xmlns:ce="http://mds.globus.org/glue/ce/1.1" > xmlns:cfg="http://mds.globus.org/2005/09/cluster-config" > <Info ce:LRMSType="BS" ce:LRMSVersion="VERSION" ce:GRAMVersion="GRAM_VERSION" ce:HostName="HOSTNAME" ce:TotalCPUs="TOTALCPU" ce:FreeCPUs="FREECPU"> <Queue name="NAME"> <totalnodes>TOTALNODES</totalnodes> <freenodes>FREENODES</freenodes> <maxtime>MAXTIME</maxtime> <maxCPUtime>MAXCPUTIME</maxCPUtime> <maxCount>MAXCOUNT</maxCount> <totalJobs>TOTALJOBS</totalJobs> <runningJobs>RUNNING</runningJobs> <maxReqNodes>MAXREQNODE</maxReqNodes> <maxRunningJobs>MAXRUNNINGJOBS</maxRunningJobs> <maxJobsInQueue>MAXJOBSINQUEUE</maxJobsInQueue> <maxTotalMemory>MAXTOTALMEMORY</maxTotalMemory> <maxSingleMemory>MAXSINGLEMEMORY</maxSingleMemory> <whenActive>WHENACTIVE</whenActive> <status>STATUS</status> <dispatchType>DISPATCHTYPE</dispatchType> </Queue> <Queue> </Queue> </scheduler>
Hints:
Стоит отметить что существенная часть информации выдаваемая globus-scheduler-provider-<LRM>.pl игнорируется при преобразовании MDS4.
globus_wsrf_gram_service_java_setup_<LRM>
Выполняет настройку GRAM.
В данной компоненте имеются следующие файлы/директории:
- doxygen - директория существует во всех компонентах
- pkgdata - директория существует во всех компонентах
- pkgdata/pkg_data_src.gpt.in - файл с описанием GPT компоненты(может быть взят из другого ЛРМ)
- pkgdata/filelist - файл со списком файлов GPT компоненты(может быть взят из другого ЛРМ)
- dirt.sh - пустой файл
- setup-gram-service-<LRM> - просто запускает ${GLOBUS_LOCATION}/setup/globus/setup-gram-manager.pl(может быть взят из другого ЛРМ)
