[英]should I pre-install cran r packages on worker nodes when using sparkr
我想用火花等forecast
等使用r包,並滿足以下兩個問題。
我應該在工作節點上預安裝所有這些軟件包嗎? 但是當我閱讀spark 這個文件的源代碼時,似乎spark會自動壓縮包並通過--jars或--packages將它們分發給worker。 我該怎么做才能使工作人員可以使用依賴項?
假設我需要在map
轉換中使用forecast
提供的函數,我該如何導入包。 我是否需要執行以下操作,在map函數中導入包,它是否會進行多次導入: SparkR:::map(rdd, function(x){ library(forecast) then do other staffs })
更新:
在閱讀了更多的源代碼后,似乎可以使用includePackage
根據此文件在工作節點上包含包。 所以現在問題變成了我必須手動在節點上預安裝軟件包嗎? 如果這是真的,問題1中描述的--jars和--packages的用例是什么? 如果這是錯的,如何使用--jars和--packages來安裝軟件包?
重復此操作很無聊,但您不應該首先使用內部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函數。
添加庫與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)
一個更好的選擇是通過spark-submit存檔選項傳遞你的本地R包,這意味着你不需要在每個worker中安裝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版本相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.