apache-spark - 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,这样我就可以溢出更多数据并避免工作失败?
解决方案
我发现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
参考:
推荐阅读
- angular - Angular 4 与 @angular/material 的兼容性
- apache-kafka - Flink Kafka Producer 元素乱序
- jquery - jquery在鼠标悬停时每次更改img
- javascript - 将 rails 表单变量传递给咖啡脚本
- java - ArrayLIst 保持为空并且不在 android studio 中添加 jsoup 解析的元素
- r - 操作数据框(使用 R)
- arduino - 在 Arduino 中使用 for 循环锁定用户
- android - Android 存储库模式
- google-compute-engine - 如何使用 Terraform 在我的 Google 计算实例上公开额外的端口?
- r - 对于 R 中需要很长时间才能完成的循环