文章目录
java与R语言的交互 —— Rserve多线程
本人最近负责的一个项目:应用层采用了Java,数据分析部分采用了R语言,并且Java与R语言的交互采用了Rserve。
在项目开发的过程中,发现了一个严重的问题,是R语言不支持多线程,就导致Java使用Rserve与R交互时,必须等上一个R计算执行完毕才能进行下一个计算。这对于生产项目是完全不可行的,但是老板催的急,没有办法再换数据分析语言,只有硬着头皮想解决方案了。
在分析了整个项目之后,发现整个项目中比较耗时的计算只有一个,所有想到了再起一个服务,把这个耗时的计算独立出去。这就是下面要说的采用多连接的方式来实现伪多线程,毕竟R语言的弊端不是我们小白说解决就给解决的。
(有不对之处,望各位大佬斧正)
采用多连接的方式来实现Rserve的伪多线程(一个端口为一个连接)
一、Rserver 环境搭建
1.Rserve的安装
这里使用的环境为:Windows 10 64bit和R-3.3.3。
Step1:首先,在系统环境变量中添加R语言的2个路径:
R_HOME
F:\develop_tools\R\R-3.3.3
%R_HOME%\bin\i386
%R_HOME%\bin\x64
Step2:启动Windows的cmd。输入:“R”后,R语言若可以启动则说明环境变量设置正确,如下图所示。否则检查Step1中的环境变量设置是否正确。
Step3:安装并加载Rserve,即在上面的R会话中输入:
> install.packages("Rserve")
> library(Rserve)
Step4:启动R服务端。Rserve服务端启动有2种主要方式
1、在R会话环境中启动Rserve:在R环境中,若加载了Rserve程序包,则直接使用Rserve()函数即可。
> library(Rserve)
> Rserve()
Starting Rserve...
"F:\develop_tools\R\R-33~1.3\library\Rserve\libs\i386\Rserve.exe"
2、在CMD命令行中,首先我们要R安装目录下/library/Rserve/libs中,将Rserve.exe和Rserve.dll复制到R安装目录的/bin对应的文件夹中。在本文64位系统下bin文件夹下面分别存在i386和x64二套程序,对应了~/library/Rserve/libs中2个文件夹。
随后,在命令行中输入
R CMD Rserve --help
结果如图,说明可以启动Rserve了
2. Rserve的配置
在Rserve初始启动时,我们还不能够设置远程客户端,这时需要配置一下Rserve。
先查看Rserve服务端默认配置信息。
启动cmd,输入:
R CMD Rserve --RS-settings
上图中可见,其配置文件在命令行当前路径下,名为
R
s
e
r
v
e
.
c
f
g
\color{red}Rserve.cfg
Rserve.cfg。
远程访问,认证,命令控制均为开启。
现需要修改默认配置。新建文件Rserve.cfg,输入如下:
workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source start.R
plaintext enable
其中,上述信息还包含了一个start.R脚本。我们新建一个start.R脚本里面输入:
cat("This is my Rserve!!")
print(paste("Server start at",Sys.time()))
将脚本文件和配置复制到命令行目录下,本文为F:\develop_tools\R\R-3.3.3\bin\x64。脚本文件用于提示我们启动服务端成功!
重新查看默认配置信息,R CMD Rserve --RS-settings
结果如上图所示,说明我们已经开启了远程连接,但是并没设置认证,此时远程客户端可以无认证访问服务端。
3. Rserve的启动
完成上述安装配置后,在命令中输入R CMD Rserve,即可启动Rserve服务端。可见,我们成功启动了Rserve
这个时候,我们可以在Windows下查看进程,里面会包含有一个Rserve进程
二.配置Rserve的多线程
采用主从服务器的方式,来实现R语言的多线程
R语言作为计算型语言,本人认为它没有像如今的python一样流行的主要原因是:R语言本身不支持多线程。
为了克服这一点,我采用主从服务器多连接的方式来达到伪多线程的效果。
步骤是:
启动两个Rserve服务,将这两个服务部署在不同的端口上面,以达到可以给客户端两个连接的效果。说白了就是重复上述2.Rserve配置,修改里面的端口号即可,然后分别启动6311和6312的Rserve。
下图是本地启动两个Rserve服务的效果图:
1.首先查看对应的端口号:
netstat -ano
2.在任务管理器中查看这两个进程