Распределение рабочей нагрузки / параллельное выполнение в JAVA - PullRequest
2 голосов
/ 24 июня 2009

У меня есть ситуация, когда мне нужно распределить работу по нескольким процессам JAVA, работающим в разных JVM, возможно, на разных машинах.

Допустим, у меня есть таблица с записями от 1 до 1000. Я ищу работу, которую нужно собрать и распределить в наборах 10. Давайте скажем записи 1-10 для workerOne. Затем записывает 11-20 на рабочий три. И так далее. Само собой разумеется, что workerOne никогда не выполняет работу workerTwo, если и до тех пор, пока workerTwo не может это сделать.

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

У меня небольшое ощущение, что немедленным ответом было бы пойти на подход Мастера / Работника. Однако здесь мы говорим о разных JVM. Даже если одна JVM должна выйти из строя, другая JVM должна просто продолжать выполнять свою работу.

Теперь вопрос на миллион долларов будет: есть ли какие-нибудь хорошие рамки (готовые к производству), которые позволили бы мне сделать это? Даже если есть конкретные реализации конкретных потребностей, таких как записи в базе данных, обработка файлов, обработка электронной почты и тому подобное.

Я видел Java Parallel Execution Framework, но не уверен, что его можно использовать для разных JVM, и если один из них выйдет из строя, другой продолжит работу. Я считаю, что работники могут работать на нескольких JVM, но как насчет Master

Дополнительная информация 1: Hadoop будет проблемой из-за требования JDK 1.6. Это слишком много.

Спасибо, Франклин

Ответы [ 7 ]

2 голосов
/ 24 июня 2009

Возможно, вы захотите взглянуть на MapReduce и Hadoop

1 голос
/ 25 июня 2009

Проблема, которую вы описали, определенно лучше всего решается с использованием шаблона мастер / работник.

Вы должны взглянуть на JavaSpaces (часть фреймворка Jini), он действительно хорошо подходит для такого рода вещей. По сути, вы просто хотите инкапсулировать каждую задачу, выполняемую в объекте Command, подклассами по мере необходимости. Скопируйте их в JavaSpace, позвольте вашим работникам захватывать и обрабатывать по одному, а затем собирать заново, когда закончите.

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

1 голос
/ 24 июня 2009

Я верю, что Терракота может сделать это. Если вы имеете дело с веб-страницами, JBoss можно кластеризовать.

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

Возможно, вы захотите уточнить, какую работу вы хотите делать.

1 голос
/ 24 июня 2009

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

1 голос
/ 24 июня 2009

Выезд Hadoop

0 голосов
/ 15 октября 2014

Я бы подумал об использовании Jgroups для этого. Вы можете кластеризовать свои jvms, и один из ваших узлов может быть выбран в качестве главного, а затем может распределить работу по другим узлам, отправив сообщение по сети. Или вы уже можете разбить свои рабочие элементы и затем управлять в главном узле распределением разделов, таких как раздел 1, один переходит в JVM-4, раздел 2 переходит в JVM-3, раздел 3 переходит в JVM-2 и так далее , И если JVM-4 выйдет из строя, он будет реализован главным узлом, а затем мастер-узел скажет одному из других узлов также начать захват раздела-1. Еще одна альтернатива, которую проще использовать, - поддержка subis pub. http://redis.io/topics/pubsub. Но тогда вам придется поддерживать серверы Redis, которые мне не нравятся.

0 голосов
/ 24 июня 2009

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

Для обработки файлов это может быть аналогичный случай. Работа с файлами в (общей) файловой системе может создать большую нагрузку ввода-вывода для ОС.

И стоимость обслуживания нескольких JVM на нескольких машинах может быть слишком большой.

И на вопрос: я однажды использовал JADE (Среда разработки агента Java) для некоторого распределенного моделирования. Его поддержка нескольких машин и передача сообщений могут вам помочь.

...