Запуск JADE приложения на кластере.

Опубликовано автор 0 comment

Зачем нужен JADE на кластере?

На основе чудесной платформы для создания мультиагентных систем JADE, я разрабатываю систему имитационного моделирования. Во время моей работы появилась задача запуска масштабной модели, состоящей из нескольких десятков тысяч агентов. Модель было решено запускать в суперкомпьютерном центре одного НИИ. В распоряжении мне достался гибридный кластер c пиковой производительностью 85 Тфлопс (на серверах linux и java). Задачи ставятся в очередь через PBS.

Основная проблема в том, что для запуска распределенного JADE, необходимо сперва запустить главный контейнер, а затем подключать к нему остальные. В свою очередь процесс запуска задач на кластере, слабо подается управлению. И эта комбинация факторов в своё время поставила меня в тупик. Для решения проблем использовал подход, применяемый для запуска MPI программ.

Bash скрипты для запуска JADE.

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

Чтобы запустить мою систему моделирования были написаны два скрипта:
Скрипт для постановки в очередь PBS (Регулярки написаны исходя из реалий кластера):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
# грузим переменные окружения
#PBS -V
# задаем имя очереди, в которую ставим задачу
#PBS -q [server_queue_name]
# описываем необходимые ресурсы
#PBS -l nodes=8:ppn=6,cput=00:55:00,walltime=01:00:00
# Задаем имя
#PBS -N IMPI_TASK
# объединение выходных данных
#PBS -j oe
 
# переходим в рабочую директорию
cd $PBS_O_WORKDIR
# задаем переменную
declare -a nodelist
# проверяем наличие файла со списком доступных узлов
if [ -e $PBS_NODEFILE ] ;
then
    # получаем список узлов
    nodelist=(`cat $PBS_NODEFILE | sort -u `)
else
    # все плохо - выходим
    echo "no PBS nodefile"
    exit 1;
fi
# сохраняем адрес первого доступного узла в файл с именем запущенной задачи
echo ${nodelist[0]/sl/10.0.4.} > $PBS_JOBID.ip
# запускаем при помощи mpi на каждом узле bash скрипт, запускающий JADE.
# аргументом передаем адрес узла.
mpirun -machinefile $PBS_NODEFILE -np `cat $PBS_NODEFILE | wc -l` ./start.sh $PBS_JOBID

И сам скрипт запуска JADE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# читаем адрес первого узла из доступных
export app_main_ip=`cat ./$1.ip`;
# получаем свой адрес
export app_my_ip=`/sbin/ifconfig eth0 | awk '/inet addr:/ { print $2 }' | awk '{ split($0,ip,":") } END { print ip[2] }'`;
# проверяем на первой машине запускается или нет
if [ $app_main_ip == $app_my_ip ];
then
    # Если на первом, то запускаем приложение как главный контейнер
    /ifs/apps/jdk/bin/java -Xms3g -jar MY_APP.jar -ng myModel.xml -p 1199 
else
    # Если на остальных, то запускаем приложение, подключаемое к главному контейнеру
    sleep 3s
    /ifs/apps/jdk/bin/java -Xms3g -jar MY_APP.jar -ng myModel.xml -p 1199  -h $app_main_ip;
fi

Послесловие

Решение показано топорное, лишенное изящества и гибкости. Но оно работает, и надеюсь идея окажется комуто полезна.

VKLiveJournalПоделиться!
Разделы: Велосипеды | Tags: , , ,