【问题标题】:Rscript not working with packaged R for AWS LambdaRscript 不适用于 AWS Lambda 的打包 R
【发布时间】:2017-01-09 17:23:51
【问题描述】:

我正在尝试使用打包的 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

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

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

我找到了一些支持,但我找不到任何可以解决我的具体问题的东西。有人建议重新安装 R,但我的理解是,出于 Lambda 的目的,一切都需要自包含,因此我将 R 安装在单独的 EC2 实例上,然后将其打包。我应该提到,在使用包管理器安装 R 的机器上一切运行良好。

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

【问题讨论】:

    标签: r aws-lambda rscript


    【解决方案1】:

    它以为它就在那儿盯着你看:

    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 并安装它。在配置路径和安装路径相同的系统上,一切都很好:

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

    【讨论】:

    • 谢谢。是的,我觉得这是问题的根源,但不知道如何解决它。我最终遵循了这个解决方案的一部分:fumodibit.blogspot.co.uk/2013/04/…
    • 感谢您的信息。在调试相同的信息时,我点击了评论中的链接,我能够通过将 RHOME 环境变量设置为 R 主目录 (export RHOME=$R_HOME_DIR) 来解决这个问题。
    【解决方案2】:

    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 知道在哪里可以找到它的所有内容。

    我觉得将 R 打包到一个可移植的独立文件夹中运行,而不使用 Docker 或其他东西,应该比这更容易,所以如果有人有更好的方法,我真的很感激。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-27
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多