首页 > 解决方案 > k8s上的Spark-emptyDir未安装到目录

问题描述

我在 Kubernetes 上启动了一些具有大量数据的 Spark 作业,但作业失败,因为 /var/data/spark-xxx 目录中没有足够的空间。

正如 Spark 文档在https://github.com/apache/spark/blob/master/docs/running-on-kubernetes.md上所说

Spark 在 shuffle 和其他操作期间使用临时暂存空间将数据溢出到磁盘。当使用 Kubernetes 作为资源管理器时,将创建 pod 并为 SPARK_LOCAL_DIRS 中列出的每个目录安装一个 emptyDir 卷。如果没有明确指定目录,则创建并适当配置默认目录

似乎 /var/data/spark-xx目录是 emptyDir 的默认目录。因此,我尝试将 emptyDir 映射到已经映射到 Driver 和 Executors Pod 的 Volume(空间更大)。

我将它映射到属性文件中,我可以看到它已安装在 shell 中:

spark.kubernetes.driver.volumes.persistentVolumeClaim.checkvolume.mount.path=/checkpoint
spark.kubernetes.driver.volumes.persistentVolumeClaim.checkvolume.mount.readOnly=false
spark.kubernetes.driver.volumes.persistentVolumeClaim.checkvolume.options.claimName=sparkstorage
spark.kubernetes.executor.volumes.persistentVolumeClaim.checkvolume.mount.path=/checkpoint
spark.kubernetes.executor.volumes.persistentVolumeClaim.checkvolume.mount.readOnly=false
spark.kubernetes.executor.volumes.persistentVolumeClaim.checkvolume.options.claimName=sparkstorage

我想知道是否可以在我的持久存储上以某种方式安装 emptyDir,这样我就可以溢出更多数据并避免工作失败?

标签: apache-sparkkubernetes

解决方案


我发现spark 3.0已经考虑了这个问题,并且已经完成了这个特性。

Spark 支持在 shuffle 和其他操作期间使用卷来溢出数据。要将卷用作本地存储,卷的名称应以 开头spark-local-dir-,例如:

--conf spark.kubernetes.driver.volumes.[VolumeType].spark-local-dir-[VolumeName].mount.path=<mount path>
--conf spark.kubernetes.driver.volumes.[VolumeType].spark-local-dir-[VolumeName].mount.readOnly=false

参考:


推荐阅读