Apache Spark 的 SparkR 前端:安装、构建、开发与测试实战指南
2026/9/18 12:29:17 网站建设 项目流程

Apache Spark 的 SparkR 前端:安装、构建、开发与测试实战指南

【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址: https://gitcode.com/gh_mirrors/sp/spark

SparkR 是 Apache Spark 提供的 R 语言前端,通过轻量级 R 包让数据科学家可以在 R 环境中直接操作 Spark 的分布式计算能力。本文基于当前仓库R/pkg/README.md及其配套脚本与源码,系统讲解 SparkR 的安装方式、Spark 构建流程、交互式 Shell 启动、RStudio 集成、二次开发、文档生成、单元测试以及在 YARN 集群上的提交方法,帮助读者从零搭建一套可用的 SparkR 开发与运行环境。

SparkR 是什么

按照仓库 R/pkg/README.md 的定义:

SparkR is an R package that provides a light-weight frontend to use Spark from R.

SparkR 是一个"轻量级前端"——它本身并不实现分布式计算,而是把 R 代码翻译为对 JVM 上 Spark 的调用。从包元数据看,该 R 包名为SparkR(见 R/pkg/DESCRIPTION),依赖R (>= 4.0)methods,并要求 Java 版本为Java (>= 17, < 26)

注意:当前仓库的 README 标题为 "R on Spark (deprecated)",即该前端已被标记为弃用状态。这是仓库现状的事实说明,本文以下内容均基于仓库当前状态展开;若你在新项目中评估 R 语言与 Spark 的结合方案,请以官方最新发布版本的状态为准。

从 R/pkg/NAMESPACE 可以看出 SparkR 的能力范围非常完整,主要包括:

  • 会话管理:sparkR.sessionsparkR.session.stopsparkR.versionsparkR.uiWebUrl
  • DataFrame 操作:read.dfwrite.dfcreateDataFrameselectfilterjoingroupBycollect等 S4 方法;
  • SQL 接口:sqltableToDFcreateOrReplaceTempView等;
  • MLlib 集成:spark.glmspark.kmeansspark.randomForestspark.gbtspark.alsspark.naiveBayesspark.survreg等机器学习算法;
  • 列级函数:数百个Column方法(如whencastwindowfrom_jsonto_json等),覆盖类型转换、日期处理、JSON、窗口函数等场景;
  • 流式查询:read.streamwrite.streamawaitTerminationisActive等 Structured Streaming 相关接口;
  • 底层 JVM 互操作:sparkR.newJObjectsparkR.callJMethodsparkR.callJStatic

整套 API 的源码位于 R/pkg/R 目录下,其中DataFrame.Rfunctions.Rmllib_classification.R等文件分别对应上述能力模块。

安装 SparkR 开发库

SparkR 的库文件需要被安装到$SPARK_HOME/R/lib目录下,这一过程由脚本 R/install-dev.sh 完成。

使用 install-dev.sh 安装

# 在 $SPARK_HOME 下执行 ./R/install-dev.sh

默认情况下,该脚本使用系统全局安装的 R。如果你希望改用某个用户目录下自行安装的 R,只需要在运行脚本前设置环境变量R_HOME,指向 R 安装目录的根路径(该目录下的bin子目录应包含RRScript可执行文件):

# 其中 /home/username/R 是 R 的安装目录,/home/username/R/bin 包含 R 和 RScript export R_HOME=/home/username/R ./install-dev.sh

从 R/install-dev.sh 源码看,脚本的核心执行逻辑为:

  1. 通过find-r.sh定位 R 可执行文件(R/find-r.sh 会优先读取R_HOME/bin,否则回退到which R,找不到时报错退出);
  2. 调用create-rd.sh预生成 Rd 文档;
  3. 执行R CMD INSTALL --library="$FWDIR/lib" "$FWDIR/pkg/"R/pkg目录下的包源码安装到R/lib
  4. 将安装好的SparkR目录打包为R/lib/sparkr.zip

其中第 4 步打包sparkr.zip的目的值得注意:Spark 在 YARN 上运行时需要把 SparkR 包分发到各 worker 节点,zip 包就是为此准备的(脚本注释中明确写了 "Zip the SparkR package so that it can be distributed to worker nodes on YARN")。

安装完成后,在 R 中通过以下方式加载:

library(SparkR, lib.loc = "$SPARK_HOME/R/lib")

Windows 平台安装

