Как создать Linux-кластер для запуска физических симуляций в Java? - PullRequest
6 голосов
/ 02 декабря 2008

Я занимаюсь разработкой научного приложения для физического моделирования. Используются алгоритмы O (n3), поэтому для большого набора данных обработка занимает очень много времени. Приложение запускает симуляцию примерно за 17 минут, и мне нужно выполнить около 25 000 симуляций. Это около года обработки.

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

Есть несколько решений, которые я вижу, чтобы реализовать это:

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

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

Тем не менее, я удивляюсь возможностям последнего варианта, традиционного кластера. Насколько сложно запустить программу на Java в сетке Linux? Будут ли все отдельные компьютеры рассматриваться как один компьютер с несколькими ядрами, что облегчит адаптацию программы? Есть ли хорошие ссылки на ресурсы, которые позволили бы мне начать? Или я делаю это слишком сложным, и мне лучше с вариантом 2?

РЕДАКТИРОВАТЬ: В качестве дополнительной информации меня интересует, как реализовать нечто подобное описанному в этой статье из журнала Wired: Scientific заменил суперкомпьютер на кластер Linux Playstation 3 . Определенно номер два звучит как путь ... но фактор крутизны.

РЕДАКТИРОВАТЬ 2: Расчет очень сильно ЦП. В основном на больших матрицах много операций, таких как обратное и умножение. Я пытался найти более эффективные алгоритмы для этих операций, но до сих пор я обнаружил, что мне нужно 0 (n3) (в библиотеках, которые обычно доступны). Набор данных большой (для таких операций), но он создается на клиенте на основе входных параметров.


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

Таким образом, на самом деле возникает вопрос, так как не существует такой вещи, как номер 3, в: Каков наилучший способ создания кластерного Java-приложения?

Ответы [ 8 ]

5 голосов
/ 02 декабря 2008

Я очень рекомендую Java Parallel Processing Framework, тем более что ваши вычисления уже независимы. Я проделал большую работу с этим студентом, и он работает очень хорошо. Работа по внедрению уже сделана для вас, поэтому я думаю, что это хороший способ достижения цели в «номере 2».

http://www.jppf.org/

3 голосов
/ 02 декабря 2008

Номер 3 не сложно сделать. Это требует разработки двух отдельных приложений, клиента и супервизора. Клиент в значительной степени то, что у вас уже есть, приложение, которое запускает симуляцию. Однако его необходимо изменить, чтобы он подключался к супервизору с использованием TCP / IP или чего-либо другого и запрашивал набор параметров моделирования. Затем он запускает симуляцию и отправляет результаты обратно супервизору. Супервизор прослушивает запросы от клиентов и для каждого запроса, получает нераспределенное моделирование из базы данных и обновляет базу данных, чтобы указать, что элемент выделен, но не завершен. Когда моделирование завершено, руководитель обновляет базу данных с результатом. Если супервизор хранит данные в фактической базе данных (MySql и т. Д.), То к базе данных можно легко запросить текущее состояние моделирования. Это должно масштабироваться до такой степени, что время, необходимое для предоставления данных моделирования всем клиентам, равно времени, требуемому для выполнения моделирования.

2 голосов
/ 15 мая 2009

Вы должны проверить Hazelcast , самое простое решение кластеризации peer2peer (без централизованного сервера) для Java. Попробуйте Hazelcast Distributed ExecutorService для выполнения вашего кода в кластере.

С уважением,

-talip

2 голосов
/ 05 декабря 2008

Самый простой способ распределить вычисления в кластере Linux - это использовать MPI. Я бы предложил вам скачать и посмотреть на MPICH2. Это бесплатно. их домашняя страница здесь

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

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

Десять лет назад компания, в которой я работал, смотрела на подобное решение для виртуализации, и Sun, Digital и HP все поддерживали его в то время, но только с современными суперкомпьютерами с аппаратной горячей заменой и тому подобным. С тех пор я слышал, что Linux поддерживает тип виртуализации, который вы ищете для решения № 3, но я никогда не использовал его сам.

Java-примитивы и производительность

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

1 голос
/ 27 января 2009

Вы смотрели на Терракотовую ?

Для распределения работы вам понадобится Мастер / Рабочий каркас .

1 голос
/ 02 декабря 2008

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

Кластеры AFAIK обычно не рассматриваются как единое целое. Они обычно обрабатываются как отдельные узлы и программируются такими вещами, как MPI и SCALAPACK, чтобы распределить элементы матриц по нескольким узлам. Это не очень вам поможет, если ваш набор данных в любом случае помещается в памяти на одном узле.

1 голос
/ 02 декабря 2008

Вы уже предложили это, но дисквалифицировали: многоядерные. Вы могли бы пойти на многоядерный, если у вас было достаточно ядер. Одна из самых актуальных тем - вычисления на GPGPU. Особенно NVIDIA CUDA - очень примитивный подход, если у вас много независимых задач, которые должны выполнять одинаковые вычисления. GTX 280 обеспечивает 280 ядер, которые могут одновременно вычислять до 1120 - 15360 потоков. Пара из них может решить вашу проблему. Если это действительно реализуемо, зависит от вашего алгоритма (поток данных против потока управления), потому что все скалярные процессоры работают в SIMD-режиме.

Недостаток: это будет C / C ++, а не Java

...