首页 > 解决方案 > 如何在 Kubernetes 上读取 spark-submit 上传的文件

问题描述

我在 Yarn 上运行 Spark Jobs。这些天我正在迁移到 Kubernetes 上的 Spark。

在 Kubernetes 上我遇到了一个问题:--files通过 Spark 驱动程序无法读取通过上传的文件。

在 Yarn 上,如许多答案中所述,我可以使用Source.fromFile(filename).

但我无法在 Kubernetes 上的 Spark 中读取文件。

执行上述命令后,app.conf上传到hdfs://<nameservice>/path/to/sparkUploads/spark-upload-xxxxxxx/,

在 Driver 的 pod 中,我app.conf也在/tmp/spark-******/目录中找到app.jar

但是Driver无法读取app.confSource.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.confapp.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 - 变通

标签: scalaapache-sparkkubernetes

解决方案


--files应使用SparkFiles.get实用程序访问文件:

获取(文件名:字符串):字符串

获取通过添加的文件的绝对路径SparkContext.addFile()


推荐阅读