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

使用sparkr时,我是否应该在工作节点上预安装cran r包,r,apache-spark,sparkr,R,Apache Spark,Sparkr,我想在cran上使用r包,比如与sparkr一起使用forecast等,并遇到以下两个问题 我应该在工作节点上预安装所有这些包吗?但是当我阅读spark的源代码时,spark似乎会自动压缩包并通过--jar或--packages将它们分发给工作人员。我应该怎么做才能使依赖关系对工作人员可用 假设我需要在map转换中使用forecast提供的函数,我应该如何导入包。我是否需要执行以下操作,在map函数中导入包,它是否会进行多次导入: SparkR:::映射(rdd,函数(x){ 图书馆(预测)

我想在cran上使用r包,比如与sparkr一起使用
forecast
等,并遇到以下两个问题

  • 我应该在工作节点上预安装所有这些包吗?但是当我阅读spark的源代码时,spark似乎会自动压缩包并通过--jar或--packages将它们分发给工作人员。我应该怎么做才能使依赖关系对工作人员可用

  • 假设我需要在
    map
    转换中使用
    forecast
    提供的函数,我应该如何导入包。我是否需要执行以下操作,在map函数中导入包,它是否会进行多次导入:
    
    SparkR:::映射(rdd,函数(x){
    图书馆(预测)
    那么其他员工呢
    })
    

  • 更新:


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

    重复这一点很无聊,但是首先不应该使用内部RDDAPI。它在第一个正式的SparkR版本中被删除了,不适合一般使用

    <> P>直到新的低级别API*准备好(例如,),我才不会把SARK视为运行纯R代码的平台。即使在它发生变化时,添加带有R包装器的本机(Java/Scala)代码也是一个更好的选择

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

  • RPackageUtils
    旨在处理使用Spark软件包创建的软件包。它不处理标准的R库

  • 是的,您需要在每个节点上安装软件包。从
    includePackage
    docstring:

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



  • *如果使用Spark 2.0+,则可以使用Dappy、gapply和Lappy函数。

    添加库与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)
    

    schema更好的选择是通过spark submit archive选项传递您的本地R包,这意味着您不需要在每个辅助进程中安装R包,也不需要在运行
    SparkR::Dappy
    时安装和编译R包,因为等待时间很长。例如:

    
    Sys.setenv(“SPARKR_SUBMIT_ARGS”=“--主纱线客户端--num executors 40--executor cores 10--executor memory 8G--驱动程序内存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
    函数时,让它先调用
    .libpath(“./3.5.zip/3.5”)
    。您需要注意的是,服务器版本R必须与zip文件版本R相同。

    为什么要使用非导出函数?@piccolbo
    非导出函数
    是什么意思?我尝试在workers上并行运行cran包提供的一些函数。我认为使用sparkr可以避免我管理并行计算系统。但这样使用sparkr可能是错误的。对不起,我的英语很差。非导出意味着使用
    ::
    (三个冒号)函数访问,或者换句话说,当您使用
    库(一些名称)
    @zero323时,这些函数没有被导入。我是R新手,从其他堆栈溢出问题复制
    SparkR:::map
    示例,我的意思是用scala代码
    rdd.map{x=>y}
    来表示。很高兴了解
    ::
    :)顺便说一句。如果您需要Spark的低级别R访问,您可能会感兴趣。