Содержание


Разработка grid-приложений при помощи инструментальных средств с открытыми исходными кодами

Comments

Компоненты с открытыми исходными кодами

Сообщество сторонников открытых исходных кодов имеет и поддерживает огромный диапазон инструментальных средств и продуктов, которые очень легко могут использоваться в интегрированных grid-средах. Инструментальные средства с открытыми исходными кодами охватывают весь спектр различного программного обеспечения и технологий, от операционных систем, таких как Linux® и BSD, до полнофункциональных сред разработки на C/C++, таких как GNU CC. Можно также получить доступ к простым в использовании языкам программирования сценариев, таким как Perl, а также к компонентам, наборам инструментальных программ и интегрированным средам разработки, таким как Web-services tool kits от Apache или Eclipse Integrated Development Environment (IDE).

Эти компоненты можно использовать индивидуально или совместно для создания grid-решения, применяя встроенные решения или преимущества стандартизации grid-решений, включая группу Web-сервисов WS-*, часто используемую в средах разработки grid-приложений, таких как Globus.

Главным преимуществом использования компонентов с открытыми исходными кодами является простота доступа, разработки и развертывания. Поскольку программное обеспечение предоставляется свободно, можно использовать, развертывать и пробовать различные решения до тех пор, пока не найдется подходящее.

Иногда использование инструментальных средств с открытыми исходными кодами может также ускорить решение задачи. Причина этого заключается в том, что подобные инструментальные средства коллективно разрабатываются группой людей, которые могут дорабатывать и модифицировать оригинальный исходный код. Это позволяет найти проблемный или слишком долго выполняющийся компонент и исправить его код, чтобы облегчить его использование или сделать его более полезным.

Но, возможно, самое важное состоит в том, что для подавляющего большинства решений с открытыми исходными кодами можно свободно использовать, изменять и расширять оригинальный код для собственных нужд и требований. Если выбранное инструментальное средство не предоставляет нужную информацию, его функциональность обычно можно расширить, чего нельзя сказать о большинстве коммерческих программ, либо можно изменить оригинальный исходный код для достижения своих целей.

Почти всегда можно воспользоваться гибкостью оригинального решения для своих потребностей. Давайте начнем рассмотрение функциональности и гибкости, предлагаемых наиболее распространенным решением - языками программирования сценариев с открытыми исходными кодами.

Использование языков сценариев

Основной областью, где можно воспользоваться преимуществами модели открытых исходных кодов, являются языки сценариев. Такие языки как Perl, PHP, Python и Ruby предоставляют широкий спектр функциональности и позволяют быстро и легко разрабатывать приложение, которое может быть использовано в распределенной среде.

На языке сценариев (по причине отсутствия необходимости следовать обычной последовательности написание/компиляция/компоновка/выполнение) разработку приложения часто можно выполнить намного быстрее, чем на традиционном C/C++. Более того, все языки сценариев предоставляют библиотеки и расширения для подключения к различным технологиям Web-сервисов, таким как SOAP и XML-RPC, а это означает, что можно быстро разработать решение, которое будет являться интерфейсом к существующей инфраструктуре, или создать абсолютно новые Web-сервисы для поддержки grid-сервиса.

Web-сервисы часто являются основной частью современных Web-решений. Web-сервисы предоставляют много преимуществ, таких как легкое развертывание, гибкость и совместимость. Например, можно создать клиента Web-сервисов на Perl:

Листинг 1. Разработка клиента Web-сервисов на Perl
#!/usr/bin/perl

use warnings;
use strict;

use SOAP::Lite;

print SOAP::Lite
  -> uri('http://snode1:32080/')
  -> proxy('http://snode1:32080/?session=store')
  -> submit_image($image)
  -> result;

print "\n";

В данном примере, взятом из grid-решения (написано на Perl) и реализующем систему хранения фотографий (ссылки на серию статей "Создание Grid с использованием Perl" приведены в разделе "Ресурсы"), мы используем модуль SOAP::Lite для компоновки SOAP-клиента. В этом случае мы обращаемся к Web-сервису на порт 32080 grid-узла snode1 и передаем изображение в систему.

Конфигурацию индивидуальных серверов в grid-решении можно упростить, используя внутренний хэш-тип Perl, как показано ниже.

