rstudio-server 更换 R 内核


目的

很简单,服务器 rstudio-server 用的 R version 版本太老,想更新为 4.0 以后的版本

基本原则

查了一些资料,无非就是在 rstudio-server 的配置文件中指定新的 R (绝对路径)。虽然听起来挺简单的,但是实际操作中遇到了各种各样的问题,再加上身体抱恙,搞了两天,整个人都不好了,好在最后实现了。

实现过程

rserver 服务的启停

首先,要搞清楚 rserver 原来运行在哪个节点之下,用其他节点,你可能连 rstudio-server 命令都没有。

# 停止 rserver 服务
sudo rstudio-server stop
# 启动 rserver 服务
sudo rstudio-server start
# 查看 rserver 状态
sudo rstudio-server status

这这一步,遇到的问题就是重启服务后,查看状态,显示8787端口被占用,然后查看8787端口的使用情况

lsof -i:8787

确确实实看到了两个 rserver 命令在使用8787端口,无论怎样,这两个进程都停不下来。我想直接 kill 掉,但是考虑到在 root 命令下,谨慎为好,不好随便 kill/rm 东西,我就又查验了这两个 rserver 的来源

ps -ef | grep rserver

发现这两个 rserver 是在 /usr/lib/rstudio-server/bin/rserver,这下我放心了,因为这确实来自于 rstudio-server,kill掉应该不会影响其他进程,然后我就 kill + 进程号 准备kill 掉这两个 rserver 进程。

不过万万没想到,运行之后,居然没 kill 掉,这下我傻了,然后根据错误的关键词 search 各种帖子,最后根据 sudo rstudio-server verify-installation error address already in use 这句找到了正确的解答:Troubleshoot RStudio Server Installation - verify-installation incorrectly reports server is running
其实就是给 kill 加个参数 -9.关于 kill -9 可以自行查阅资料,man kill 里面对于 (9) 是这样描述的

it may be necessary to use the KILL (9) signal, since this signal cannot be caught

帖子里关于这两个 rserver 进程的解释是,rserver 没有正确清除自身文件导致的。

到这里,rserver 的启停终于恢复了。

设置 server conf

⚠提醒:一下的操作和文件,均是在服务器 Rstudio-server 开放端口的节点下。我这里用的是 node2,不同的节点,设置是独立的。

rstudio admin guide 中关于配置 rstudio server 提到了几个文件

  • /etc/rstudio/profiles
  • /etc/rstudio/r-versions
  • /etc/rstudio/rserver.conf

目前我经过测试,只有 rserver.conf 设置才会function,详细设置见 rstudio 官方手册。

问题是,服务器上 root 下面只有原来的一个老版本的 R,所以测试的时候,我就用我自己的用户下conda 安装的 R。rsession-which-r=/home/me/bin/R,结果重启服务显示:
unable_to_connect_to_service

对此,我觉得出现这个问题的原因:

  1. 个人的用conda安装的R对于 Rstudio-server 不完整,需要一些配置;
  2. Rstudio-server版本低,不兼容R4.0。

所以我打算是root下用 binary rpm 安装R4.0,用这个做R core,看看Rserver能不能运行。

Rserver 中对 install multiple version of R 做了说明,说最后安装的R在 /opt/R/${R_VERSION}/bin/里面,应该是不影响已有的R的。
rstudio install R
multiple R version

所以就根据官方指南安装 R

root 下 R 的安装

本以为这一步很简单,结果不出意外,又出bug了,当我用下载的 binary R rpm 进行安装后,确实安装在了 /opt/R下面,不过查看 R 版本的时候出现问题了

$ /opt/R/4.0.3/bin/R --version
error while loading shared libraries: libgfortran.so.5: cannot open shared object file: No such file or directory

刚开始没当回事,就直接配置 rserver.conf 重启服务了,发现连不上服务,得,这个问题跳不过去,接着解决。

报错说缺少 libgfortran.so.5,眉头一皱,觉得不是真的缺少依赖这么简单,于是又 google 找解答,在这里发现了正解Missing libgfortran and libreadline dependencies for R 3.6.2 on CentOS 7,原来是用错了 rpm 版本,OMG!!!

