我在 Yarn 上运行 Spark 作业。这些天我正在转向 Kubernetes 上的 Spark。
在 Kubernetes 上我遇到了一个问题:通过 --files
上传的文件Spark Driver 无法读取。
在 Yarn 上,如许多答案中所述,我可以使用 Source.fromFile(filename)
读取这些文件.
但我无法在 Kubernetes 上的 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 中,我找到了 app.conf
在 /tmp/spark-******/
目录,app.jar
但驱动程序无法读取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
属性包含在系统类路径中。
我找到了 SPARK-31726: Make spark.files available in driver with cluster deploy mode on kubernetes
更新2
我发现驱动程序 pod 的 /opt/spark/work-dir/
目录包含在类路径中。
但是/opt/spark/work-dir/
在 driver pod 上是空的,而在 executor 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 - 解决方法
- 首先,我制作 ConfigMaps 来保存我想要读取驱动程序/执行程序的文件
- 接下来,将 ConfigMap 挂载到驱动程序/执行程序上。要安装 ConfigMap,请使用 Pod Template或 Spark Operator
最佳答案
--files
文件应该使用 SparkFiles.get 访问效用:
get(filename: String): String
Get the absolute path of a file added through
SparkContext.addFile()
.
关于scala - Kubernetes上如何读取spark-submit上传的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65353164/