我应该在使用sparkr时在工作节点上预先安装cran r包

时间:2016-03-15 01:44:33

标签: r apache-spark sparkr

我想使用sparkr在forecast等曲目上使用r包,并遇到以下两个问题。

  1. 我应该在工作节点上预先安装所有这些软件包吗?但是当我阅读spark this file的源代码时,似乎spark会自动压缩包并通过--jars或--packages将它们分发给worker。我应该怎么做才能使工作人员可以使用依赖项?

  2. 假设我需要在forecast转换中使用map提供的函数,我该如何导入包。我是否需要执行以下操作,在map函数中导入包,它是否会进行多次导入: SparkR:::map(rdd, function(x){ library(forecast) then do other staffs })

  3. 更新

    在阅读了更多源代码之后,似乎可以使用includePackage根据this file在工作节点上包含包。所以现在问题变成了我必须手动在节点上预安装软件包吗?如果这是真的,问题1中描述的--jars和--packages的用例是什么?如果这是错的,如何使用--jars和--packages来安装软件包?

3 个答案:

答案 0 :(得分:2)

重复这一点很无聊,但你不应该首先使用内部RDD API 。它已在第一个官方SparkR版本中删除,它根本不适合一般用途。

在新的低级API *准备好之前(例如参见SPARK-12922 SPARK-12919SPARK-12792)我不会将Spark视为运行纯R代码的平台。即使它更改添加本机(Java / Scala)代码与R包装器可能是一个更好的选择。

话虽如此,让我们从你的问题开始:

  1. RPackageUtils旨在处理使用Spark包创建的包。它没有处理标准的R库。
  2. 是的,您需要在每个节点上安装软件包。来自includePackage docstring:

      

    假定软件包安装在Spark集群中的每个节点上。

  3. *如果你使用Spark 2.0+,你可以使用dapply,gapply和lapply函数。

答案 1 :(得分:0)

添加库可以使用spark 2.0+。例如,我在群集的所有节点中添加包预测。该代码适用于Spark 2.0+和databricks环境。

schema <- structType(structField("out", "string"))
out <- gapply(
  df,
  c("p", "q"),
  function(key, x) 
  if (!all(c("forecast") %in% (.packages()))){
     if (!require("forecast")) {
        install.packages("forecast", repos ="http://cran.us.r-project.org", INSTALL_opts = c('--no-lock'))
     }
  }  
  #use forecast
  #dataframe out
  data.frame(out = x$column, stringAsFactor = FALSE)
}, 
schema)

答案 2 :(得分:-1)

一个更好的选择是通过spark-submit归档选项传递本地R软件包,这意味着您不需要在每个工作进程中安装R软件包,也不需要在运行SparkR::dapply时安装和编译R软件包,从而节省了时间等候。例如:

Sys.setenv("SPARKR_SUBMIT_ARGS"="--master yarn-client --num-executors 40 --executor-cores 10 --executor-memory 8G --driver-memory 512M --jars /usr/lib/hadoop/lib/hadoop-lzo-0.4.15-cdh5.11.1.jar --files /etc/hive/conf/hive-site.xml --archives /your_R_packages/3.5.zip --files xgboost.model sparkr-shell")

调用SparkR::dapply函数时,请先使其调用.libPaths("./3.5.zip/3.5")。您需要注意,服务器版本R版本必须与zip文件R版本相同。