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.session、sparkR.session.stop、sparkR.version、sparkR.uiWebUrl; - DataFrame 操作:
read.df、write.df、createDataFrame、select、filter、join、groupBy、collect等 S4 方法; - SQL 接口:
sql、tableToDF、createOrReplaceTempView等; - MLlib 集成:
spark.glm、spark.kmeans、spark.randomForest、spark.gbt、spark.als、spark.naiveBayes、spark.survreg等机器学习算法; - 列级函数:数百个
Column方法(如when、cast、window、from_json、to_json等),覆盖类型转换、日期处理、JSON、窗口函数等场景; - 流式查询:
read.stream、write.stream、awaitTermination、isActive等 Structured Streaming 相关接口; - 底层 JVM 互操作:
sparkR.newJObject、sparkR.callJMethod、sparkR.callJStatic。
整套 API 的源码位于 R/pkg/R 目录下,其中DataFrame.R、functions.R、mllib_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子目录应包含R与RScript可执行文件):
# 其中 /home/username/R 是 R 的安装目录,/home/username/R/bin 包含 R 和 RScript export R_HOME=/home/username/R ./install-dev.sh从 R/install-dev.sh 源码看,脚本的核心执行逻辑为:
- 通过
find-r.sh定位 R 可执行文件(R/find-r.sh 会优先读取R_HOME/bin,否则回退到which R,找不到时报错退出); - 调用
create-rd.sh预生成 Rd 文档; - 执行
R CMD INSTALL --library="$FWDIR/lib" "$FWDIR/pkg/"将R/pkg目录下的包源码安装到R/lib; - 将安装好的
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。其中特意先pushd到R\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声明的testthat、e1071、survival、arrow (>= 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 运行既有测试。从该脚本源码可见其测试链路:
- 先查找
connector/avro构建出的spark-avrojar,若存在则通过--jars附带; - 调用
bin/spark-submit提交 R/pkg/tests/run-all.R 执行全部测试,并设置SPARKR_SUPPRESS_DEPRECATION_WARNING=1、SPARK_TESTING=1、NOT_CRAN=true等环境变量,同时通过--driver-java-options "-Dlog4j.configurationFile=file:$FWDIR/log4j2.properties"指定日志配置(即 R/log4j2.properties),并通过--conf spark.driver.extraJavaOptions="-Xss4M"、--conf spark.executor.extraJavaOptions="-Xss4M"调大线程栈; - 之后还会调用 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.R、test_mllib_classification.R、test_streaming.R),新增功能的单测通常放在这里,然后再由run-all.R统一调度。
生成 SparkR 文档
SparkR 的 Rd 文档与 HTML 文档不属于源码仓库的一部分,需要自行生成。运行脚本 R/create-docs.sh 即可:
./R/create-docs.sh该脚本依赖roxygen2、knitr、rmarkdown以及pkgdown,使用前需确保这些 R 包已安装(脚本注释中明确列出了这些前置依赖)。脚本会依次:
- 调用
install-dev.sh安装包并生成 Rd 文件; - 在
R/pkg/html目录下用knitr::knit_rd("SparkR", ...)渲染 HTML 文档; - 从 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.R、RSparkSQLExample.R、data-manipulation.R,以及ml/与streaming/子目录下的机器学习与流式示例。
运行示例使用./bin/spark-submit <filename> <args>:
./bin/spark-submit examples/src/main/r/dataframe.RSparkR 的单元测试则按官方 "Running R Tests" 一节说明执行,仓库中对应脚本为 R/run-tests.sh。如前文所述,它会通过 spark-submit 提交R/pkg/tests/run-all.R并以 CRAN 检查作为补充,日志分别写入R/unit-tests.out与R/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),仅供参考