SGE部署

使用SGE,能使用户在单一的控制节点上投放多个任务,而不必考虑这些任务运行在哪个节点,能方便用户的使用。

修改主机名

对控制节点(master)的hostname进行修改:

修改配置文件 /etc/sysconfig/network 内容:

NETWORKING=yes
HOSTNAME=control

修改配置文件 /proc/sys/kernel/hostname 内容:

control

修改配置文件 /etc/hosts 内容:

127.0.0.1 localhost
192.168.30.1 control
192.168.30.2 node1

搭建NFS服务

NFS(Network File System)可以方便地将计算机上的指定文件夹共享给网络上的其它计算机。例如准备将 /share 目录共享

# mkdir /share
# chmod 1777 /share

通过修改配置文件 /etc/exports 来共享指定的文件夹。在该配置文件中添加以下一行内容:

/share	192.168.30.0/24(rw,sync,no_root_squash,no_subtree_check)

当前主机的IP是192.168.30.1,以上配置信息表示将当前主机的 /share 目录共享给同一个局域网内指定IP段的计算机,且其权限如下:

rw
  可读可写。
ro
  只读。
sync
  将数据同步写入到内存和磁盘中。
async
  将数据会先暂存于内存中,必要时才写入磁盘。
no_root_squash
  若客户端使用root用户操作共享文件夹的时候,具有最大权限。
root_squash(默认)
  若客户端使用root用户操作共享文件夹的时候,将其身份设定成匿名用户nfsnobody,降低权限。
no_all_squash(默认)
  访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组。
all_squash
  客户端的使用者用户统一被转换成匿名用户nfsnobody。
subtree_check (默认)
  若输出目录是一个子目录,则nfs服务器将检查其父目录的权限。
no_subtree_check
  即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率。

由于NFS服务的目的是能对多台服务端计算机共享nfs服务器的指定目录,它需要随机取用多个小于1024的端口来传输数据。而这些端口的开放是不固定的,为了让客户端能连接上正确的端口,则需要开启nfs服务的同时开启RPC(Remote Procedure Call)服务。
NFS服务的开启需要设置开放一些端口,可以在 /etc/sysconfig/nfs 中看到,修改该配置文件,将所有端口设置行前的注释取消掉

RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662
STATD_OUTGOING_PORT=2020
RDMA_PORT=20049

此外,NFS服务本身的端口是2049,RPC服务的端口是111,因此需要在防火墙中开放以上9个端口。修改防火墙配置文件/etc/sysconfig/iptables,在正确位置添加:

-A INPUT -p tcp -s 192.168.30.0/24 -m multiport --dport 111,2049,875,32803,32769,892,662,2020,20049 -j ACCEPT
-A INPUT -p udp -s 192.168.30.0/24 -m multiport --dport 111,2049,875,32803,32769,892,662,2020,20049 -j ACCEPT

最后,启动RPC和NFS服务:

# /etc/init.d/rpcbind restart
# /etc/init.d/nfs restart

# chkconfig rpcbind on
# chkconfig nfs on

在客户端192.168.30.2计算机上使用nfs服务器的共享文件夹

# mkdir /share
# mount -t nfs 192.168.30.1:/share /share/

以上通过NFS共享了 /share 目录,该目录在nfs服务器上的权限和服务端的权限是一致的,其权限是根据UID来识别的,因此客户端和服务端有共同的用户名和UID,且用户名和UID是完全匹配的,才有利于文件的共享。当机器数目很多的时候,为了能保证多台计算机上具有相同的用户名和密码等设置,则可以使用NIS服务来解决。

若在Master机器上修改了/etc/exports配置文件信息,则使用命令exportfs命令使修改生效

# exportfs -rv

NIS服务

在Master和Slaves机器上都安装NIS(Network Information Service)软件

# yum install ypserv ypbind

在Master和Slaves机器上修改/etc/sysconfig/network,尾部添加如下两行,使它们具有相同的NIS域名。

NISDOMAIN=chenlianfuNIS
YPSERV_ARGS="-p 1011"

以上第一行的值可以随意设定,但要求Master和Slaves机器上的该值一致
以上第二行表示NIS启动在1011端口上

在NIS配置文件 /etc/ypserv.conf 尾部添加一行来设定Slaves机器的权限

*                         : * : * : none

以上设置表示所有机器都都有最大权限。虽然限制不严格,但是可以通过iptables防火墙来进行安全控制。

修改 /etc/hosts,将Master和Slaves机器上的配置文件都设置正确

127.0.0.1 localhost
192.168.30.1 control
192.168.30.2 node1

修改 /etc/sysconfig/yppasswdd 配置文件,设置开放端口

YPPASSWDD_ARGS="--port 1012"

修改 /etc/sysconfig/iptables 防火墙配置,开放1011和1012端口

