RJDBC 未在 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 由于警告消息而无法运行库的问题?

是的,这是 libjvm.so ;)rjava.so 找不到!

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

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

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

哦,我刚刚想起:rJava 可能会在某些特定于 Java 的环境变量中获取源代码,这些变量位于 rJava 包安装中。看看这是否发生在您的本地会话中。如果是这种情况,那么在运行 apache/rApache 时,您很可能需要这些设置。

正如我上面提到的,如果你的发行版正在限制 apache 的环境,那么你就必须将这些 Java 环境变量填充到该限制过程中。

干杯!

杰夫

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

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

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

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

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

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

/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server/

(上行是我的服务器上libjvm.so父目录的路径)

作为根:

$ /sbin/ldconfig

然后重新启动 Apache

在 Apache 重新启动后,您应该能够通过依赖于 rJava 的 rApache 运行 R 脚本,例如任何带有以下行的内容:

library(rJava)

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

编辑:完全披露

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

最新更新