仓库同时提供了 Windows 批处理版本 R/install-dev.bat。它执行等价的操作:创建%SPARK_HOME%\R\lib,在该目录下直接执行R.exe CMD INSTALL --library="%SPARK_HOME%\R\lib" .,最后用%JAVA_HOME%\bin\jar.exe生成sparkr.zip。其中特意先pushdR\pkg目录再安装,是为了规避 R 4.0 下直接传相对路径参数导致路径解析异常的问题(参见 SPARK-32074)。

从源码包安装

如果希望从构建好的 R 源码包(SparkR_<version>.tar.gz)安装,可以使用 R/install-source-package.sh:它先从 R/pkg/DESCRIPTION 中读取版本号(可用VERSION环境变量覆盖),校验源码包存在后,执行R CMD INSTALL "SparkR_$VERSION.tar.gz" --library="$LIB_DIR",同样会生成用于 YARN 分发的sparkr.zip。源码包本身需要先通过 R/check-cran.sh 生成。

构建带 SparkR 的 Spark

SparkR 的 R 包需要与 Spark 主工程一起构建,才能在运行时找到对应的 Scala/SQL 组件。构建时使用 Maven 或 SBT,并且必须带上-Psparkrprofile:

# Maven ./build/mvn -DskipTests -Psparkr package # SBT ./build/sbt -Psparkr package

上面的命令使用默认 Hadoop 版本;如需定制 Hadoop 或其他组件版本,可参照仓库文档 docs/building-spark.md 中的构建说明调整参数。

建议在构建完成后再执行 R/install-dev.sh 安装 R 包,并配合下文运行单元测试,验证整套链路可用。

启动 SparkR 交互式 Shell

构建并安装完成后,即可通过仓库根目录下的 bin/sparkR 脚本启动 SparkR Shell:

./bin/sparkR

默认情况下,sparkR脚本会自动创建一个运行在local 模式的 SparkContext。如果要为这个自动创建的 SparkContext 指定集群的 Spark master,可以传入--master参数:

./bin/sparkR --master "local[2]"

除了--master,你还可以把其他 spark-submit 参数(例如 driver memory、executor memory 等)原样传给./bin/sparkR

./bin/sparkR --master "local[2]" --driver-memory 4g --executor-memory 2g

从 bin/sparkR 脚本源码可以看到它的实现本质:脚本将SPARK_CONNECT_MODE显式置为 0(即使用传统 SparkContext 模式而非 Spark Connect 客户端),定位SPARK_HOME并加载环境后,最终执行:

exec "${SPARK_HOME}"/bin/spark-submit sparkr-shell-main "$@"

也就是说,sparkR只是spark-submit的一个薄封装,启动的入口类为sparkr-shell-main,因此所有 spark-submit 支持的参数它都天然兼容。

从 RStudio 使用 SparkR

如果希望从 RStudio 中交互式使用 SparkR,请在启动 Spark 相关上下文前先加载包并初始化会话:

library(SparkR, lib.loc = "$SPARK_HOME/R/lib") sparkR.session()

具体的启动方式可参考官方 SparkR 文档中 "Starting Up From RStudio" 一节。核心要点是:sparkR.session()会连接本地或集群的 Spark 实例,之后即可像在 SparkR Shell 中一样编写 DataFrame 与 MLlib 代码。结合 R/pkg/DESCRIPTION 中Suggests声明的testthate1071survivalarrow (>= 10.0.0)等依赖,建议在 RStudio 环境中一并安装这些包以获得完整能力(如 GLM 模型评估、生存分析、Arrow 优化)。

对 SparkR 进行二次开发

Spark 的整体贡献指南同样适用于 SparkR。在此基础上,仓库给出了一条重要的捷径:

如果你只修改了 R 文件(不涉及 Scala 代码),那么只需重新运行R/install-dev.sh重新安装 R 包即可测试你的改动,无需重新构建整个 Spark。

这是因为 R 与 JVM 之间通过反射/序列化协议调用(底层实现在 R/pkg/R/backend.R、R/pkg/R/client.R、R/pkg/R/jvm.R 等文件中),R 侧接口变化不需要重新编译 Scala 侧。

改动完成后,官方要求为新功能补充单元测试,并用 R/run-tests.sh 运行既有测试。从该脚本源码可见其测试链路:

  1. 先查找connector/avro构建出的spark-avrojar,若存在则通过--jars附带;
  2. 调用bin/spark-submit提交 R/pkg/tests/run-all.R 执行全部测试,并设置SPARKR_SUPPRESS_DEPRECATION_WARNING=1SPARK_TESTING=1NOT_CRAN=true等环境变量,同时通过--driver-java-options "-Dlog4j.configurationFile=file:$FWDIR/log4j2.properties"指定日志配置(即 R/log4j2.properties),并通过--conf spark.driver.extraJavaOptions="-Xss4M"--conf spark.executor.extraJavaOptions="-Xss4M"调大线程栈;
  3. 之后还会调用 R/check-cran.sh 执行 CRAN 风格检查(NO_TESTS=1 NO_MANUAL=1),并统计 WARNING/ERROR/NOTE 数量,任何测试失败或警告都会以非零退出码结束脚本。