-A INPUT -p tcp -s 192.168.30.0/24 -m multiport --dport 111,2049,875,32803,32769,892,662,2020,20049,1011,1012 -j ACCEPT
-A INPUT -p udp -s 192.168.30.0/24 -m multiport --dport 111,2049,875,32803,32769,892,662,2020,20049,1011,1012 -j ACCEPT

启动服务

# /etc/init.d/iptables restart
# /etc/init.d/ypserv start
# /etc/init.d/yppasswdd start

ypserv用于启动NIS服务
yppasswdd用于启动NIS客户端密码修改服务

# chkconfig ypserv on
# chkconfig yppasswdd on

将Master机器上账号转换成数据库

# /usr/lib64/yp/ypinit -m

进入交互式界面,直接按control + d结束选择,再按y同意,程序则根据Master机器内的用户来创建数据库。

在Slaves机器上操作来启动NIS服务

# setup

进入交互式界面,选择Authentication configuration, 使用TAB切换并用空格选中Use NIS,使用TAB切换选择Next, 填写正确的NISDomain和NIS服务器的IP,使用TAB切换选择OK,选择退出后Slave机器会开启NIS服务。

在Slave机器上成功开启NIS服务后,则可以使用Master机器上的用户名远程登录Slave机器了。若该用户名在Slave机器中存在,则直接用该Slave机器中的用户直接登录;若该用户名在Slave机器中不存在,则会使用NIS服务,使用Master机器中的用户登录,但是该用户没家目录及其配置文件。

若需要更多用户用于NIS服务,则在Master机器中新建用户用,重新运行ypinit命令进行初始化即可。

使用yptest命令检验数据库信息

# yptest

在Test 9中会给出NIS Master机器上的所有账户信息。如果给出信息正常,表示验证成功。

使用ypwhich检验数据库文件

# ypwhich -x

可以看到相关文件名,这些文件名存放在 /var/yp/chenlianfuNIS/ 目录下。

使用ypcat读取数据库文件内容

# ypcat passwd.byname

使用yppasswd在Slave机器上修改Master机器上的用户名,其用法和passwd用法一致。

# yppasswd

SGE

先开启SGE需要的端口6444,修改配置文件/etc/sysconfig/iptables

-A INPUT -p tcp -s 192.168.30.0/24 -m multiport --dport 111,2049,875,32803,32769,892,662,2020,20049,1011,1012,6444 -j ACCEPT
-A INPUT -p udp -s 192.168.30.0/24 -m multiport --dport 111,2049,875,32803,32769,892,662,2020,20049,1011,1012,6444 -j ACCEPT

重启iptables服务

# /etc/init.d/iptables restart

在Master机器和Slaves机器上都使用yum安装gridengin软件

需要使用epel源安装gridengin
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
# yum install gridengine-*

在Master机器上部署SGE

# cd /usr/share/gridengine/
# ./install_qmaster
进入交互式界面,基本全部Enter即可,需要输入密码,我就选择123456。
在Master上,这一个命令同时部署了控制进程和执行进程。

在Slaves机器上部署SGE,需要先将Master机器上的/usr/share/gridengine/文件夹拷贝到Slaves机器上的相同路径上。

在Master机器上进行打包操作,注意软链接的拷贝。
# cd /usr/share/gridengine
# mkdir /share/gridengine
# cp -aL * /share/gridengine
# cd /share/
# rm gridengine/ -rf
# tar zcf gridengine.tar.gz gridengine/

在Slave机器上下载压缩包,然后解压缩覆盖其/usr/share/gridengine/文件夹
# cd /usr/share
# tar zxf /share/gridengine.tar.gz

在Slave机器上部署SGE,仅需要部署执行进程。
# cd gridengine
# ./install_execd
进入交互式界面,全部enter即可。

启动SGE

在部署SGE的时候已经启动了SGE服务
启动控制进程
# /etc/init.d/sgemaster restart
启动执行进程
# /etc/init.d/sge_execd restart

# chkconfig sgemaster on
# chkconfig sge_execd on

在控制节点上同时启动以上2个进程,而在其它计算节点上仅启动执行进程。

SGE的使用原理:

集群中的主机分2种:控制节点(mater)和计算节点(slave)。其中控制节点只在一台机器上部署,该控制节点也同时作为计算节点;其它主机全部是计算节点。

计算资源是由host的slots构成。可以选取集群中部分的hosts,定义为host用户组。

队列则表示集群中计算资源的容器。例如,名称叫all.q的队列对应着集群中全部的计算资源。若不想让某些用户使用集群全部的计算资源,则定义一个新的队列名,且该队列仅能使用集群部分的计算资源。

使用SGE集群进行计算的时候,为了进行并行化计算,需要设置并行化参数。

SGE的使用

qconf -ae hostname
    添加执行主机
qconf -de hostname
    删除执行主机
qconf -sel
    显示执行主机列表

qconf -ah hostname
    添加管理主机
qconf -dh hostname
    删除管理主机
qconf -sh
    显示管理主机列表

qconf -as hostname
    添加提交主机
