YARN集群下spark_apply_bundle的tarball路径及参数配置问询
针对你在YARN集群上使用spark_apply_bundle时遇到的几个问题,我结合实际集群使用经验给你逐一解答:
1. tarball路径能否相对于项目工作目录?
不行。在YARN集群环境下,Driver节点和Worker节点的本地文件系统是相互独立的,你在Driver端项目工作目录下的相对路径,Worker节点根本无法访问到——因为Worker的工作目录和Driver完全不是同一个位置,甚至不在同一台机器上。直接用本地相对路径会导致Worker节点找不到tarball文件,抛出文件不存在的错误。
2. tarball应该存储在HDFS还是其他位置?
优先推荐HDFS,这是YARN集群最通用的选择:
- HDFS是集群所有节点都能访问的分布式文件系统,只要tarball上传到HDFS的某个路径,所有Worker节点都能通过统一的路径访问到它。
- 除此之外,也可以选择集群所有节点都挂载的共享NFS目录,或者云环境下的对象存储(比如S3、ADLS,前提是集群配置了对应的访问权限),但HDFS是最稳定、无需额外配置的方案。
3. sparklyr.shell.files参数应传入什么内容?
这个参数需要传入tarball的绝对路径:
- 如果是HDFS路径,格式可以是
hdfs://<namenode地址>:<端口>/<文件路径>,如果集群配置了默认HDFS命名空间,也可以简化为/user/your_username/your_package.tar.gz(以根目录开头的HDFS路径)。 - 如果是共享NFS目录,就是该目录下tarball的绝对本地路径,比如
/mnt/shared/your_package.tar.gz。
这个参数的作用是告诉Spark在启动时,把指定的tarball文件分发到所有Worker节点的临时工作目录中,这样你在spark_apply的packages参数里,就可以直接用相对路径(比如./your_package.tar.gz)引用这个tarball了——因为文件已经被Spark同步到Worker的当前工作目录下。
示例代码
# 1. 先把tarball上传到HDFS(可以用hdfs命令行或sparklyr的hdfs函数) # hdfs dfs -put ./local_package.tar.gz /user/your_username/ # 2. 连接Spark时配置文件分发 sc <- spark_connect( master = "yarn", config = list( "sparklyr.shell.files" = "/user/your_username/local_package.tar.gz" ) ) # 3. 使用spark_apply时指定packages processed_data <- spark_apply( your_spark_dataframe, function(row) { # 在这里编写需要用到tarball中包的自定义逻辑 row$new_col <- some_function_from_your_package(row$old_col) row }, packages = "./local_package.tar.gz" )
额外注意事项
- 确保tarball的权限设置正确,集群中的Spark用户要有读取权限(HDFS上可以用
hdfs dfs -chmod 644 /path/to/tarball)。 - 如果你的tarball依赖其他系统库,需要确保所有Worker节点都安装了这些依赖,否则自定义函数执行时会报错。
内容的提问来源于stack exchange,提问作者Richard Redding
相关产品推荐
相关产品推荐

