Spark Kubernetes 是否支持 --py-files 参数



我正在尝试使用 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',

最新更新