我想使用sparkr在forecast
等曲目上使用r包,并遇到以下两个问题。
我应该在工作节点上预先安装所有这些软件包吗?但是当我阅读spark this file的源代码时,似乎spark会自动压缩包并通过--jars或--packages将它们分发给worker。我应该怎么做才能使工作人员可以使用依赖项?
假设我需要在forecast
转换中使用map
提供的函数,我该如何导入包。我是否需要执行以下操作,在map函数中导入包,它是否会进行多次导入:
SparkR:::map(rdd, function(x){
library(forecast)
then do other staffs
})
更新
在阅读了更多源代码之后,似乎可以使用includePackage
根据this file在工作节点上包含包。所以现在问题变成了我必须手动在节点上预安装软件包吗?如果这是真的,问题1中描述的--jars和--packages的用例是什么?如果这是错的,如何使用--jars和--packages来安装软件包?
答案 0 :(得分:2)
重复这一点很无聊,但你不应该首先使用内部RDD API 。它已在第一个官方SparkR版本中删除,它根本不适合一般用途。
在新的低级API *准备好之前(例如参见SPARK-12922 SPARK-12919,SPARK-12792)我不会将Spark视为运行纯R代码的平台。即使它更改添加本机(Java / Scala)代码与R包装器可能是一个更好的选择。
话虽如此,让我们从你的问题开始:
RPackageUtils
旨在处理使用Spark包创建的包。它没有处理标准的R库。是的,您需要在每个节点上安装软件包。来自includePackage
docstring:
假定软件包安装在Spark集群中的每个节点上。
*如果你使用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版本相同。