我正在尝试使用 Kubernetes 运行 PySpark Job。主脚本和py文件都托管在Google Cloud存储上。如果我使用独立资源管理器启动作业:
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 映像中的所有文件,但我更喜欢这样做。
这可能吗?我错过了什么吗?
谢谢
因此,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(- 你的
requirements.txt
安装到容器的 python 版本中(在存储库的 Dockerfile 中完成( - 驱动程序脚本(例如:driver.py(
实际上--py-files
可用于将依赖项分发给执行程序。你能显示你得到的错误吗?您是否在主.py中导入拉链(SparkContext.addPyFile
(?
ENV:火花 2.4.3
更新的答案:
在 https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management,文档说:
请注意,目前尚不支持使用提交客户端本地文件系统中的应用程序依赖项。
较旧的答案:
我面临着同样的问题。我不认为 --py-files 中的文件会分发给驱动程序和执行器。我使用以下命令向 K8s 集群提交一个 python 文件:
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
我在驱动程序 pod 中获得了日志:
+ 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发生了变化,但错误是相同的。
我通过以下方式将 pvc 安装到容器上persistentVolumeClaim
在提交 Spark 应用程序之前,先将 -py 文件下载到 pv(如 glusterfs(,spark on k8s
不会为您下载它,
spark on yarn
驱动程序和执行器将使用spark.yarn.archive
参数为您下载文件
sh bin/spark-submit
--master k8s://https://xxx:6443
--deploy-mode cluster
--conf spark.kubernetes.namespace=spark
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark
--conf spark.kubernetes.container.image=xxx/spark:latest
--conf spark.kubernetes.container.image.pullPolicy=Always
--conf spark.eventLog.dir=/xxx/spark-eventlog
--conf spark.eventLog.enabled=true
--conf spark.executor.instances=1
--conf spark.executor.memory=1024m
--conf spark.driver.memory=1024m
--conf spark.kubernetes.driver.request.cores=1
--conf spark.kubernetes.executor.request.cores=1
--name spark-demo
--py-files local:///xxx/spark_utils.zip
/xxx/pyspark_demo.py
当我用 spark-2.4.8 和 Hadoop 2.6.0-CDH5.16.1 进行测试时--py-files
正在工作,它传递给PYTHONPATH
并在 Dockerfile 中
ENV PYTHONPATH ${SPARK_HOME}/python/lib/pyspark.zip:${SPARK_HOME}/python/lib/py4j-*.zip
所以像这样生成火花提交
'PYTHONPATH': '/opt/spark/python/lib/pyspark.zip:/opt/spark/python/lib/py4j-0.10.7-src.zip:/opt/spark/jars/spark-core_2.11-2.4.8.jar:/opt/spark/python/lib
/pyspark.zip:/opt/spark/python/lib/py4j-*.zip:file:/xxx/spark_utils.zip',