그리드 엔진
#
Find similar titles
- (rev. 4)
- Sinceritary Jihyun
Structured data
- Category
- Management
Table of Contents
오픈 그리드 엔진 스케줄러 소개 및 설치 #
컴퓨터가 나날이 발전하고 있지만 복잡한 데이터 계산이나 분석을 하기 위해서는 아직까지 감당하기가 어렵다. 비록 PC가 아니라 서버라 할지라도 성능이 좋기는 하지만 대량의 분석을 진행하기에는 어려움이 있다. 물론 슈퍼 컴퓨팅이라는 가능성이 있기는 하지만 높은 가격으로 인해서 적용하기가 쉽지 않다.
그래서 해결책을 강구한 것이 클러스터를 구성하는 것이다. 클러스터는 서버를 여러 대 묶어서 마치 하나의 장비처럼 구성하는 것이다. 사람처럼 단독으로 하는 것보다 팀이나 조직을 만들어 일을 진행하는 것이 유용한 것처럼 서버도 여러 대의 장비를 묶어서 그 업무에 맞게 일을 처리하는 개념이다. 그러나 이 작업은 만만한 것이 아니다. 서버들에게 작업 지시를 하고 결과를 받고, 그 중 장애가 있는 서버가 있는지 없는지 모든 부분을 확인해야만 한다.
또한, 서버들끼리 어떻게 통신을 하고 정보를 교환할지 고민스러운 부분에 당면하게 된다. 그러나 다행히도 이러한 문제를 해결한 솔루션이 이미 무료로 나와 있다. 대표적인 것이 Sun Grid Engine, Torque, Condor 등이 있다. 참고로 Sun Grid Engine이 가장 많이 쓰였었는데 Sun사가 오라클에 인수되면서 Oracle Grid Engine으로 변경되었고 약자도 SGE에서 OGE로 변경되었다. 오라클에서 인수된 이후 기존의 오픈 소스를 이용하여 만든 것이 OGS 즉 open grid scheduler이다.
OGE는 상업용 버전이기 때문에 정식 구매하지 않으면 사용이 어려우므로 무료로 배포하고 있는 OGS를 이용할 수 있다.
먼저 OGS를 설치하려면 서버의 종류에 관계없이 서버만 구비되었다면 문제가 없다. 유닉스, 리눅스, 맥, 심지어 윈도우도 지원을 한다. 다만 직접 소스를 빌드해서 사용해야 한다.
우선 http://gridscheduler.sourceforge.net/ 를 방문하여 프로그램을 다운받으면 된다. 프로그램은 소스 버전과 바이너리 두 가지를 제공하는데 64비트용은 바이너리를 다운받아 설치할 수 있다. XWindow를 활용하여 GUI 버전으로 설치할 수도 있다.
먼저 설치를 하기 위해서는 서버의 구성을 결정해야 한다.
- 어떤 서버를 마스터(메인)로 할 것인가?
- 서버 간의 통신을 어떻게 할 것인가?
- 서버들 간의 데이터 공유는 어떻게 할 것인가?
- 작업 노드를 어떻게 구성할 것인가?
이러한 구성이 결정되었다면 설치에 들어가면 된다.
먼저 설치할 디렉토리를 설정한다. 대개 /opt/sge 라는 디렉토리를 활용한다. 디렉토리 생성 후 아래와 같이 환경 설정을 해준다.
export SGE_ROOT=”/opt/sge”;
export SGE_QMASTER_PORT=6444;
export SGE_EXECD_PORT=6445;
export SGE_CELL=”default”;
바이너리 파일을 이용한 설치는 생략하고 소스를 가지고 직접 빌드하여 설치를 한다.
% tar zvxf SGE6.2u5p2.tar.gz
% cd SGE6.2u5p2/source
% ./aimk -no-java -no-jni -no-secure -spool-classic -no-dump -only-depend
% ./scripts/zerodepend
% ./aimk -no-java -no-jni -no-secure -spool-classic -no-dump depend
% ./aimk -no-java -no-jni -no-secure -spool-classic -no-dump
위의 과정들을 실행하면 약간의 시간이 소유되며 컴파일을 시작한다. 과정에 따라서 필요한 라이브러리가 없다고 불평을 할 수도 있다. 과정이 마무리되면 아래의 소스로 프로그램을 인스톨한다. 그러면 위해서 지정한 SGE_ROOT에 설치된다.
% ./scripts/distinst -all -local -noexit
의 과정으로 진행하면 된다. 서버에 따라서 필요한 라이브러리가 필요할 수 도 있다. CentOs의 경우 다음과 같은 패키지가 필요하다.
$ sudo yum -y install "openmotif openmotif-devel openmotif22 openssl-devel openssl-static make gcc \
autoconf pam-devel libXpm libXpm-devel ncurses ncurses-devel unzip texinfo"
다행히 우분투의 경우에는 패키지가 있어서 쉽게 그리드 설치를 진행할 수 있다.
SGE_ROOT 로 이동을 하면 관련 프로그램이 설치된 것을 볼 수 있다. 여기서 끝이 아니다. 이제 구성을 시작해야 한다. 위에서 결정한 대로 마스터 서버, 실행 서버를 지정하고 그에 맞게 프로그램을 인스톨해야 한다.
마스터 노드는 작업지시 및 스케줄링, 잡 실행 등 모든 부분을 수행할 수 있는 곳이다. 따라서 안정적으로 운영되어야 하며 반드시 대형 서버에 설치할 필요는 없다. 분석이나 계산에 맞게 설정하면 된다.
설치에 앞서 환경 설정을 해줘야 한다. vi 등을 이용하여 다음 파일을 수정한다.
$ vi /etc/service 명령어 수행 후 다음 내용을 추가한다.
sge_master 6444/tcp
sge_execd 6445/tcp
서버에 따라서 관련 내용이 이미 구성되어 있을 수도 있다. 또한 방화벽에 의해 해당 포트가 열려 있는지 확인해야 한다.해당 포트가 열려 있는지는 telnㄷt 명령어를 통해 간단히 확인해 볼 수 있다.
다음으로 호스트 설정을 해줘야 한다. 이 과정없이 진행하면 필시 에러 화면을 보여주며 설치가 진행되지 않는다. $ vi /etc/hosts 명령어 실행 후 다음을 설정한다.
127.0.0.1 localhost.localdomain localhost 아래 부분에
해당 IP, 도메인명, 호스트명을 설정한다.
192.168.0.1 master maseter.insilicogen.com
192.168.0.2 node1 node1.insilicogen.com
192.168.0.3 node2 node2.insilicogen.com
과 같이 실행 노드에 해당하는 아이피 주소 및 호스트명을 설정하면 된다. 이 부분을 간과하고 지나면 반드시 경고 화면 및 에러 화면을 마주하게 된다.
% ./install_qmaster 로 실행하면 된다. 그러면 대화형으로 설정 할 내용을 입력해주면 된다. 대부분 엔터를 치며 진행하면 무리없이 설치를 할 수 있다.
Choosing enter a valid user name >> sge
Installing Grid engine as admin user >> sge
Hit to continue >> 의 화면을 볼 수 있는데 대부분 그대로 진행하면 된다. 설정 완료 후 administrator host를 추가한다.
$ qconf -ah master
추가로 submit host를 지정한다.
$ qconf -as master
$ ./install_execd 명령을 통해 실행 노드 즉 잡 노드를 설치하면 된다. 마스터 노드 설정처럼 각 단계마다 엔터를 치면 역시 무리 없이 설치할 수 있다.
해당 노드에서 잡을 지정하기 위해서는 반드시 submit host로 등록해야 한다.
클러서터에서 실행 노드는 각 서버별로 각각 실행 노드를 인스톨해야 한다. 그러면 각각 해당 하는 OS에 따라 SGE_ROOT/bin/linux_x86 혹은 SGE_ROOT/bin/linux_x64 등과 같이 자동으로 해당 디렉토리가 생성이 된다.
설치 완료 후 테스트를 위해 SGE_ROOT/examples/jobs/ 로 이동 후
qsub simple.sh
qsub simple.sh
를 실행 후 qstat 명령어를 통해 잡 진행 상황을 확인하면 된다.
오픈 그리드 엔진 스케줄러 설정 #
대용량 데이터를 처리함에 있어, 특히 생물정보 데이터 처리에 있어서 분산 처리를 하기 위한 클러스터인 Open Grid Engine을 설치하고 기본적인 세팅을 완료 후 각 툴의 사용법에 대해 알아보고자 한다.
그리드 엔진을 사용하기 위해서는 먼저 그리드의 기동부터 알아본다 그리드 엔진을 처음 설치하고 나면
/etc/init.d/sgemaster.p6444
/etc/init.d/sgeexecd.p6444
의 두 개 파일이 생성이 된다. 물론 서버 구동시 자동으로 시작하게 할 수 있지만 보통은 다음처럼 순서를 지켜야 한다.
먼저 Job을 관리하는 MASTER의 기동을 먼저 하고 추후 관련된 실행노드들을 구동시킨다 즉 위의 순서대로 구동하면 된다. 그리드 엔진을 종료할 때에에는 위의 역순으로 진행한다. 각 실행노드들의 sgeexecd를 각각 종료 후에 최종으로 sgemaster를 종료하면 된다.
기본적인 설정은 두 가지 방법으로 할 수 있다. 1. command line의 qconf 를 이용하는 방법 2. xwindow를 활용한 qmon 프로세스를 이용하는 방법
크게 두 가지로 나누어 볼 수 있다.
먼저 qconf를 이용하는 법은 다음과 같다.
$ cd $SGE_ROOT/bin/OS_type/
$ ./qconf
명령을 실행하면 다음과 같이 나타난다.
OGS/GE 2011.11
usage: qconf [options]
[-aattr obj_nm attr_nm val obj_id_list] add to a list attribute of an object
[-Aattr obj_nm fname obj_id_list] add to a list attribute of an object
[-acal calendar_name] add a new calendar
[-Acal fname] add a new calendar from file
[-ackpt ckpt_name] add a ckpt interface definition
이하 생략
위의 옵션들을 들여다 보면 해야 할 일을 확인할 수 있다. Admin host 및 Submit host를 등록하거나 삭제하거나 하는 기본적인 설정뿐 아니라 상세 설정을 진행할 수 있다.
$ ./qhost 명령을 내리면 다음과 같은 결과를 볼 수 있다.
$ ./qhost
HOSTNAME ARCH NCPU LOAD MEMTOT MEMUSE SWAPTO SWAPUS
-------------------------------------------------------------------------------
global - - - - - - -
ngs1 linux-x64 8 0.01 23.5G 1.6G 5.6G 20.5M
위의 예제에서는 동일 서버에 MASTER와 실행노드를 동시에 설치했기에 하나의 목록만 보이지만 다수의 실행노드를 설정하였을 경우엔 좀 더 많은 목록을 볼 수 있다. 위의 경우에는 CPU가 8개(NCPU), 메모리가 23.5G(MEMTOT) 인 것을 알 수 있다.
qconf -sql
의 명령으로 모든 큐의 리스트를 확인해 볼 수 있다. 예제에서는 all.q가 생성되어 있으며 사용자가 추가적으로 생성한다면 더 많은 큐목록을 볼 수 있다.
$ qconf -sq all.q
"all.q is not a parallel environment" 와 같이 병렬 처리가 되어 있지 않다. 보통의 경우 하나의 노드에 하나의 슬롯이 할당되서 각 분산 처리를 하지만 예를 들어 Blast 처럼 병렬처리 즉 하나의 노드에 여러 개의 CPU를 할당해야 한다면 처리하지 못한다. 이럴 경우에는 병렬 분산 작업이다 라고 명시를 해줘야 한다. 다음의 명령어로 병렬처리 환경에 대한 정보를 보여준다.
$ qconf -spl
위의 명령어를 확인하면 "make"라고 병렬처리 할 수 있는 옵션이 보여지게 된다. 좀 더 정보를 알아보자면 아래와 같이 명령어를 입력한다.
$ qconf -sp make
pe_name make
slots 999
user_lists NONE
xuser_lists NONE
start_proc_args NONE
stop_proc_args NONE
allocation_rule $round_robin
control_slaves TRUE
job_is_first_task FALSE
urgency_slots min
accounting_summary TRUE
여기에서 보면 각각 하나의 노드에 하나의 슬롯을 할당한다. 이럴 경우에는 -t 옵션을 사용하게 되면 여러개의 노드에서 나누어 처리 즉 모든 노드가 각각 처리를 하게 된다. 즉 하나의 노드에 멀티 슬롯을 지정하려면 -mp 옵션으로 환경을 변경해주어야 한다. 아래의 명령어로 처리할 수 있다. 다만 이 경우엔 grid engine owner로 처리해야 한다.
$ qconf -mp make
그리고 다음과 같이 병렬 처리를 해야 하는 명령어를 날려주면 하나의 노드에 4개의 슬롯을 이용하여 처리하라고 알려주게 된다. 그러면 BLAST 프로그램은 하나의 서버에서만 멀티로 병렬 처리하게 된다.
qsub -pe make 4 mutithread.sh
지난 글에서 간단하게 알아보았듯이 qsub 명령어는 잡을 등록시키는 역활을 한다. MASTER 노드에 이런이런 작업을 하세요 라고 알려주게 된다.
$ qsub
$ cd $SGE_ROOT/examples/jobs
$ qsub simple.sh
qsub 명령어 후에 등록된 잡이 있는지, 잡이 실행되고 있는지 알아보기 위해서 qstat 명령어를 이용하여 확인할 수 있다. qstat 명령어를 입력하면 아래와 같이 정보를 확인할 수 있다.
$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
-----------------------------------------------------------------------------------------------------------------
541 0.55500 simple.sh kylee r 05/13/2014 09:43:53 all.q@ngs1 1
542 0.00000 simple.sh kylee qw 05/13/2014 09:43:53 1 1
잡의 이름, 사용자, 상태, 작업 시간, 큐의 정보 등을 확인할 수 있다. state의 경우에는 r, qw 등이 있는데 r은 현재 작업중인 잡, qw 는 대기 목록에 있는 잡이다. 물론 상세 정보를 확인하려면
$ qstat -j job_id
과 같이 명령어를 입력하면 된다. 에러가 발생한 경우 에러 메시지도 확인할 수 있다. E의 경우에는 에러 발생한 경우이다. 경우에 따라서는 이러한 잡을 수동으로 지워야 할 경우가 있는데 qdel 명령어로 잡을 지울 수 있다.