qconf -ds hostname
    删除提交主机
qconf -ss
    显示提交主机列表

qconf -ahgrp groupname
    添加主机用户组
qconf -mhgrp groupname
    修改主机用户组
qconf -shgrp groupname
    显示主机用户组成员
qconf -shgrpl
    显示主机用户组列表

qconf -aq queuename
    添加集群队列
qconf -dq queuename
    删除集群队列
qconf -mq queuename
    修改集群队列配置
qconf -sq queuename
    显示集群队列配置
qconf -sql
    显示集群队列列表

qconf -ap PE_name
    添加并行化环境
qconf -mp PE_name
    修改并行化环境
qconf -dp PE_name
    删除并行化环境
qconf -sp PE_name
    显示并行化环境
qconf -spl
    显示并行化环境名称列表

qstat -f
    显示执行主机状态
qstat -u user
    查看用户的作业
qhost
    显示执行主机资源信息

通过使用命令qconf -mq queuename来对队列进行配置。修改hostlist来配置该队列可以使用执行主机;修改slots来配置各台执行主机可使用的线程数。从而对队列的计算资源进行设置。
部署完毕SGE后,会生成一个默认主机用户组@allhosts,它包含所有的执行节点;生成一个默认的all.q队列名,它包含所有节点所有计算资源。默认的队列包含的计算资源是最大的。

使用qsub提交作业

qsub简单示例:
$ qsub -V -cwd -o stdout.txt -e stderr.txt run.sh

其中run.sh中包含需要运行的程序,其内容示例为如下三行:
#!/bin/bash
#$ -S /bin/bash
perl -e 'print "abc\n";print STDERR "123\n";'

qsub的常用参数:
-V
    将当前shell中的环境变量输出到本次提交的任务中。
-cwd
    在当前工作目录下运行程序。默认设置下,程序的运行目录是当前用户在其计算节点的家目录。
-o
    将标准输出添加到指定文件尾部。默认输出文件名是$job_name.o$job_id。
-e
    将标准错误输出添加到指定文件尾部。默认输出文件名是$job_name.e$job_id。
-q
    指定投递的队列,若不指定,则会尝试寻找最小负荷且有权限的队列开始任务。
-S
    指定运行run.sh中命令行的软件,默认是tcsh。推荐使用bash,设置该参数的值为 /bin/bash 即可,或者在run.sh文件首部添加一行#$ -S /bin/bash。若不设置为bash,则会在标准输出中给出警告信息:Warning: no access to tty (Bad file descriptor)。
-hold_jid
    后接多个使用逗号分隔的job_id,表示只有在这些job运行完毕后,才开始运行此任务。
-N
    设置任务名称。默认的job name为qsub的输入文件名。
-p
    设置任务优先级。其参数值范围为 -1023 ~ 1024 ,该值越高,越优先运行。但是该参数设置为正数需要较高的权限,系统普通用户不能设置为正数。
-j y|n
    设置是否将标准输出和标准错误输出流合并到 -o 参数结果中。
-pe
    设置并行化环境。

任务提交后的管理

$ qstat -f
    查看当前用户在当前节点提交的所有任务,任务的状态有4中情况:qw,等待状态,刚提交任务的时候是该状态,一旦有计算资源了会马上运行;hqw,该任务依赖于其它正在运行的job,待前面的job执行完毕后再开始运行,qsub提交任务的时候使用-hold_jid参数则会是该状态;Eqw,投递任务出错;r,任务正在运行;s,被暂时挂起,往往是由于优先级更高的任务抢占了资源;dr,节点挂掉后,删除任务就会出现这个状态,只有节点重启后,任务才会消失。

$ qstat -j jobID
    按照任务id查看

$ qstat -u user
    按照用户查看

$ qdel -j jobID
    删除任务

使用openmpi来支持SGE的并行化环境,首先使用–with-sge参数来安装openmpi。

$ tar zxf openmpi-1.8.6.tar.gz
$ cd openmpi-1.8.6
$ ./configure --prefix=/opt/sysoft/openmpi-1.8.6 --with-sge
$ make -j 4
$ make install
$ cd .. && rm -rf openmpi-1.8.6/
$ echo 'export PKG_CONFIG_PATH=/opt/sysoft/openmpi-1.8.6/lib/pkgconfig/:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/opt/sysoft/openmpi-1.8.6/lib/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/opt/sysoft/openmpi-1.8.6/include:$C_INCLUDE_PATH
export PATH=/opt/sysoft/openmpi-1.8.6/bin/:$PATH' >> ~/.bashrc.openmpi
$ source ~/.bashrc.openmpi

然后,将openmpi的安装结果完全复制到所有节点的相同路径下。推荐使用NFS来搞定。

再添加并行化环境

# qconf -ap mpi

进入vi编辑界面,修改其中两项:
slots              200
allocation_rule    $fill_up
然后:wq保存退出

运行qsub则可以使用并行化环境(即可以使用-pe参数)了。