Rscript 不适用于 AWS Lambda 的打包 R
Rscript not working with packaged R for AWS Lambda
我正在尝试使用打包的 R 二进制文件和库(无需安装)在 AWS EC2 实例的命令行上 运行 R 脚本——重点是测试脚本以部署到 AWS拉姆达。我关注了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 似乎仍在默认位置“/usr/lib64/R/bin/R”中寻找 R,即使我的 R_HOME 变量设置为“/home/ec2-user”:
ec2-user$ echo $R_HOME
/home/ec2-user
我找到了一些支持,但找不到任何解决我的具体问题的方法。有人建议重新安装 R,但我的理解是,为了 Lambda 的目的,一切都需要自包含,所以我在一个单独的 EC2 实例上安装了 R,然后将其打包。我应该提一下,在安装了包管理器的 R 的机器上,一切 运行 都很好。
解决方案:在答案中发布我的 。
它认为它正盯着你看:
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 并安装它。在 configured-for 和 installed-at 路径相同的系统上,一切都很好:
$ Rscript -e "q()" --verbose
running
'/usr/lib/R/bin/R --slave --no-restore -e q()'
$
This blog post walks through a similar problem and offers a potential solution. I also had to implement part of the solution from 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 或其他东西,应该比这更容易,所以如果有人有更好的方法这个,我真的很感激。
另一种更快速的方法:
创建相同的文件夹 /usr/lib/R/bin/
然后把R放到这个文件夹里。
我正在尝试使用打包的 R 二进制文件和库(无需安装)在 AWS EC2 实例的命令行上 运行 R 脚本——重点是测试脚本以部署到 AWS拉姆达。我关注了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 似乎仍在默认位置“/usr/lib64/R/bin/R”中寻找 R,即使我的 R_HOME 变量设置为“/home/ec2-user”:
ec2-user$ echo $R_HOME
/home/ec2-user
我找到了一些支持,但找不到任何解决我的具体问题的方法。有人建议重新安装 R,但我的理解是,为了 Lambda 的目的,一切都需要自包含,所以我在一个单独的 EC2 实例上安装了 R,然后将其打包。我应该提一下,在安装了包管理器的 R 的机器上,一切 运行 都很好。
解决方案:在答案中发布我的
它认为它正盯着你看:
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 并安装它。在 configured-for 和 installed-at 路径相同的系统上,一切都很好:
$ Rscript -e "q()" --verbose
running
'/usr/lib/R/bin/R --slave --no-restore -e q()'
$
This blog post walks through a similar problem and offers a potential solution. I also had to implement part of the solution from 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 或其他东西,应该比这更容易,所以如果有人有更好的方法这个,我真的很感激。
另一种更快速的方法:
创建相同的文件夹 /usr/lib/R/bin/
然后把R放到这个文件夹里。