Заметки о разработке стыка с GRAM и ЛРМ

Общие положения

Данный документ описывает как надо создавать такой стык с задачей минимизации временных расходов и потраченных нервных клеток разработчиков. Задача интеграция нового Локального Менеджера Ресурсов(далее ЛРМ) в 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(может быть взят из другого ЛРМ)