我正在尝试使用Kubernetes运行PySpark作业。主脚本和py文件都托管在Google云存储中。 如果我使用独立资源管理器启动Job:
spark-submit \
--master local \
--deploy-mode client \
--repositories "http://central.maven.org/maven2/" \
--packages "org.postgresql:postgresql:42.2.2" \
--py-files https://storage.googleapis.com/foo/some_dependencies.zip \
https://storage.googleapis.com/foo/script.py some args
工作正常。 但是,如果我使用Kubernetes尝试相同的操作:
spark-submit \
--master k8s://https://xx.xx.xx.xx \
--deploy-mode cluster \
--conf spark.kubernetes.container.image=gcr.io/my-spark-image \
--repositories "http://central.maven.org/maven2/" \
--packages "org.postgresql:postgresql:42.2.2" \
--py-files https://storage.googleapis.com/foo/some_dependencies.zip \
https://storage.googleapis.com/foo/script.py some args
然后运行主脚本,但无法在依赖项文件中找到模块。 我知道我可以复制Docker映像中的所有文件,但我更喜欢这样做。
这可能吗?我想念什么吗?
谢谢
答案 0 :(得分:0)
实际上,--py-files
可用于将依赖项分发给执行者。您能显示得到的错误吗?您是否将zip(SparkContext.addPyFile
)导入到主.py文件中?
答案 1 :(得分:0)
ENV: 星火2.4.3
更新后的答案:
在https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management中,文档说:
请注意,当前尚不支持使用来自提交客户端本地文件系统的应用程序依赖项。
较大答案:
我正面临着同样的问题。我认为--py-files中的文件不会分发给驱动程序和执行程序。 我使用以下命令将python文件提交到K8s集群:
bin/spark-submit \
--master k8s://https://1.1.1.1:6443 \
--deploy-mode cluster \
--name spark-test \
--conf xxx.com/spark-py:v2.4.3 \
--py-files /xxx/spark-2.4.3-bin-hadoop2.7/spark_test1.py \
http://example.com/spark/__main__.py
我在驱动程序窗格中有日志:
+ PYTHONPATH='/opt/spark/python/lib/pyspark.zip:/opt/spark/python/lib/py4j-*.zip:file:///xxx/spark-2.4.3-bin-hadoop2.7/spark_test1.py'
我收到如下错误:
Traceback (most recent call last):
File "/tmp/spark-5e76171d-c5a7-49c6-acd2-f48fdaeeb62a/__main__.py", line 1, in <module>
from spark_test1 import main
ImportError: No module named spark_test1
从错误中获取主python文件,并将其分发给驱动程序。对于--py-files,PYTHONPATH在我的cmd中包含完全相同的路径,我认为这些文件不会上传到驱动程序pod和执行程序pod中的路径。
我试图将spark_test1.py
从本地路径替换为HTTP URL。 PYTHONPATH发生了明显变化,但错误相同。
答案 2 :(得分:0)
因此,k8s调度程序的思想是将所有内容绝对放入容器中。
因此,您的CI / CD将以Apache Spark kubernetes Docker为基础构建一个Dockerfile,然后在Docker映像中包含python存储库和驱动程序python脚本的压缩副本。像这样:
$ bin/spark-submit \
--master k8s://<k8s-apiserver-host>:<k8s-apiserver-port> \
--deploy-mode cluster \
--py-files local:///path/to/repo/in/container/pyspark-repo.zip \
--conf spark.kubernetes.container.image=pyspark-repo-docker-image:1.0.0 \
local:///path/to/repo/in/container/pyspark-driver.py
您的spark.kubernetes.container.image
应该是完整的应用程序,并带有
--py-files
的回购的zip(例如:repo.zip)requirements.txt
已安装到容器的python版本(在您的存储库的Dockerfile中完成)