sparklyr 可以与部署在纱线管理的 hadoop 集群上的 spark 一起使用吗?

Posted

技术标签:

【中文标题】sparklyr 可以与部署在纱线管理的 hadoop 集群上的 spark 一起使用吗?【英文标题】:Can sparklyr be used with spark deployed on yarn-managed hadoop cluster? 【发布时间】:2016-11-01 08:35:05 【问题描述】:

sparklyr R package 是否能够连接到 YARN 管理的 hadoop 集群?这似乎没有记录在cluster deployment 文档中。使用 Spark 附带的 SparkR 包,可以这样做:

# set R environment variables
Sys.setenv(YARN_CONF_DIR=...)
Sys.setenv(SPARK_CONF_DIR=...)
Sys.setenv(LD_LIBRARY_PATH=...)
Sys.setenv(SPARKR_SUBMIT_ARGS=...)

spark_lib_dir <- ... # install specific
library(SparkR, lib.loc = c(sparkr_lib_dir, .libPaths()))
sc <- sparkR.init(master = "yarn-client")

但是,当我用

交换上面的最后几行时
library(sparklyr)
sc <- spark_connect(master = "yarn-client")

我收到错误:

Error in start_shell(scon, list(), jars, packages) : 
  Failed to launch Spark shell. Ports file does not exist.
    Path: /usr/hdp/2.4.2.0-258/spark/bin/spark-submit
    Parameters: '--packages' 'com.databricks:spark-csv_2.11:1.3.0,com.amazonaws:aws-java-sdk-pom:1.10.34' '--jars' '<path to R lib>/3.2/sparklyr/java/rspark_utils.jar'  sparkr-shell /tmp/RtmpT31OQT/filecfb07d7f8bfd.out

Ivy Default Cache set to: /home/mpollock/.ivy2/cache
The jars for the packages stored in: /home/mpollock/.ivy2/jars
:: loading settings :: url = jar:file:<path to spark install>/lib/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar!/org/apache/ivy/core/settings/ivysettings.xml
com.databricks#spark-csv_2.11 added as a dependency
com.amazonaws#aws-java-sdk-pom added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
    confs: [default]
:: resolution report :: resolve 480ms :: artifacts dl 0ms
    :: modules in use:
    -----------------------------------------

sparklyrSparkR 的替代品还是构建在 SparkR 包之上?

【问题讨论】:

查看sparkapi 自述文件,最后一个问题的答案显然是“它是 SparkR 的替代品”。虽然仍然不确定如何使用master='yarn-client' 相关问题:***.com/questions/38486163/… - 似乎这个问题在不同的操作系统和配置中不断出现 【参考方案1】:

是的,它可以,但所有其他内容都有一个问题,这在博客文献中非常难以捉摸,并且以配置资源为中心。

关键是这个:当你让它在本地模式下执行时,你不必以声明方式配置资源,但是当你在 YARN 集群中执行时,你绝对必须声明这些资源。我花了很长时间才找到阐明这个问题的文章,但一旦我尝试过,它就奏效了。

这是一个带有关键参考的(任意)示例:

config <- spark_config()
config$spark.driver.cores <- 32
config$spark.executor.cores <- 32
config$spark.executor.memory <- "40g"

library(sparklyr)

Sys.setenv(SPARK_HOME = "/usr/local/spark")
Sys.setenv(HADOOP_CONF_DIR = '/usr/local/hadoop/etc/hadoop/conf')
Sys.setenv(YARN_CONF_DIR = '/usr/local/hadoop/etc/hadoop/conf')

config <- spark_config()
config$spark.executor.instances <- 4
config$spark.executor.cores <- 4
config$spark.executor.memory <- "4G"

sc <- spark_connect(master="yarn-client", config=config, version = '2.1.0')

R Bloggers Link to Article

【讨论】:

【参考方案2】:

针对此问题,建议升级到 sparklyr 版本 0.2.30 或更高版本。使用devtools::install_github("rstudio/sparklyr") 升级,然后重新启动 r 会话。

【讨论】:

感谢您的跟进,但更新(至 0.2.31)并未解决端口文件问题。我的集群上的 spark 安装似乎没有预期的配置文件。 sparklyr 尝试调用 .../spark/bin/spark-submit,但配置文件是 .../spark/conf,其中包含 hive-site.xmlspark-defaults.conf 之类的内容,但没有“端口”文件。 我应该注意到,这个 spark 安装已经被 pysparkSparkR 大量使用,没有问题。【参考方案3】:

您是否可能使用 Cloudera Hadoop (CDH)?

我在问,因为我在使用 CDH 提供的 Spark 发行版时遇到了同样的问题:

