在k8s上执行Spark-emptyDir未安装到目录

时间:2019-02-26 09:54:56

标签: apache-spark kubernetes

我在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挂载到我的持久性存储上,这样我就可以溢出更多数据并避免作业失败?

2 个答案:

答案 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: {}