Rscript无法与AWS Lambda的打包R一起使用

时间:2016-09-01 17:57:51

标签: r aws-lambda rscript

我尝试使用打包的R二进制文件和库(无需安装)在AWS EC2实例的命令行上运行R脚本 - 重点是测试脚本以部署到AWS Lambda。我跟着these instructions。这些说明用于将所有R二进制文件和库打包在一个zip文件中,并将所有内容移动到Amazon EC2实例进行测试。我在新机器上拉开了所有内容,然后运行了更新' sudo yum update'在机器上,并设置R的环境变量指向正确的位置:

export R_HOME=$HOME
export LD_LIBRARY_PATH=$HOME/lib

注意:$ HOME等于/ home / ec2-user。

我创建了这个hello_world.R文件来测试:

#!/home/ec2-user/bin/Rscript
print ("Hello World!")

但是当我跑这个时:

ec2-user$ Rscript hello_world.R

我收到以下错误:

Rscript execution error: No such file or directory

所以我检查了路径,但一切都检查出来:

ec2-user$ whereis Rscript
  Rscript: /home/ec2-user/bin/Rscript

ec2-user$ whereis R
  R: /home/ec2-user/bin/R /home/ec2-user/R

但是当我尝试在命令行使用Rscript评估表达式时,我得到了这个:

ec2-user$ Rscript -e "" --verbose
  running
    '/usr/lib64/R/bin/R --slave --no-restore -e '

  Rscript execution error: No such file or directory

似乎Rscript仍然在默认位置寻找R' / usr / lib64 / R / bin / R'即使我的R_HOME变量设置为' / home / ec2-user':

ec2-user$ echo $R_HOME
  /home/ec2-user

我找到了支持,但我找不到任何可以解决我特定问题的事情。有些人建议重新安装R,但我的理解是,为了Lambda的目的,一切都需要自包含,所以我在一个单独的EC2实例上安装了R,然后将其打包。我应该提一下,在使用软件包管理器安装R的机器上,一切运行正常。

解决方案:在答案中发布了我的solution

3 个答案:

答案 0 :(得分:3)

This blog帖子介绍了类似的问题并提供了一个潜在的解决方案。我还必须实现this post的部分解决方案。

我改变了R源代码的第一行:

#!/bin/sh
# Shell wrapper for R executable.

R_HOME_DIR=${R_ROOT_DIR}/lib64${R_ROOT_DIR}

对此:

R_HOME_DIR=${RHOME}/lib64${R_ROOT_DIR}

我将在下面解释原因。

注意 - 代码的其余部分是:

if test "${R_HOME_DIR}" = "${R_ROOT_DIR}/lib64${R_ROOT_DIR}"; then
   case "linux-gnu" in
   linux*)
     run_arch=`uname -m`
     case "$run_arch" in
        x86_64|mips64|ppc64|powerpc64|sparc64|s390x)
          libnn=lib64
          libnn_fallback=lib
        ;;
        *)
          libnn=lib
          libnn_fallback=lib64
        ;;
     esac
     if [ -x "${R_ROOT_DIR}/${libnn}${R_ROOT_DIR}/bin/exec${R_ROOT_DIR}" ]; then
        R_HOME_DIR="${R_ROOT_DIR}/${libnn}${R_ROOT_DIR}"
     elif [ -x "${R_ROOT_DIR}/${libnn_fallback}${R_ROOT_DIR}/bin/exec${R_ROOT_DIR}" ]; then
        R_HOME_DIR="${R_ROOT_DIR}/${libnn_fallback}${R_ROOT_DIR}"
     ## else -- leave alone (might be a sub-arch)
     fi
     ;;
  esac
fi

if test -n "${R_HOME}" && \
   test "${R_HOME}" != "${R_HOME_DIR}"; then
  echo "WARNING: ignoring environment value of R_HOME"
fi
R_HOME="${R_HOME_DIR}"
export R_HOME

您可以在底部看到代码集R_HOME等于R_HOME_DIR,它最初基于R_ROOT_DIR分配。

无论您将R_HOME_DIR或R_HOME变量设置为什么,R都会使用R_ROOT_DIR变量重置所有内容。

通过更改,我可以设置所有环境变量:

export RHOME=$PWD/R  #/home/ec2-user/R
export R_HOME=$PWD/R #/home/ec2-user/R
export R_ROOT_DIR=/R #/R

我将RHOME设置为R包所在的工作目录。 RHOME基本上作为前缀,在我的例子中,它是/ home / ec2-user /.

另外,Rscript将/ R / bin附加到任何RHOME,所以现在我可以正常运行...

Rscript hello_world.R

...在命令行上。 Rscript知道在哪里找到R,它知道在哪里找到它的所有东西。

我觉得打包R是为了在便携式自包含文件夹中运行,而不使用Docker或其他东西,应该比这更容易,所以如果有人有更好的方法,我真的很感激。< / p>

答案 1 :(得分:2)

它认为它正在那里盯着你:

ec2-user$ whereis R
  R: /home/ec2-user/bin/R /home/ec2-user/R

是您放置R的地方 - 但是它是为/期望的那样构建的:

ec2-user$ Rscript -e "" --verbose
  running
    '/usr/lib64/R/bin/R --slave --no-restore -e '

这些路径不一样。真正的错误可能是您假设您可以将构建和配置的 R安装重新定位到其他目录。你不能。

您可以为新(已知)路径构建R并安装它。在配置为for和安装路径相同的系统上,一切都很好:

$ Rscript -e "q()" --verbose
running
  '/usr/lib/R/bin/R --slave --no-restore -e q()'

$ 

答案 2 :(得分:0)

另一种更快的方法: 创建相同的文件夹 /usr/lib/R/bin/ 然后把R放到这个文件夹中。