Sys.getenv('SPARK_HOME')
[1] "/usr/lib/spark"  # CDH-provided Spark
library(sparklyr)
sc <- spark_connect(master = "yarn-client")
Error in sparkapi::start_shell(master = master, spark_home = spark_home,  : 
      Failed to launch Spark shell. Ports file does not exist.
        Path: /usr/lib/spark/bin/spark-submit
        Parameters: --jars, '/u01/app/oracle/product/12.1.0.2/dbhome_1/R/library/sparklyr/java/sparklyr.jar', --packages, 'com.databricks:spark-csv_2.11:1.3.0','com.amazonaws:aws-java-sdk-pom:1.10.34', sparkr-shell, /tmp/Rtmp6RwEnV/file307975dc1ea0.out

Ivy Default Cache set to: /home/oracle/.ivy2/cache
The jars for the packages stored in: /home/oracle/.ivy2/jars
:: loading settings :: url = jar:file:/usr/lib/spark/lib/spark-assembly-1.6.0-cdh5.7.0-hadoop2.6.0-cdh5.7.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
com.databricks#spark-csv_2.11 added as a dependency
com.amazonaws#aws-java-sdk-pom added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
    confs: [default]
    found com.databricks#spark-csv_2.11;1.3.0 in central
    found org.apache.commons#commons-csv;1.1 in central
    found com.univocity#univocity-parsers;1.5.1 in central
    found com.

但是,在我从 Databricks(Spark 1.6.1、Hadoop 2.6)下载预构建版本并指向 SPARK_HOME 之后,我能够成功连接:

Sys.setenv(SPARK_HOME = '/home/oracle/spark-1.6.1-bin-hadoop2.6') 
sc <- spark_connect(master = "yarn-client") # OK
library(dplyr)
iris_tbl <- copy_to(sc, iris)
src_tbls(sc)
[1] "iris"

Cloudera 尚未在其分发中包含 SparkR,我怀疑 sparklyr 可能仍对SparkR 有一些微妙的依赖。以下是尝试使用 CDH 提供的 Spark,但使用 config=list() 参数时的结果,正如 Github 上 sparklyr 问题中的 this thread 中所建议的那样:

sc <- spark_connect(master='yarn-client', config=list()) # with CDH-provided Spark
Error in sparkapi::start_shell(master = master, spark_home = spark_home,  : 
  Failed to launch Spark shell. Ports file does not exist.
    Path: /usr/lib/spark/bin/spark-submit
    Parameters: --jars, '/u01/app/oracle/product/12.1.0.2/dbhome_1/R/library/sparklyr/java/sparklyr.jar', sparkr-shell, /tmp/Rtmpi9KWFt/file22276cf51d90.out

Error: sparkr.zip does not exist for R application in YARN mode.

此外,如果您检查错误的Parameters 部分的最右边部分(您的和我的),您将看到对sparkr-shell 的引用...

(使用sparklyr 0.2.28sparkapi 0.3.15、来自 RStudio Server 的 R 会话、Oracle Linux 测试)

【讨论】:

非常感谢。然而,我在一个带有 spark 1.6.1 的 HDP 集群上——所以引擎盖下的 R 方法应该在 spark 中可用。问题似乎是我缺少某个端口配置文件,显然其他任何东西都不需要。【参考方案4】:

是的,sparklyr 可以用于纱线管理的集群。为了连接到纱线管理的集群,需要:

    将 SPARK_HOME 环境变量设置为指向正确的 spark 主目录。 使用适当的主位置连接到 spark 集群,例如:sc &lt;- spark_connect(master = "yarn-client")

另请参阅:http://spark.rstudio.com/deployment.html

【讨论】:

我尝试设置 SPARK_HOME ,但端口文件问题仍然存在。我不清楚spark_connect 到底在寻找什么或在哪里寻找。是否需要从yarn-site.xml中提取名称和端口? 目前,sparklyrsparkr 的替代品;我没有尝试并排使用它们,因为目前不支持。您能否确认您正在运行脚本而没有加载 sparkr 库。如果这仍然不起作用,您能否转储您的系统信息:操作系统、版本、x86/x64、spark 重新分发等,以便我们查看并重现此信息?也将不胜感激在github.com/rstudio.sparklyr 下打开此问题,让更多人帮助解除阻止。 我终于通过将config=list() 添加到spark_connect() 的输入来使事情正常进行。似乎错误消息有点误导。安装 spark 包的真正问题是什么? 在旧版本的 sparklyr 中,我们指定了一个 CSV 包,在 spark_connect() 期间,Spark 将从 Spark 的在线包 repo 下载,因此,spark_connect() 需要互联网连接,除非将 config = list() 指定为覆盖添加此 CSV 包。较新版本的 sparklyr 嵌入了 CSV 包以避免需要互联网连接,并且离线集群不再需要 config=list()

以上是关于sparklyr 可以与部署在纱线管理的 hadoop 集群上的 spark 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用Cloudera部署,管理Hadoop集群

如何在 AWS 部署中使用特定节点版本进行纱线设置?

在heroku上部署应用程序时出现过时的纱线锁文件错误

在纱线部署模式下在控制台上打印地图功能中的值

如何使用 'sparklyr::replace.na()' 替换一列上的 NaN?

Hadoop系列之:使用Cloudera部署,管理Hadoop集群