RStudioServer 安装及使用
RStudio是为R语言设计的一种跨平台集成开发环境。其特色包括可客制化的软件套件视觉化界面与同团队开发的一系列数据可视化与出版工具。RStudio有免费的自由软件版本及收费的专业版本,并分为在本地电脑上执行的桌面版和与在服务器上执行而可由浏览器连接后使用的服务器版。
该教程将展示如何在SonmiHPC上安装部署服务器版本,并介绍如何在多节点集群中使用脚本提交rserver实例。
安装 R 环境
可以通过以下的三种方式在集群上安装R环境。
- 通过YUM/DNF安装
- 通过源码编译安装
- 通过conda安装
该教程将使用第一种方式,root用户执行如下的命令进行安装R环境。
# 只在登陆节点中安装的话执行下面指令
dnf --enablerepo=crb install -y flexiblas-devel libtirpc-devel
dnf install -y epel-release
dnf install -y R
# 如果需要在多个计算节点中并行进行安装可以结合pdsh工具使用
pdsh -w compute-0-[0-1] dnf --enablerepo=crb install -y flexiblas-devel libtirpc-devel
pdsh -w compute-0-[0-1] dnf install -y epel-release
pdsh -w compute-0-[0-1] dnf install -y R
# 只在登陆节点中安装的话执行下面指令
dnf --enablerepo=crb install -y flexiblas-devel libtirpc-devel
dnf install -y epel-release
dnf install -y R
# 如果需要在多个计算节点中并行进行安装可以结合pdsh工具使用
pdsh -w compute-0-[0-1] dnf --enablerepo=crb install -y flexiblas-devel libtirpc-devel
pdsh -w compute-0-[0-1] dnf install -y epel-release
pdsh -w compute-0-[0-1] dnf install -y R
下载并安装 RStudio Server
安装R环境后,进行下一步的安装。执行以下的命令,下载RStudio Server的RPM包,并安装。
wget https://download2.rstudio.org/server/rhel9/x86_64/rstudio-server-rhel-2024.04.2-764-x86_64.rpm
sudo yum install -y rstudio-server-rhel-2024.04.2-764-x86_64.rpm
wget https://download2.rstudio.org/server/rhel9/x86_64/rstudio-server-rhel-2024.04.2-764-x86_64.rpm
sudo yum install -y rstudio-server-rhel-2024.04.2-764-x86_64.rpm
使用 RStudio Server
RStudio Server的默认端口为8787,集群用户通过浏览器访问登陆http://[登陆IP]:8787即可使用。
RStudio Server运行状态可以通过下面的命令查看:
systemctl status rstudio-server.service
systemctl status rstudio-server.service
启动/重启/停止 RStudio Server服务命令如下:
systemctl start rstudio-server.service
systemctl restart rstudio-server.service
systemctl stop rstudio-server.service
systemctl start rstudio-server.service
systemctl restart rstudio-server.service
systemctl stop rstudio-server.service
在集群上面使用 RStudio Server
如果需要在集群上面使用 RStudio Server,可以采用普通用户提交 SLURM 脚本的方式来启动 rserver 实例。
首先需要确认集群上面所有计算节点都已经按照上面的步骤安装好 RStudio Server 服务。
在用户家目录下创建一个 rserver 目录:
cd ~
mkdir rserver && cd rserver
cd ~
mkdir rserver && cd rserver
在新建的目录中创建如下的提交脚本文件:
vim submit.sh
vim submit.sh
脚本内容如下:
#!/bin/bash
#SBATCH --job-name=rserver
#SBATCH --partition=sonmi
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --nodelist=compute-0-0
#SBATCH -n 4
#SBATCH --time=02:00:00
# 上面的slurm参数指定该rserver实例将运行的节点,可以使用的CPU核数及最大运行时长,可以按需求自行修改。
ulimit -s unlimited
ulimit -l unlimited
cd $SLURM_SUBMIT_DIR
# 端口设置,请自行修改为未被占用的高位端口
RSERVER_PORT=18787
USER=$(whoami)
# 创建database配置文件
mkdir -p ${SLURM_SUBMIT_DIR}/database
cat > database.conf <<EOF
directory=${SLURM_SUBMIT_DIR}/database
EOF
# 创建rsession.sh
cat > rsession.sh <<EOF
#!/bin/bash
USER=`whoami`
source /etc/profile
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
source \$HOME/.bashrc
/usr/lib/rstudio-server/bin/rsession \$@
EOF
chmod u+x rsession.sh
# 设置用户自定义secure cookie key路径
COOKIE_KEY_PATH=${SLURM_SUBMIT_DIR}/secure-cookie-key
rm -f $COOKIE_KEY_PATH
mkdir -p $(dirname $COOKIE_KEY_PATH)
python -c 'import uuid; print(uuid.uuid4())' > $COOKIE_KEY_PATH
chmod 600 $COOKIE_KEY_PATH
# 设置--auth-revocation-list-dir参数
REVOCATION_LIST_DIR=${SLURM_SUBMIT_DIR}/revocation-list-dir
mkdir -p $REVOCATION_LIST_DIR
# 运行程序
/usr/lib/rstudio-server/bin/rserver --server-daemonize=0 \
--www-port=$RSERVER_PORT \
--secure-cookie-key-file=$COOKIE_KEY_PATH \
--server-pid-file="$SLURM_SUBMIT_DIR/rstudio-server.pid" \
--server-data-dir="$SLURM_SUBMIT_DIR/rstudio-server" \
--rsession-which-r=$(which R) \
--rsession-ld-library-path=/usr/lib \
--rsession-path="$SLURM_SUBMIT_DIR/rsession.sh" \
--server-user $USER \
--database-config-file "$SLURM_SUBMIT_DIR/database.conf" \
--auth-none 0 \
--auth-revocation-list-dir=$REVOCATION_LIST_DIR
#!/bin/bash
#SBATCH --job-name=rserver
#SBATCH --partition=sonmi
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --nodelist=compute-0-0
#SBATCH -n 4
#SBATCH --time=02:00:00
# 上面的slurm参数指定该rserver实例将运行的节点,可以使用的CPU核数及最大运行时长,可以按需求自行修改。
ulimit -s unlimited
ulimit -l unlimited
cd $SLURM_SUBMIT_DIR
# 端口设置,请自行修改为未被占用的高位端口
RSERVER_PORT=18787
USER=$(whoami)
# 创建database配置文件
mkdir -p ${SLURM_SUBMIT_DIR}/database
cat > database.conf <<EOF
directory=${SLURM_SUBMIT_DIR}/database
EOF
# 创建rsession.sh
cat > rsession.sh <<EOF
#!/bin/bash
USER=`whoami`
source /etc/profile
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
source \$HOME/.bashrc
/usr/lib/rstudio-server/bin/rsession \$@
EOF
chmod u+x rsession.sh
# 设置用户自定义secure cookie key路径
COOKIE_KEY_PATH=${SLURM_SUBMIT_DIR}/secure-cookie-key
rm -f $COOKIE_KEY_PATH
mkdir -p $(dirname $COOKIE_KEY_PATH)
python -c 'import uuid; print(uuid.uuid4())' > $COOKIE_KEY_PATH
chmod 600 $COOKIE_KEY_PATH
# 设置--auth-revocation-list-dir参数
REVOCATION_LIST_DIR=${SLURM_SUBMIT_DIR}/revocation-list-dir
mkdir -p $REVOCATION_LIST_DIR
# 运行程序
/usr/lib/rstudio-server/bin/rserver --server-daemonize=0 \
--www-port=$RSERVER_PORT \
--secure-cookie-key-file=$COOKIE_KEY_PATH \
--server-pid-file="$SLURM_SUBMIT_DIR/rstudio-server.pid" \
--server-data-dir="$SLURM_SUBMIT_DIR/rstudio-server" \
--rsession-which-r=$(which R) \
--rsession-ld-library-path=/usr/lib \
--rsession-path="$SLURM_SUBMIT_DIR/rsession.sh" \
--server-user $USER \
--database-config-file "$SLURM_SUBMIT_DIR/database.conf" \
--auth-none 0 \
--auth-revocation-list-dir=$REVOCATION_LIST_DIR
创建好提交脚本后,执行下面的命令进行提交任务,就可以在对应的计算节点开启reserver实例,该实例所能使用的CPU、内存等系统资源由脚本参数中指定。
sbatch submit.sh
sbatch submit.sh
由于提交的rserver实例运行在计算节点上,只能通过计算节点的 compute-0-0 的内网IP访问到该服务,因此需要在登陆节点设置一下创建隧道。将登陆节点的端口(用户自行指定,请使用未被占用的高位端口)转发到计算节点运行rserver的端口18787(该端口为用户自定义端口,以用户设置的实际端口为准)。有如下的两种方式。
方法1:使用SSH进行转发
在登陆节点执行如下的命令将登陆节点的18787端口转发到计算节点compute-0-0的18787端口。
ssh -R <登陆节点端口>:<运行rserver实例的计算节点>:<计算节点运行rserver的端口> <当前用户>@<登陆节点对外的IP>
ssh -R <登陆节点端口>:<运行rserver实例的计算节点>:<计算节点运行rserver的端口> <当前用户>@<登陆节点对外的IP>
在上面的实例中:
- 登陆节点要转发的端口:18787
- 运行rserver的计算节点为:compute-0-0
- 计算节点运行rserver的端口为:18787
- 当前用户为:sonmi
- 登陆节点对外的IP为:192.168.50.171
因此执行ssh端口转发的命令为:
ssh -R 18787:compute-0-0:18787 [email protected]
ssh -R 18787:compute-0-0:18787 [email protected]
执行该命令之后会跳转到新的终端,关闭终端页面该命令失效,因此可以搭配 sceen 命令使用。
方法2:使用 socat 进行转发
该方法需要管理员在集群登陆节点上安装好 socat 程序:
dnf install -y socat
dnf install -y socat
在该示例中用户执行如下的命令进行转发即可:
# socat TCP-LISTEN:<登陆节点要监听的端口>,fork TCP:<计算节点主机名>:<计算节点待转发端口>
socat TCP-LISTEN:18787,fork TCP:compute-0-0:18787
# socat TCP-LISTEN:<登陆节点要监听的端口>,fork TCP:<计算节点主机名>:<计算节点待转发端口>
socat TCP-LISTEN:18787,fork TCP:compute-0-0:18787
可以搭配 screen 或者 nohup 将命令放到后台运行。
之后只有用户可以通过 http://192.168.50.171:18787 登陆访问到创建的 RStudio Server 实例。
SSH端口转发注意事项
使用SSH方式来实现端口转发时,请管理员确保在 /etc/ssh/sshd_config 配置文件中开启了下面的两个选项:
AllowTcpForwarding yes
GatewayPorts yes
AllowTcpForwarding yes
GatewayPorts yes
更改完该配置后,需要重新启动sshd服务:
systemctl restart sshd
systemctl restart sshd