Листинг 2. Использование внутреннего хэш-типа Perl
$node = {
    'name' => 'linux-grid-1',
    'type' => 'snode',
    'remote => 'snode1',
    'gridid' => '43729810-09399528-817022102',
    'grid' => 'image-grid-1',
    'nodeid' => '57175600-10287415-53438102',
    'distributorid' => '',
    'distributor' => '',
    'verification-id' => '',
};

После передачи фотографии в grid мы используем сгенерированную отдельными узлами информацию для отслеживания текущей доступности их систем хранения, выбора узла и сериализации информации (используя Perl Dumper) в структуру, которую можно сохранить в базе данных.

Распределение информации по grid производится путем получения списка текущих ожидающих запросов и обработки списка провайдеров (grid-узлов), а затем используется SOAP-интерфейс для распределения окончательной единицы работы на целевой узел. Поиск узлов для существующего элемента работает почти в обратном порядке - мы передаем поисковый запрос на каждый из известных узлов и объединяем ответы.

В листинге 3 показан другой пример; на этот раз вычислительный grid написан полностью на Python. Для данного решения мы использовали не только Web-сервисы, но также гибкость языка Python как языка сценариев.

Для большинства вычислительных grid-решений необходимо разработать приложение, которое может выполнять вычисление и возвращать результаты. Используя Python, можно распределить Python-сценарий, выполняющий вычисление. Вместо ограничений функциональности, предлагаемых автономным приложением, мы имеем полную гибкость для выполнения любого Python-сценария распределенным образом.

Основой grid-функциональности является Web-сервис, на этот раз использующий XML-RPC, который легче реализовать. Python-модуль основного провайдера (grid-узел) приведен ниже.

Листинг 3. Вычислительный grid на Python
import time,sys
sys.path.append('..')
import DWGrid
from xmlrpclib import Server

gridspec = DWGrid.DWGrid()
provider = DWGrid.DWGridProvider(gridspec,'sulaco','192.168.0.101')
provider.register_component()

distributor = Server(gridspec.distributor)

def get_workunits():
    global provider,gridspec
    items = distributor.getworkunits(5)
    counter = 0
    for item in items:
        gridspec.workunitqueue.add(item,'queue',item['_workunitid'])
        counter = counter+1
    return counter

