PySpark on Kubernetes:如何让驱动Pod读取Python文件?
解决方案:让PySpark Driver Pod读取本地Python文件
你的核心问题是执行spark-submit的Driver Pod(即通过kubectl run启动的apache-spark-client Pod)无法访问本地的test.py文件,以下是几种可行的解决方法:
1. 挂载本地文件到Driver Pod
直接通过kubectl run的--volume参数,把本地的test.py绑定挂载到Pod内部的Spark工作目录:
kubectl run --namespace apache-spark apache-spark-client --rm --tty -i --restart='Never' \ --volume type=bind,source=/你的本地绝对路径/test.py,target=/opt/bitnami/spark/test.py \ --image docker.io/bitnami/spark:3.1.2-debian-10-r44 \ -- spark-submit --master spark://10.120.112.210:30077 \ test.py
- 替换
/你的本地绝对路径/test.py为你电脑上test.py的实际路径 - 挂载后,Pod内的
/opt/bitnami/spark目录下会出现test.py,spark-submit即可正常读取
2. 先上传文件到Pod再执行任务
如果挂载方式不适用,可以先启动交互式Pod,再通过kubectl cp上传文件:
- 启动交互式Pod:
kubectl run --namespace apache-spark apache-spark-client --rm --tty -i --restart='Never' \ --image docker.io/bitnami/spark:3.1.2-debian-10-r44 -- bash - 打开另一个终端,执行文件上传命令:
kubectl cp /你的本地绝对路径/test.py apache-spark/apache-spark-client:/opt/bitnami/spark/test.py - 回到交互式Pod的终端,执行
spark-submit:spark-submit --master spark://10.120.112.210:30077 test.py
3. 使用分布式存储(推荐长期复用场景)
如果你的Spark集群接入了HDFS、NFS等分布式存储,把test.py上传到分布式存储路径,然后直接用该路径执行spark-submit:
kubectl run --namespace apache-spark apache-spark-client --rm --tty -i --restart='Never' \ --image docker.io/bitnami/spark:3.1.2-debian-10-r44 \ -- spark-submit --master spark://10.120.112.210:30077 \ hdfs:///path/to/test.py
这种方式下Driver和Worker都能访问到文件,无需单独处理每个Pod的文件挂载。
4. 用--py-files参数上传文件(Cluster模式适用)
如果使用Cluster模式(Driver运行在Spark集群的Worker节点上),可以通过--py-files把test.py作为依赖包上传到集群:
kubectl run --namespace apache-spark apache-spark-client --rm --tty -i --restart='Never' \ --volume type=bind,source=/你的本地绝对路径/test.py,target=/opt/bitnami/spark/test.py \ --image docker.io/bitnami/spark:3.1.2-debian-10-r44 \ -- spark-submit --master spark://10.120.112.210:30077 \ --deploy-mode cluster \ --py-files test.py \ test.py
- 同样需要先把
test.py挂载到执行spark-submit的Client Pod中,才能完成上传 - Cluster模式下Driver会在集群Worker节点启动,
--py-files会自动把文件分发到Driver和Worker
补充说明
你之前挂载Worker可见的卷无效,是因为当前使用的是Client模式(Spark默认模式):Driver进程运行在你通过kubectl run启动的apache-spark-client Pod里,而非Worker节点上,所以Worker的卷挂载对Driver Pod不生效。
内容的提问来源于stack exchange,提问作者mxcolin
相关产品推荐
相关产品推荐

