[英]Spark on k8s - emptyDir not mounted to directory
我在 Kubernetes 上啟動了一些具有相當大數據量的 Spark 作業,但作業失敗了,因為 /var/data/spark-xxx 目錄中沒有足夠的空間。
正如 Spark 文檔在https://github.com/apache/spark/blob/master/docs/running-on-kubernetes.md 上所說
Spark 使用臨時暫存空間在 shuffle 和其他操作期間將數據溢出到磁盤。 當使用 Kubernetes 作為資源管理器時,將為 SPARK_LOCAL_DIRS 中列出的每個目錄安裝一個 emptyDir 卷來創建 pod。 如果未明確指定目錄,則會創建並適當配置默認目錄
似乎/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
參考:
您可以將/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: {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.