我在Kubernetes上启动了一些Spark作业,其中包含大量数据,但作业失败,因为/ var / data / spark-xxx目录中没有足够的空间。
如Spark文档在https://github.com/apache/spark/blob/master/docs/running-on-kubernetes.md
上所述Spark使用临时暂存空间将数据溢出到磁盘上 随机播放和其他操作。使用Kubernetes作为资源时 管理器,将使用已安装的emptyDir卷创建吊舱 SPARK_LOCAL_DIRS中列出的每个目录。如果没有目录 明确指定,然后创建默认目录并 配置正确
好像 / var / data / spark-xx 目录是emptyDir的默认目录。因此,我尝试将emptyDir映射到已经映射到Driver and Executors Pod的Volume(具有更大的空间)。
我将其映射到属性文件中,并且可以看到它已安装在外壳中:
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挂载到我的持久性存储上,这样我就可以溢出更多数据并避免作业失败?
答案 0 :(得分:1)
我发现spark 3.0已经考虑了此问题并完成了该功能。
Spark支持使用卷在随机播放和其他操作期间溢出数据。要将卷用作本地存储,该卷的名称应以
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
参考:
答案 1 :(得分:0)
您可以将/var/data
挂载到Persistent Volume,然后此路径下的所有emptyDir挂载将具有足够的大小。下面的示例pod yaml可以正常工作:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
- mountPath: /test-pd/cache
name: cache-volume
volumes:
- name: test-volume
# This GCE PD must already exist.
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
- name: cache-volume
emptyDir: {}