def run_calculation(item):
    workunit = provider.grid.workunitqueue.get(item,'queue')
    distributor.log_status(provider.name,1)
    gridspec.workunitqueue.move(workunit['_workunitid'],'queue','active')
    modulename = workunit['calctype']
    try:
        exec 'import calculate_' + modulename + ' as calculate'
    except:
        (result,moduledata) = distributor.get_service_byname(modulename,'module')
        if (result == 0):
            modulefile = open('calculate_%s.py' % modulename,'w')
            modulefile.write(moduledata)
            modulefile.close()
            try: 
                exec 'import calculate_' + modulename + ' as calculate'
            except:
                gridspec.workunitqueue.move(workunit['_workunitid'],'active','queue')
                print "Error, module recovered from server does not load"
                sys.exit(1)
        else:
            print "Error, module %s from server doesnt exist" % (modulename)
            gridspec.workunitqueue.move(workunit['_workunitid'],'active','queue')
            sys.exit(1)
    distributor.log_event('log',provider.name,
                         'Starting Processing Workunit ID %s' % (item))
    calcfunc = calculate.DWGridComputational()
    result = calcfunc.execute(workunit['args'])
    distributor.log_event('log',provider.name,'Finished Processing 
	                                                   Workunit ID %s' % (item))
    workunit['result'] = result
    gridspec.workunitqueue.move(workunit['_workunitid'],'active','complete')
    gridspec.resultqueue.add(workunit,'queue',workunit['_workunitid'])

def put_results(items):
    for resultid in items:
        workunit = gridspec.resultqueue.get(resultid,'queue')
        gridspec.resultqueue.move(resultid,'queue','active')
        try:
            distributor.putresult(workunit)
        except:
            gridspec.resultqueue.move(resultid,'active','queue')
            return
        gridspec.resultqueue.move(resultid,'active','complete')

while 1:
    # прежде всего, необходимо проверить, есть ли что-то 
    # в нашей очереди, что нужно вычислить
    items = provider.grid.workunitqueue.list('queue')
    if len(items) > 0:
        run_calculation(items[0])
    else:
        count = get_workunits()
        if count == 0:
            distributor.log_status(provider.name,0)
            time.sleep(60)
        continue
    items = provider.grid.resultqueue.list('queue')
    if len(items) > 0:
        put_results(items)

Хотя этот листинг может показаться устрашающим, вы видите основные элементы, выполняющие grid-компоненты:

  • get_workunits() связывается с распределительным узлом и получает список единиц работы, ожидающих выполнения.
  • run_calculation() извлекает Python-модуль, необходимый для вычисления, сохраняет модуль во внешнем файле, загружает файл, готовый к выполнению встроенного вычислительного метода, и выполняет его, добавляя результаты вычислений во внутреннюю очередь провайдера.
  • put_results() берет результаты вычислений и передает их в распределительный узел.

То, что все основанное на Python grid-решение заняло немногим более 300 строк кода и является достаточно гибким для обработки разнообразных вычислительных модулей и результатов, включая элементы регистрации, распределения и сбора данных, демонстрирует, насколько ускоряется разработка с использованием Python или других решений с открытыми исходными кодами.

Библиотеки и интегрированные среды с открытыми исходными кодами

Я уже описывал, как преимущества инструментальных средств с открытыми исходными кодами позволяют изменять для ваших потребностей оригинальный код, но часто в этом нет необходимости. Нужная функциональность и инструментальные средства часто уже доступны, не потому что они встроены в оригинальное решение, а потому что решения часто более гибки и расширяемы.

Перед рассмотрением некоторых основных интегрированных сред нельзя не упомянуть о базовых библиотеках и расширениях, предлагаемых многими языками сценариев. Python и PHP поставляются с большим набором стандартных модулей и функциональностью, готовыми к использованию. Имеется также огромное количество расширений сторонних производителей. Perl имеет широко известную библиотеку модулей Comprehensive Perl Archive Network (CPAN).

Существует несколько интегрированных сред, созданных при помощи технологии с открытыми исходными кодами и комбинирующих функциональность многих различных компонентов в систему, которую можно использовать для разработки и развертывания различных типов приложений. Хотя не все рассмотренные здесь интегрированные среды с открытыми исходными кодами предназначены для разработки grid-решений, большинство из них можно адаптировать, изменить или использовать в качестве основы для разработки grid-решений.

LAMP и его производные

Оригинальная интегрированная среда LAMP, обозначающая комплект, состоящий из операционной системы Linux, HTTP-сервера Apache, базы данных MySQL и наборов инструментальных средств PHP, использовалась для создания Web-сайтов. Со временем LAMP породила много производных продуктов. Например, символ "P" часто использовался для дополнительного обозначения основанных на Perl и Python сред, или он мог заменяться на "R" (LAMR) для обозначения решений Ruby или Ruby on Rails, а также на "J" для систем Java™/JSP.

"L" заменена для Windows® - WAMP, которая трансформировалась в WIMP (Windows и IIS), SAMP (Solaris), MAMP (Mac OS X) и даже BAMP (BSD). MySQL тоже часто заменялась на PostgreSQL (LAPP). Добавлялись также коммерческие интегрированные среды и приложения, например, акронимы WASP (Windows, Apache, SQL Server и PHP) и OPAL (Oracle).

Среда LAMP была предназначена для разработки и развертывания Web-сайтов и использовала некоторые лучшие отдельные элементы в комбинации, в которой многие из них уже использовались. Хотя эта среда не предназначалась для разработки grid-решений, объединение этих отдельных инструментальных средств в один пакет может значительно облегчить разработку и развертывание grid-решений.

Мы можем использовать преимущества каждого инструментального средства для обработки различных частей типичного grid-решения:

  • Apache - это мощный HTTP-сервер, предоставляющий масштабируемую среду для обслуживания различных приложений и сценариев; он может также использоваться для обеспечения функциональности систем защиты и слежения.
  • MySQL, PostgreSQL и Apache Derby - это очень эффективные реляционные базы данных. В типичном grid-решении они могут использоваться для реализации централизованной системы хранения и предоставления ресурсов.
  • Perl, Python, PHP, Ruby и другие предоставляют подходящую интегрированную среду сценариев для быстрой разработки приложений и могут вызывать разнообразные и мощные библиотеки и расширения, обеспечивающие специфичную функциональность, например, Web-сервисы или систему защиты.

Кроме предоставления возможности быстрой разработки, использование LAMP или ее производных позволяет легко и быстро выполнять развертывание. Большинство дистрибутивов Linux поставляется со стандартным набором LAMP. Следовательно, создание grid-решений, использующих среду LAMP, часто сводится к установке и настройке отдельных основанных на Linux grid-узлов и развертыванию сценариев grid-приложения на этих узлах.

Инструментальные средства Apache Java

Хотя сама по себе Java не является системой с открытыми исходными кодами, огромное количество инструментальных средств и библиотек с открытыми исходными кодами создано с использованием технологии Java для обеспечения основной функциональности (например, Web-сервисов), а также для создания некоторых инструментальных средств, специфичных для grid. Важнейшие из различных доступных инструментальных средств предлагает Apache Software Foundation.

Apache разработала набор инструментальных средств, которые мы можем использовать при создании интегрированных grid-сред:

  • Apache Tomcat - это основанная на Java Web-среда, которую можно применять для совместного использования базовых файлов и основанных на Web решений для Java-приложений, например, JSP и Java-сервлетов. Tomcat часто является основной обслуживающей средой, используемой для многих других инструментов из набора программ Apache Java, которые сами основаны на той же технологии JSP/сервлеты.
  • Axis - это реализация решения SOAP Web-сервисы, а Axis2 - это переработанная реализация, поддерживающая не только SOAP, но и другие решения, например, Representational State Transfer (REST). Набор инструментальных средств Axis2 содержит много реализаций ключевых Web-сервисов, например, WS-Reliable Messaging, WS-Coordination, WS-Security и WS-Addressing, которые используются в качестве основы современной, основанной на Web-сервисах grid-среды.
  • Apache Muse - это реализация стандартов WS-ResourceFramework, WS-BaseNotification и WS-DistributedManagement, которые также являются ключевыми элементами многих основанных на Web-сервисах интегрированных grid-сред. Muse и Axis/Axis2 основаны на среде Tomcat, обеспечивающей базовый HTTP-протокол.

Комбинируя эти сервисы и используя функциональность, предлагаемую различными основанными на Web-сервисах решениями, можно легко создать grid-решение. Список учебных руководств, статей и решений по этой теме приведен в разделе "Ресурсы".

Все перечисленные выше решения являются решениями с открытыми исходными кодами. Однако они строго контролируются и управляются организацией Apache Software Foundation - группой разработчиков и проектировщиков, которые гарантируют сохранение предназначения и целей вышеуказанных решений в индивидуальных проектах.

ActiveGrid

Система ActiveGrid не является, как следует из названия, специфичной для grid интегрированной средой разработки и развертывания. Не является она и истинной системой с открытыми исходными кодами. ActiveGrid - это интегрированная среда, дающая возможность применять LAMP при разработке приложений, которые позволяют использовать grid-подобную технологию для разработки распределенных бизнес-приложений.

Система основана на двух компонентах: ActiveGrid Application Builder для проектирования и разработки приложения и ActiveGrid Application Server, который можно использовать для развертывания приложения.

Суть заключается в разработке полнофункциональных приложений, использующих преимущество интегрированной grid-среды, предоставляя более компактные, масштабируемые компоненты, которые можно использовать для разработки более компактных, обособленных приложений.

Резюме

Мы рассмотрели преимущества и недостатки разработки grid-решения с использованием технологии с открытыми исходными кодами. Ключевые моменты, которые можно выделить в приведенных в данной статье примерах и информации, - это простота использования и скорость разработки. Используя комбинацию интегрированных сред быстрой разработки, предлагаемых языками сценариев и многими библиотеками и решениями с открытыми исходными кодами, можно очень быстро и легко создать grid-решение.

Решения на Perl и Python, подробно рассмотренные в данной статье, взяты из большой серии статей по разработке grid-решений (см. раздел "Ресурсы").


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=304729
ArticleTitle=Разработка grid-приложений при помощи инструментальных средств с открытыми исходными кодами
publish-date=04292008