真的是哪里都能出问题,于是检查了服务器版本

$ cat /etc/*release
CentOS Linux release 7.5.1804 (Core)

是 centos7 ,于是重新安装,这一次终于成功了,重启 rserver 服务,感人,R core 切换成功!!!

心得

历时两天得 R studio server 更换 R core 落下了帷幕,总之,先判断需求,必须要用,那就得硬着头皮搞,遇到问题多 google。

更进一步

其实,rstudio server 应该是可以根据 user 和 group 进行配置的,只不过还没弄明白,后面再花点心思搞一下。

收工~~~


2022.9.9

尝试按 user and group define R version,failed

继上次在 /etc/rstudio/profiles 中定义 user and group R version 失败后,在 Rstudio server configuration 中发现可能存在 multiple R versions 的总开关,

# Server Configuration File
r-versions-multiple=0

结果在验证时

$ sudo rstudio-server verify-installation
Error reading /etc/rstudio/rserver.conf: unrecognised option 'r-versions-multiple'

以为 r-version-multiple 是Rstudio-server 后来出现的 feature,所以按照官方更新步骤进行更新。

不过,仍然出现相同的问题。

烦死了 ..>_<..

同时指定多版本的 R version,目前还没有解决,就先这样吧,不折腾了

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.*.**’ not found 问题

之前在用 rstudio-server 进行安装 workflowr, Seurat 以及运行 ggplot2 的时候,总是遇到 /lib64/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found 的问题,之前也没意识到具体是什么问题,其实直接搜索的话,就可以找到很多解答的。

根本原因就是 root 下的 gcc+ 升级后动态库没有更新,运行以下命令检查动态库:

$ sudo strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

检查输出结果中有没有报错出现的文件(一般报错了就是没有)。

然后

find / -name 'libstdc++.so*'

找一个高版本的 libstdc++.so.6.*.**,在 stringr 检查一下动态库有没有,如果有的话,就用这个。

然后,上述报错为例,原来的版本位置在 /lib64/libstdc++.so.6,将新版本的 cp 到路径下,将原来的版本改名备份

$ mv libstdc++.so.6 libstdc++.so.6.bak

创建新的软连接,指向刚拷贝的库

ln -s libstdc++.so.6.0.21 libstdc++.so.6

参考文档:

提醒一下,在 Rstudio-server上安装 R 包不一定能成功,即使在你指定了安装路径的情况下。这个时候,可以尝试在 服务器终端打开R进行安装,将 R 包安装在 Rstudio-server 所用的 libPath 下面。

.Rprofile in workflowr project masks ~/.Rprofile

今天遇到了Rstudio-server不加载 ~/.Rprofile的问题,找了帖子发现,原来是 workflowr 创建的project中出现了 ./.Rprofile,并且不再读取 ~/.Rprofile 文件。似乎是在 Rstudio 启动时创建的。
Why does R ignore ~/.Rprofile

想知道 R 是如何启动的以及创建 .Rprofile 的,请参阅R for Enterprise: Understanding R’s Startup


R 包安装

在安装一些R包时,总会遇到奇奇怪怪的依赖性问题,根源还是 root 下环境和 用户自己的环境差别。所以,rstudio-verser 实现每个用户自定义自己的 r-core,可真是太香了/眼馋。

tidyverse installation

我在安装 tidyverse 的时候,在自己的 R 中正常安装和加载,但是在 rstudio-server 中就会无法加载,遇到 libiconv.so 缺失的问题。
最后用这个方法得到了解决,【R】tidyverse软件包,haven.so和readxl.so报错
不排除是自己的R是4.0.3,而rserver R 4.0.5,版本差别的可能。

BiocManager 版本低

不同版本的 BiocManager 对应能安装的 R 包的版本是不一样的,如 3.12 版本的 BiocManger 安装的 DiffBind 版本是 3.0.*, 而 3.15 BiocManager 可以安装 更高版本的 DiffBind


文章作者: 梁绍波
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梁绍波 !
评论
  目录