Как создать кластер Linux для запуска физических симуляций в java?

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

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

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

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

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

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

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

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


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

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


person Mario Ortegón    schedule 02.12.2008    source источник
comment
Привязан ли процессор моделирования или ввод-вывод? Имеется ли большой набор входных данных?   -  person bajafresh4life    schedule 02.12.2008


Ответы (8)


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

http://www.jppf.org/

person BobbyShaftoe    schedule 02.12.2008
comment
Интересный фреймворк, который наверняка облегчит реализацию номер два. - person Mario Ortegón; 02.12.2008

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

person Skizz    schedule 02.12.2008
comment
Это по-прежнему номер два, однако это более или менее то, что я предполагал, за исключением использования файлов вместо баз данных. - person Mario Ortegón; 02.12.2008

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

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

person Die in Sente    schedule 05.12.2008
comment
Также рассмотрите OpenMPI (open-mpi.org) - person Todd Gamblin; 12.12.2008
comment
Я бы не сказал, что MPI - самый простой способ. JPPF, на мой взгляд, хорош. Хотя, я немного предвзят к этому. :) - person BobbyShaftoe; 23.01.2009

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

С уважением,

-талип

person Talip Ozturk    schedule 15.05.2009

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

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

person flolo    schedule 02.12.2008
comment
О какой сумме мы говорим за одного из них? - person Mario Ortegón; 02.12.2008
comment
Посмотрите на вашего любимого продавца оборудования. NVIDIA GTX 280, конечно, первоклассная и стоит 400 евро, но вам не нужна современная карта. CUDA поддерживает почти все последние карты, например. эффективную GTS 8800 вы получаете менее чем за 80 евро. Но очень важно для этого: Как выглядит ваш алгоритм? - person flolo; 02.12.2008

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

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

person Greg Rogers    schedule 02.12.2008
comment
Я использую JAMA, которая, насколько мне известно, не является оптимизированной библиотекой. Тогда кажется, что единственным вариантом является номер 2. Я надеялся, что кластер Linux будет рассматриваться как единое целое. - person Mario Ortegón; 02.12.2008

Вы смотрели Terracotta?

Для распространения работы вы можете использовать основной/рабочий фреймворк. .

person Taylor Gautier    schedule 27.01.2009

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

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

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

person Jonas Byström    schedule 15.06.2009