Распространение Java-потоков по нескольким серверам? - PullRequest
8 голосов
/ 02 марта 2012

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

Я провел небольшое исследование и нашел очереди, и не уверен, что мне это нужно, или есть что-то еще (я также думал, что поддерживать целостность / мониторинг рабочих может быть слишком для меня, чтобы писать как новичок). У меня дома 4 компьютера (некоторые Linux, mac и windows ... но я могу установить linux vm на всех не-linux системах, если эти решения специфичны для os) и хотел попробовать заставить их начать работать и над этой задачей. Я думал о создании очередей Java, которые другие клиенты собирают по кусочкам и обрабатывают, но я также видел библиотеки (rabbitmq). Я также кратко рассмотрел сеточные вычисления.

Это путь или есть лучший путь? Мне не нужен какой-либо код или что-то еще, я просто хочу знать, каковы решения для распределения потоков или какие факторы использовать при их оценке.

Ответы [ 4 ]

9 голосов
/ 02 марта 2012

Вы можете использовать JMS или Hazelcast (например, распределенный ExecutorService) для распределения работы между машинами.

Что я хотел бы сделать в первую очередь, так это посмотреть на улучшение ваших алгоритмов. Вы можете обнаружить, что на 4 машинах вы можете работать в 2-4 раза быстрее, но вы можете добиться повышения производительности в 10-1000 раз за счет профилирования производительности, рефакторинга и настройки, часто с меньшей сложностью.

7 голосов
/ 02 марта 2012

Просто подвести итог - у вас уже есть увеличено , теперь вы хотите уменьшите .Сверху головы:

  • : вы можете создать Java Queue, который будет автоматически распределен по всему кластеру.В основном вы запускаете одно и то же приложение с несколькими потоками, считывающими данные из очереди.Терракота волшебным образом распределяет эту очередь так, что она выглядит как локальный объект.

  • - аналогичный подход к терракоте, распределенным структурам данных и исполнителям

  • - отправить сообщение с частью работы в очередь JMS (очередь снова) и иметь несколько прослушивателей.Каждый слушатель более или менее единый поток.Слушатели могут быть настроены на разных машинах.

  • - Map / Reduce Java Framework для легкого масштабирования больших объемов данных.Обычно используется для обработки данных и агрегирования результатов.

2 голосов
/ 02 марта 2012

Как правило, использование очереди (например, RabbitMQ) для загрузки «заданий», а затем получение работниками извлечения заданий из очереди для обработки - это наиболее масштабируемый шаблон, для запуска и работы которого не требуется слишком много работы..

Как только это будет на месте, вы можете раскрутить всех нужных вам работников, распределить их по всем машинам, которые у вас есть / нужны.

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

Например, если задания связаны с ЦП, нет смысла запускать больше потоков в одном блоке, чем у вас есть ядра для их запуска (-1 ядро, которое используется для управления потоками).

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

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

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

1 голос
/ 02 марта 2012

Вам не нужна виртуальная виртуальная машина для запуска Java.Скорее всего, ваша программа будет работать без проблем на всех трех основных ОС.

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

Подключите компьютеры с помощью сокетов.Каждый рабочий может охватывать n+1 потоков, где n - это количество ядер ЦП на этом компьютере.

...