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

时间:2019-04-11 16:45:13

标签: apache-spark kubernetes pyspark

我正在尝试使用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映像中的所有文件,但我更喜欢这样做。

这可能吗?我想念什么吗?

谢谢

3 个答案:

答案 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中完成)
  • 驱动程序脚本(例如:driver.py)