测试用例主体位于 R/pkg/tests/fulltests,覆盖 RDD、DataFrame/SQL、MLlib 分类/聚类/树模型、流式、序列化、JVM API、Arrow 等主题(如test_sparkSQL.Rtest_mllib_classification.Rtest_streaming.R),新增功能的单测通常放在这里,然后再由run-all.R统一调度。

生成 SparkR 文档

SparkR 的 Rd 文档与 HTML 文档不属于源码仓库的一部分,需要自行生成。运行脚本 R/create-docs.sh 即可:

./R/create-docs.sh

该脚本依赖roxygen2knitrrmarkdown以及pkgdown,使用前需确保这些 R 包已安装(脚本注释中明确列出了这些前置依赖)。脚本会依次:

  1. 调用install-dev.sh安装包并生成 Rd 文件;
  2. R/pkg/html目录下用knitr::knit_rd("SparkR", ...)渲染 HTML 文档;
  3. 从 R/pkg/DESCRIPTION 读取版本号,把 R/pkg/pkgdown/_pkgdown_template.yml 中的{SPARK_VERSION}占位符替换为真实版本后,用pkgdown::build_site生成站点(输出到R/pkg/docs)。

生成后的产物位置:

  • Rd/HTML API 文档:$SPARK_HOME/R/pkg/html
  • Vignettes:$SPARK_HOME/R/pkg/vignettes/sparkr_vignettes.html(源码为 R/pkg/vignettes/sparkr-vignettes.Rmd)
  • pkgdown 站点:$SPARK_HOME/R/pkg/docs

对于日常开发中只更新了源码注释的情况,可以参照 R/DOCUMENTATION.md 中的更轻量方式,直接在 R 控制台执行:

roxygen2::roxygenize(package.dir = "./pkg", roclets = c("rd"))

并用R CMD check pkg/验证改动是否正确。

示例程序与单元测试

SparkR 自带若干示例程序,位于examples/src/main/r目录,包括dataframe.RRSparkSQLExample.Rdata-manipulation.R,以及ml/streaming/子目录下的机器学习与流式示例。

运行示例使用./bin/spark-submit <filename> <args>

./bin/spark-submit examples/src/main/r/dataframe.R

SparkR 的单元测试则按官方 "Running R Tests" 一节说明执行,仓库中对应脚本为 R/run-tests.sh。如前文所述,它会通过 spark-submit 提交R/pkg/tests/run-all.R并以 CRAN 检查作为补充,日志分别写入R/unit-tests.outR/cran-check.out

在 YARN 集群上运行

./bin/spark-submit同样可以用于向 YARN 集群提交 SparkR 作业。提交前需要设置 YARN 配置目录(YARN_CONF_DIR)。例如在 CDH 发行版上:

export YARN_CONF_DIR=/etc/hadoop/conf ./bin/spark-submit --master yarn examples/src/main/r/dataframe.R

从 R/install-dev.sh 与 R/install-dev.bat 的源码可以看出,安装脚本专门生成sparkr.zip的目的正是为了在 YARN 模式下把 SparkR 包分发到各 worker 节点——这意味着 YARN 部署前,务必先在每个节点(或通过分发机制覆盖所有节点)完成 SparkR 包的安装,否则 worker 上将无法加载 SparkR 库。此外,在 YARN 集群上运行前,建议先在本机用./bin/sparkR --master "local[2]"验证脚本逻辑,再切换到--master yarn提交,便于隔离 R 代码错误与集群配置问题。

小结

本文围绕 R/pkg/README.md 梳理了 SparkR 的完整使用链路:通过 R/install-dev.sh(及 Windows 下的 R/install-dev.bat)安装 R 包,用带-Psparkrprofile 的 Maven/SBT 构建 Spark,用bin/sparkR或 RStudio 进入交互环境,按"只改 R 文件即重装测试"的开发节奏配合 R/run-tests.sh 与 R/check-cran.sh 保证质量,最后通过spark-submit在本地或 YARN 集群上运行examples/src/main/r中的示例作业。配套的包元数据(R/pkg/DESCRIPTION)、导出 API(R/pkg/NAMESPACE)与测试用例(R/pkg/tests/fulltests)可作为继续深入 SparkR 源码的第一手资料。

【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址: https://gitcode.com/gh_mirrors/sp/spark

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询