无法在Azure Batch节点上加载R包

时间:2017-05-11 00:18:02

标签: python r azure azure-batch

我无法使用Azure Batch Python API将软件包加载到我的计算池节点上的R中。我使用的代码类似于Azure Batch Python SDK Tutorial中提供的代码,但任务更复杂 - 我希望作业池中的每个节点都执行一个需要某些包依赖的R脚本。

因此,在我的启动任务命令下面,我有每个节点(Canonical UbuntuServer SKU:16)通过apt安装R并安装R包依赖项(我之所以添加R包安装到启动任务的原因是,即使之后创建具有通用权限的lib目录~/Rpkgs,在任务脚本中运行install.packages(list_of_packages, lib="~/Rpkgs/", repos="http://cran.r-project.org")会导致“不可写”错误。)

task_commands = [
    'cp -p {} $AZ_BATCH_NODE_SHARED_DIR'.format(_R_TASK_SCRIPT),
    # Install pip
    'curl -fSsL https://bootstrap.pypa.io/get-pip.py | python',
    # Install the azure-storage module so that the task script can access Azure Blob storage, pre-cryptography version
    'pip install azure-storage==0.32.0',
    # Install R
    'sudo apt -y install r-base-core',
    'mkdir ~/Rpkgs/',
    'sudo chown _azbatch:_azbatchgrp ~/Rpkgs/',
    'sudo chmod 777 ~/Rpkgs/',
    # Install R package dependencies
    # *NOTE*: the double escape below is necessary because Azure strips the forward slash
    'printf "install.packages( c(\\"foreach\\", \\"iterators\\", \\"optparse\\", \\"glmnet\\", \\"doMC\\"), lib=\\"~/Rpkgs/\\", repos=\\"https://cran.cnr.berkeley.edu\\")\n" > ~/startTask.txt',
    'R < startTask.txt --no-save'
    ]

无论如何,我在Azure门户中确认这些软件包在计算池节点上按预期安装(您可以在节点文件系统中看到它们位于startup/wd/Rpkgs/,a.k.a。~/Rpkgs/。但是,当_R_TASK_SCRIPT任务成功添加到作业池时,它以非零退出代码终止,因为它无法加载任何包(例如foreach,{{1已经安装在启动任务中的。},iterators等。

更具体地说,optparse包含以下R代码并返回以下输出:

R代码:

_R_TASK_SCRIPT

Azure批处理节点上的R stderr,lapply( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, character.only=TRUE, lib.loc="~/Rpkgs/") ...

stderr.txt

Azure批处理节点上的标准输出Loading required package: iterators Loading required package: foreach Loading required package: optparse Loading required package: glmnet Loading required package: doMC

stdout.txt
上面的

[[1]] [1] FALSE [[2]] [1] FALSE [[3]] [1] FALSE [[4]] [1] FALSE [[5]] [1] FALSE 表示它无法加载R包。这是我面临的问题,我想弄明白为什么。

值得注意的是,当我启动类似的VM(Canonical UbuntuServer SKU:16)并手动运行相同的安装时,它会成功加载所有软件包。

FALSE

提前感谢您的帮助和建议。

2 个答案:

答案 0 :(得分:0)

每个任务都在自己的工作目录上运行,该目录由环境变量$AZ_BATCH_TASK_WORKING_DIR引用。当R会话运行时,当前的R工作目录[getwd()]将是$AZ_BATCH_TASK_WORKING_DIR,而不是pkgs所在的$AZ_BATCH_NODE_STARTUP_DIR

要在R代码中获取确切的包裹位置(&#34; startup/wd/pkgs&#34;),

lapply( c("iterators", "foreach", "optparse", "glmnet", "doMC"), require, 
character.only=TRUE, lib.loc=paste0(Sys.getenv("AZ_BATCH_NODE_STARTUP_DIR"), 
 "/wd/", "Rpkgs") )

在lapply之前运行此方法:

setwd(paste0(Sys.getenv("AZ_BATCH_NODE_STARTUP_DIR"), "/wd/"))

添加:您还可以创建已安装R的Azure数据科学家虚拟机批处理池,这样您就不必自行安装。

Azure Batch的doAzureParallel R包支持包安装。 这是一个链接:https://github.com/Azure/doAzureParallel(免责声明:我创建了doAzureParallel R包)

答案 1 :(得分:0)

这似乎是由于已安装的软件包不存在R的默认库路径。尝试通过在加载软件包之前添加代码.libPath("~\Rpkgs")来设置查找软件包的库树的路径。

作为参考,您可以参考SO线程Changing R default library path using .libPaths in Rprofile.site fails to work

与此同时,官方博客介绍了如何在Azure Batch上使用R工作负载,但适用于Windows环境。希望它有所帮助。