Запуск заданий, требующих данные -- WMProxy интерфейс
JDL атрбуты InputSandbox и OutputSandbox являются самым простым способом передачи файлов между User Interface (UI) и Working Node (WN). Эти атрибуты и их использование описано на странице "Ещё о JDL атрибутах" Практикума. Однако существуют и другие способы передачи файлов на/c WN. Особенно это важно, когда передаются большие файлы (>10Mb), в этом случае этот способ передачи становится критическим для общей эффективности системы. Поэтому и существует ограничение на размер файлов, пердаваемых через этот механизм.
Data Requirements
Первый пример описывает JDL атрибут Data Requirements; этот атрибут представляет список из групп атрибутов, определяющих требования к файлам данных, с которыми работает задание. Каждая из групп содержит три атрибута: InputData, DataCatalog, DataCatalogType, которые соответственно представляют: список входных файлов, необходимых заданию; тип каталога данных, который будет использоваться для определения физических имён файлов и, наконец, URI каталога данных, если используется каталог, отличный от каталога, определённого по умолчанию для данной ВО. Наличие атрибута Data Requirements заставляет задание выполняться на том CE, который является ближайшим к SE, на котором хранятся требуемые файлы. Подробнее о том, как сохранять файл на SE, можно посмотреть здесь. Отметим, что этот атрибут не обеспечивает действительное копирование файлов с SE на WN, как мы увидим далее это должно выполнять само задание пользователя.
Вначале скопируем файл на SE и зарегистируем его его в Каталоге. Следует отметить, что имя, под которым файл будет зарегистрирован в каталоге будет содержать ваше локальное имя, как оно определено в переменной окружения $USER.
$ echo "Hello World " > local_test.txt $ lcg-cr -l lfn:/grid/gilda/tutorials/testSE-CE-$USER.txt file:$PWD/local_test.txt guid:522950d4-a28a-48aa-939b-d85c9ab5443f
В аргументах JDL файла содержится LFN файла. *** Вам необходимо заменить cern18 на ваше имя пользователя ***.
$ cat inputdata.jdl [ Executable = "/bin/sh"; Arguments = "scriptInputData.sh lfn:/grid/gilda/tutorials/testSE-CE-cern18.txt"; StdOutput = "std.out"; StdError = "std.err"; InputSandbox = "scriptInputData.sh"; OutputSandbox = {"std.out","std.err"}; DataRequirements = { [ InputData = {"lfn:/grid/gilda/tutorials/testSE-CE-cern18.txt"}; DataCatalogType = "DLI"; DataCatalog = "http://lfc-gilda.ct.infn.it:8085"; ] }; DataAccessProtocol = {"rfio","gsiftp"}; RetryCount = 3; ]
Для собственно копирования файла с SE на WN скрипт использует команду lcg-cp. Потом скрипт проверяет, что файл корректно передался на WN и затем распечатываетего содержимое
[giorgio@glite-tutor]$ cat scriptInputData.sh #!/bin/sh # Set properly the environment export LFC_HOST=lfc-gilda.ct.infn.it export LCG_GFAL_INFOSYS=glite-rb.ct.infn.it:2170 export LCG_CATALOG_TYPE=lfc # Download the file from the SE # note that the LFN is passed as input to this script lcg-cp --vo gilda $1 file:`pwd`/local_file echo "########################################" ls -la local_file echo "########################################" # type the file just donwloaded cat local_file
Теперь можно стандартным образом запустить скрипт на выполнение, проверить статус выполняемого задания, получить выходные параметры и проверить их. Если вы хотите запустить этот пример, вы должны создать два файла - inputdata.jdl и scriptInputData.sh, содержимое которых указано выше. Конечно, вы должны скопировать и зарегистрировать свой собственный файл и, соответственно, изменить LFN в атрибуте DataRequirements
Весь процесс будет выгдядеть примерно так:
[giorgio@glite-tutor]$ glite-wms-job-submit -d $USER inputdata.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/QM7WNAPvPOx43z0MixHo2A ========================================================================== [giorgio@glite-tutor]$ glite-wms-job-status https://glite-rb3.ct.infn.it:9000/QM7WNAPvPOx43z0MixHo2A ************************************************************* BOOKKEEPING INFORMATION: Status info for the Job : https://glite-rb3.ct.infn.it:9000/QM7WNAPvPOx43z0MixHo2A Current Status: Scheduled Status Reason: Job successfully submitted to Globus Destination: grid010.ct.infn.it:2119/jobmanager-lcgpbs-long Submitted: Wed Oct 17 10:44:56 2007 CEST *************************************************************
Можно отметить, что заданию для выполнения назначен CE, который является "ближайшим" для SE, на котором хранится файл.
[giorgio@glite-tutor]$ glite-wms-job-status https://glite-rb3.ct.infn.it:9000/QM7WNAPvPOx43z0MixHo2A ************************************************************* BOOKKEEPING INFORMATION: Status info for the Job : https://glite-rb3.ct.infn.it:9000/QM7WNAPvPOx43z0MixHo2A Current Status: Done (Success) Exit code: 0 Status Reason: Job terminated successfully Destination: grid010.ct.infn.it:2119/jobmanager-lcgpbs-long Submitted: Wed Oct 17 10:44:56 2007 CEST ************************************************************* [giorgio@glite-tutor]$ glite-wms-job-output https://glite-rb3.ct.infn.it:9000/QM7WNAPvPOx43z0MixHo2A 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/QM7WNAPvPOx43z0MixHo2A have been successfully retrieved and stored in the directory: /tmp/glite/glite-ui/giorgio_QM7WNAPvPOx43z0MixHo2A ================================================================================ [giorgio@glite-tutor]$ cd /tmp/glite/glite-ui/giorgio_QM7WNAPvPOx43z0MixHo2A [giorgio@glite-tutor]$ cat std.out ######################################## -rw-r--r-- 1 gilda003 gilda 139 Oct 17 12:35 local_file ######################################## Hello World
Передача данных с WN на CE
А как поступать, если нужно передать данные с Worker Node на SE? Вероятно, Вы думаете, что можно в JDL файле в каком-либо атрибуте просто указать имя файла и LFN, а затем он автоматически будет передан на какой-либо SE и зарегистрирован в каталоге? Так, скорее всего и будет, но к сожалению, такая функциональность пока не реализована в WMProxy. Однако это может быть легко реализовано при помощи небольшого скрипта.
$ cat registeringfile-script.sh #!/bin/sh # Author : Emidio Giorgio # Usage : register a file to the default SE, with a specified LFN # - The file to copy and register is passed as first input to the script ($1) # - The logical file name it will have is the second input to the script ($2) # - the LFN will be so /grid/gilda/tutorials/$2 # Set properly the environment export LFC_HOST=lfc-gilda.ct.infn.it export LCG_GFAL_INFOSYS=glite-rb.ct.infn.it:2170 export LCG_CATALOG_TYPE=lfc # Actually upload the file to the SE # path to the file to be registered is built as {current path}/{relative path from this script to filename} lcg-cr --vo gilda -l lfn:/grid/gilda/tutorials/$2 file:$PWD/$1
Этот скрипт должен запускаться в конце выполнения вашего задания. Вы можете вызвать его из главного скрипта, который реализует основную функциональность задания, как это показано ниже. Не забудьте заменить выражение CHANGEME на что-то другое по вашему выбору и что будет являться логическим именем файла в директории /grid/gilda/tutorials/ каталога. Например что-то вроде *** /bin/sh registeringfile-script.sh fileout.txt cern18-WN2SE ****.
cat scriptWhichDoesSomething.sh #!/bin/sh # do whatever echo "This is a very dummy test" > fileout.txt # run the script which registers the file fileout.txt just created above /bin/sh registeringfile-script.sh fileout.txt CHANGEME # greetings echo "All done correctly (I hope). Bye bye"
Основа JDL файла для запуска будет выглядеть примерно так:
$ cat JobWritingToSE.jdl [ Executable = "/bin/sh"; Arguments = "scriptWhichDoesSomething.sh"; StdOutput = "std.out"; StdError = "std.err"; # carry out also the script which registers the file InputSandbox = {"scriptWhichDoesSomething.sh","registeringfile-script.sh"}; OutputSandbox = {"std.out","std.err"}; ]
Конечно, можно просто вставить содержимое файла registeringfile-script.sh в основной скрипт. В качестве самостоятельной работы попробуйте реализовать этот способ передачи файлов таким образом. Получился ли результат таким, как вы его ожидали?