2013-07-24 1 views
1

У меня есть приложение , работающее на кластере/сетке где мне нужно Запуск N задач, которые не должны связываться. Мне нужно только собрать результат каждой задачи. Таким образом, у меня есть Мастер, распределяющий задачи на некоторые Slaves (возможно, работающие на разных хостах) и объединяя все результаты в конце.Распределение и сборка задач Java по сетке

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

Я ищу библиотеку (чистую Java), чтобы помочь мне в этом. Я посмотрел на следующее:

MPJ - не работает для меня из-за того, что MPJ работает, когда на одном компьютере имеется несколько процессоров. Он использует пользовательские загрузчики классов, и это создает проблемы с загружаемой мной загрузочной библиотекой (она загружается несколько раз, потому что пользовательские загрузчики классов загружают класс несколько раз).

Hazelcast - работает в принципе, но это на самом деле не сделал для этого (я могу распределить работу с очередью и поместить результат обратно в другой очереди, но это кажется немного излишним). Мне нравится, что легко настроить группу узлов (в принципе нужно только указать один, а другие узлы могут просто подключиться к нему).

Simon/RMI - Я предполагаю, что я могу позволить каждому подчиненному регистру регистрироваться у ведущего, а затем позволить мастеру распределять задания каждому подчиненному. Или пусть каждый подчиненный запрашивает очередь, в которой заданы очереди, и очередь, в которой результаты должны храниться у ведущего.

Cajo - будет работать в принципе, но я не хочу иметь многоадресную рассылку в сетке сетки, и, похоже, это не так для Cajo.

RabbitMQ - Мне не нравится, когда работает дополнительный сервер, и это не чистая Java. То же самое для ZeroMQ.

Akka - Кажется, тоже излишний. И много настроек для настройки группы узлов.

Hadoop - Как, например, Akka является излишним, особенно для настройки группы узлов.

JPPF - Похоже, что он больше подходит для создания длинного кластера серверов и узлов. После завершения моего приложения мне нужно остановить все серверы и узлы. Также полагается на Сериализацию Заданий, которая для меня не является вариантом (см. Ниже)

Так что я бы придерживался либо Hazelcast, либо Simon. Какой из них лучше подходит для такого рода приложений? Кто-нибудь знает другую библиотеку (не слишком тяжелая, не слишком большая конфигурация). Любые другие предложения?

Hazelcasts ExecutorService - это не вариант кстати. потому что я использую JNI, и поэтому сериализация будет болью.

ответ

0

Я, наконец, поселился с MPJ.Проблему с пользовательскими загрузчиками классов можно просто обойти, не используя скрипты, включенные в MPJ, но вместо вызова программы Java непосредственно со следующими параметрами:

Java класса ранг MPJ-конфигурация niodev [дополнительными аргументами для применения]

Аргументы rank, mpj-config и niodev будут удалены вызовом MPI_Init. mpj-config - это список номеров, состоящий из числа рангов, порог переключения для протокола сообщений и список хостов с соответствующим номером порта и ранга. niodev указывает механизм связи (подробнее см. документацию MPJ-Express). Конфигурационный файл может выглядеть следующим образом:

3 
131072 
[email protected]@0 
[email protected]@1 
[email protected]@2 

Важно отделить номера портов на одном хосте на 2, потому что MPJ использует указанный порт + следующий (так, например, 20000 и 20001).

Simon и Hazelcast также были хорошими решениями, но они были немного медленнее, чем MPJ. Особенно инициализация для обоих довольно немного медленнее.

0

Дайте мне знать, если это решение не работает. Hazelcast обеспечивает выполнение нескольких узлов с помощью службы Executor.

Итак, вы получите список узлов, которые хотите выполнить задачу.

А потом

HazelcastInstance h = Hazelcast.newHazelcastInstance(); 
Set<Member> members = h.getCluster().getMembers();//or any subset given your requirement 
MultiTask<Long> multitask = new MultiTask<Long>(new MyCallableTask("default"), members); 
ExecutorService es = h1.getExecutorService(); 
es.execute(multitask); 
Collection<Long> results = multitask.get(); 

Единственное, что вам нужно сделать, это иметь класс MyCallableTask в пути к классам всех узлов.

+0

Спасибо за это, но, как указано выше, «Hazelcasts ExecutorService - это не вариант, потому что я использую JNI, и поэтому сериализация будет болью». Во всяком случае, я бы предположил, что это будет также медленнее, чем MPJ, поскольку Hazelcast будет использовать распределенные структуры внутри для распределения задач. – bennihepp

Смежные вопросы