【发布时间】:2021-10-01 17:53:57
【问题描述】:
我在 Yarn 上运行 Spark 作业。这些天我正在迁移到 Kubernetes 上的 Spark。
在 Kubernetes 上我遇到了一个问题:通过 --files 上传的文件无法被 Spark 驱动程序读取。
在 Yarn 上,如许多答案中所述,我可以使用 Source.fromFile(filename) 读取这些文件。
但我无法在 Kubernetes 上的 Spark 中读取文件。
- Spark 版本:3.0.1
- Scala 版本:2.12.6
- 部署模式:集群
- 提交命令
$ spark-submit --class <className> \ --name=<jobName> \ --master=k8s://https://api-hostname:6443 \ ... --deploy-mode=cluster \ --files app.conf \ --conf spark.kubernetes.file.upload.path=hdfs://<nameservice>/path/to/sparkUploads/ \ app.jar
执行上述命令后,app.conf被上传到hdfs://<nameservice>/path/to/sparkUploads/spark-upload-xxxxxxx/,
在 Driver 的 pod 中,我在 /tmp/spark-******/ 目录中找到了 app.conf,app.jar 也是如此。
但是Driver无法读取app.conf,Source.fromFile(filename)返回null,没有权限问题。
更新 1
在 Spark Web UI->“环境”选项卡中,spark://<pod-name>-svc.ni.svc:7078/files/app.conf 在“类路径条目”菜单中。这是否意味着app.conf 在类路径中可用?
另一方面,在 Spark on Yarn 中,user.dir 属性包含在 System 类路径中。
我找到SPARK-31726: Make spark.files available in driver with cluster deploy mode on kubernetes
更新 2
我发现驱动程序 pod 的 /opt/spark/work-dir/ 目录包含在类路径中。
但是 /opt/spark/work-dir/ 在驱动程序 pod 上是空的,而在执行程序 pod 上它包含 app.conf 和 app.jar。
我认为这是问题所在,SPARK-31726 对此进行了描述。
更新 3
在阅读了 Jacek 的回答后,我测试了org.apache.spark.SparkFiles.getRootDirectory()。
它返回/var/data/spark-357eb33e-1c17-4ad4-b1e8-6f878b1d8253/spark-e07d7e84-0fa7-410e-b0da-7219c412afa3/userFiles-59084588-f7f6-4ba2-a3a3-9997a780af24
更新 4 - 解决方法
- 首先,我制作 ConfigMap 来保存我想读取驱动程序/执行程序的文件
- 接下来,将 ConfigMap 挂载到驱动程序/执行程序上。要挂载 ConfigMap,请使用 Pod Template 或 Spark Operator
【问题讨论】:
标签: scala apache-spark kubernetes