scala - 如何在 Kubernetes 上读取 spark-submit 上传的文件
问题描述
我在 Yarn 上运行 Spark Jobs。这些天我正在迁移到 Kubernetes 上的 Spark。
在 Kubernetes 上我遇到了一个问题:--files
通过 Spark 驱动程序无法读取通过上传的文件。
在 Yarn 上,如许多答案中所述,我可以使用Source.fromFile(filename)
.
但我无法在 Kubernetes 上的 Spark 中读取文件。
- 火花版本:3.0.1
- 斯卡拉版本: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
。
但是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 - 变通
- 首先,我制作 ConfigMaps 来保存我想读取驱动程序/执行程序的文件
- 接下来,将 ConfigMap 安装在驱动程序/执行程序上。要挂载 ConfigMap,请使用Pod 模板或Spark Operator
解决方案
--files
应使用SparkFiles.get实用程序访问文件:
获取(文件名:字符串):字符串
获取通过添加的文件的绝对路径
SparkContext.addFile()
。
推荐阅读
- java - 当你可以做一个接口时,抽象类有什么意义
- postgresql - 使用过滤器在数据库中查找表的子元素(DBeaver)
- wso2 - 注册 iOS 设备时发生密钥库错误
- apache-spark - Scala、IntelliJ 和 Gradle 依赖项
- formula - 总结所有以前的,直到某一点
- c# - 使用反射c#映射两个对象
- react-native - 升级 gradle "gradle-4.1-all.zip" 后应用程序崩溃
- scala - 为什么 IntelliJ IDEA 不能识别标准函数和 $s?
- c++ - 如何为 QListWidget 分配一个特定的数字,以便以后可以修改?
- jquery - 如何使用 puppeteer 抓取网站,包括通过 $.val() 设置的输入字段?