RJDBC没有加载为Rapache中的库

时间:2012-06-15 18:21:45

标签: apache r rjava rapache

所以我需要在我的Rapache程序中访问MSSQL服务器,当我尝试在我的Rapache代码中加载RJDBC作为库时,我收到服务器错误。在日志中它看起来像这样:

    referer: http://10.21.8.145/
    Error : .onLoad failed in loadNamespace() for 'rJava', details:
      call: dyn.load(file, DLLpath = DLLpath, ...)
      error: unable to load shared object '/usr/lib/R/site-library/rJava/libs/rJava.so':
      libjvm.so: cannot open shared object file: No such file or directory
    Error: package/namespace load failed for 'rJava'
 Traceback:
    5: stop(gettextf("package/namespace load failed for %s", sQuote(package)), 
   call. = FALSE, domain = NA)
    4: library(rJava)
    3: eval.with.vis(expr, envir, enclos)
    2: eval.with.vis(ei, envir)
    1: source("/var/www/brew/optimization.R")
    [Fri Jun 15 13:57:29 2012] [error] [client 10.21.2.79] File does not exist:  /var/www/favicon.ico

我也检查过,rJava.so存在于该目录中。是libjvm.so吗?

事情就是当我在R中运行这个库(RJDBC)它说:

    Loading required package: DBI
    Loading required package: rJava
    Warning message:
    replacing previous import 'show' when loading 'rJava'

然后我的所有RJDBC代码都可以正常工作。这是一个Java配置的问题,还是rApache由于警告消息而无法运行库的问题?

2 个答案:

答案 0 :(得分:1)

是的,它与libjvm.so有关;)rjava.so无法找到它!

各种Linux发行版(我认为你正在运行linux?)将在受限制的环境中启动apache,从而限制进程可以找到共享库的位置。我建议查看shell脚本以查看是否发生了这种情况。

我还会研究动态链接器运行时绑定配置,例如/etc/ld.so.*文件以及ldconfig命令。

尝试从您的个人R会话中运行您的代码。如果它没有在那里运行,那么你需要先修复你的java / rJava安装。如果确实在那里运行,那么请探索我上面讨论的主题。

哦,我记得:rJava可能源于一些java特定的环境变量,位于rJava包安装中。看看你的本地会话是否发生了这种情况。如果是这种情况,那么当运行apache / rApache时,您很可能需要这些设置。

正如我上面提到的,如果您的发行版限制了apache的环境,那么您将不得不将这些Java环境变量填充到该限制过程中。

干杯!

杰夫

答案 1 :(得分:0)

我遇到了同样的问题,并确定原因是rApache没有设置LD_LIBRARY_PATH环境变量。这需要在为rJava(或依赖于它的任何包)创建R环境之前设置,以便正确初始化(即能够找到libjvm.so的路径。)

您可以使用简单的测试脚本进行检查:

setContentType('text/text')
cat(Sys.getenv()['LD_LIBRARY_PATH'], '\n')
DONE

不幸的是,对Apache使用SetEnv指令的简单修复不起作用。相反,您需要执行以下操作:

(请注意以下内容是在64位RHEL5服务器上完成的)

将文件添加到名为/etc/ld.so.conf.d的{​​{1}},其中包含以下内容:

rApache_rJava.conf

(上面一行是我服务器上/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server/ 的父目录的路径)

以root身份:

libjvm.so

然后重启Apache

Apache重新启动后,您能够通过依赖于$ /sbin/ldconfig 的rApache运行R脚本,例如任何有这样的行的东西:

rJava

上面的流程以及其他参考链接也在我的博客上列出: http://oddhypothesis.blogspot.com/2012/06/making-rapache-load-rjava.html

编辑:完全披露

上面链接的博客是我自己的