如何通过R客户端连接运行Cloudera CDH的Spark集群
嘿,刚好我之前在CDH集群环境里折腾过SparkR的远程连接,给你梳理下这两个问题的答案:
1. 是否需要在集群所有节点安装SparkR?
完全不需要!CDH在部署Spark的时候,已经把SparkR的依赖包打包在Spark的安装目录里了(一般路径是/opt/cloudera/parcels/CDH/lib/spark/R)。
你只需要保证集群的网关节点/Spark客户端节点有可用的R环境,并且能访问到这个Spark目录就行。如果是YARN模式运行Spark,NodeManager节点会自动在作业运行时从Spark的共享目录加载SparkR依赖,不需要在每个节点单独安装。
2. 如何配置SparkR连接CDH集群?
分两种场景给你说,看你哪种更方便:
场景一:本地笔记本直接连接集群(YARN Client模式)
这种方式需要你的笔记本能和集群的YARN ResourceManager、NodeManager互通(比如在同一个内网,或者端口映射没问题),步骤如下:
- 准备SparkR包:如果本地R没有安装SparkR,从集群的
${SPARK_HOME}/R/lib目录把SparkR包复制到本地R的library目录,或者直接在R里用install.packages("${SPARK_HOME}/R/lib/SparkR", repos = NULL, type = "source")安装。 - 设置环境变量:在本地R里指定集群的Spark路径(注意是集群上的路径,不是本地的):
Sys.setenv(SPARK_HOME = "/opt/cloudera/parcels/CDH/lib/spark") - 初始化SparkSession:用YARN模式连接,关键是要让集群能访问到你的本地Driver:
library(SparkR) sparkR.session( master = "yarn", appName = "Local-SparkR-CDH-Test", sparkConfig = list( spark.driver.host = "你的笔记本内网IP", # 必须是集群能ping通的IP spark.driver.port = "4040", # 自定义一个集群能访问的端口 spark.yarn.jars = "local:/opt/cloudera/parcels/CDH/lib/spark/jars/*.jar" ) ) - 验证连接:跑个简单的测试代码:
如果能正常输出数据,说明连接成功了。test_df <- createDataFrame(data.frame(id = 1:3, val = c("x", "y", "z"))) showDF(test_df)
场景二:在集群网关节点运行SparkR(更稳定)
如果本地和集群的网络互通有问题,直接在集群的网关节点操作会更省心:
- 登录到集群的网关节点,确保已经安装了R(可以通过Cloudera Manager部署R服务,或者手动安装兼容版本)。
- 设置环境变量:
export SPARK_HOME=/opt/cloudera/parcels/CDH/lib/spark export PATH=$SPARK_HOME/bin:$PATH - 启动R,初始化SparkSession:
这种方式不需要考虑本地和集群的网络问题,所有作业都在集群内部运行,权限也更容易管理。library(SparkR) sparkR.session(master = "yarn", appName = "Gateway-SparkR-Job")
额外提醒
- 注意R版本兼容:CDH的SparkR一般支持R 3.x系列,别用太新的R版本,容易出依赖问题。
- 如果集群开启了Kerberos认证,先在终端执行
kinit 你的用户名@你的Kerberos域获取票据,然后在sparkConfig里加上:spark.yarn.principal = "你的用户名@你的Kerberos域", spark.yarn.keytab = "/path/to/你的keytab文件"
内容的提问来源于stack exchange,提问作者User




