【问题标题】:Install R package without file append?安装没有文件附加的 R 包?
【发布时间】:2021-07-09 00:56:00
【问题描述】:

我正在寻找一种在不允许文件附加的文件系统上安装 R 包的方法(即 Databricks 文件系统/DBFS,可通过 FUSE 安装获得)。

默认情况下,install.packages() 似乎会对其下载的内容进行一些文件清理和文件附加。

R 是否提供了一种无需附加到文件即可安装包的方法?

到目前为止,我的经历是这样的:

foundpkgs: kernlab, /tmp/RtmprBtUFj/downloaded_packages/kernlab_0.9-29.tar.gz
files: /tmp/RtmprBtUFj/downloaded_packages/kernlab_0.9-29.tar.gz
* installing *source* package ‘kernlab’ ...
** package ‘kernlab’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
g++ -std=gnu++11 -I"/usr/share/R/include" -DNDEBUG      -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-EkOYxp/r-base-4.0.4=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c brweight.cpp -o brweight.o
<...snip...>
g++ -std=gnu++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o kernlab.so brweight.o ctable.o cweight.o dbreakpt.o dcauchy.o dgpnrm.o dgpstep.o dprecond.o dprsrch.o dspcg.o dtron.o dtrpcg.o dtrqsol.o esa.o expdecayweight.o inductionsort.o init.o kspectrumweight.o lcp.o misc.o msufsort.o solvebqp.o stringk.o stringkernel.o svm.o wkasailcp.o wmsufsort.o -llapack -lblas -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
installing to /dbfs/<...snip...>/00LOCK-kernlab/00new/kernlab/libs
** R
Warning in .file_append_ensuring_LFs(outFile, codeFiles) :
  write error during file append
<...snip...>
Warning in .file_append_ensuring_LFs(outFile, codeFiles) :
  write error during file append
Error in .install_package_code_files(".", instdir) : 
  unable to write code files
ERROR: unable to collate and parse R files for package ‘kernlab’
* removing ‘/dbfs/<...snip...>/kernlab’

The downloaded source packages are in
    ‘/tmp/RtmprBtUFj/downloaded_packages’

【问题讨论】:

  • DBFS 通常用于存储数据对象,而不是您的可执行文件。你为什么要在那里存储你的 R 包?
  • 我同意在那里安装可能不是最好的,但是 ...stackoverflow.com/a/59814948/3358272 是一个答案,它在不同的文件系统上进行编译/安装,然后将其复制到这个 DBFS 挂载上。跨度>
  • @crestor 因为否则 R 环境,包括用户安装的包,会在集群重启时被 Databricks 清除。很难在这种 DevEx 上向我们的内部数据科学用户推销。
  • 对@r2evans 的回复相同:我对 DevEx 很满意,但我的数据科学家用户不会。
  • 所以你是在告诉我在这个系统上 R 没有其他可用的文件系统? tmpfs 怎么样?我怀疑您的数据科学家用户对于无法安装某些软件包根本会不太满意。如果你可以使用/tmp/ 或类似的,那么你很高兴,否则我认为这个 DBFS 解决方案要么是临时的,要么是一个显示停止器。

标签: r databricks fuse


【解决方案1】:

如果您需要允许用户使用install.packages,那么我的第一个建议不是一个选项,因为它需要使用辅助功能。如果你能做到,我认为你的评论演练最有意义:

  1. 将两个目录按顺序添加到 lib-path:

    .libPaths(c("/localfs/", "/dbfs/", .libPaths())
    

    通过将其添加到现有的.libPaths(),我们保留了系统库路径中可用的内容。通过将/localfs/放在首位,它现在是安装任何软件包的默认位置。

  2. 通过一些 cron 作业或作为关闭函数,确保两条路径同步:

    rsync -pr /localfs/* /dbfs/
    

    如果您在系统中有某种形式的预先退出脚本功能,那么这应该只需要执行一次;如果您不能信任它(可能系统立即关闭和/或超时),那么 cron 作业就足够了,如果不完美的话。

    这意味着一个包很可能在 both 中都可用,但 R 对此很好。

    这样做的一个问题是,如果较新的安装没有与以前安装的所有相同的文件;考虑一个出于某种原因实际上减少其足迹的包(可能是罕见的,但可能)。为此,您需要使用rsync --delete ...。然而,虽然这是有道理的,但我还没有测试过它,所以我强烈建议你在相信它在生产中不受监督之前测试它。 (我的意思是,可能任意shell脚本递归删除文件会出现什么问题......)

【讨论】:

  • 我希望我在问题 cmets 中充分详细说明了我们讨论的要点。
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多