【问题标题】:How to set ephemeral-storage in Spark with Kubernetes如何使用 Kubernetes 在 Spark 中设置临时存储
【发布时间】:2019-05-02 17:20:59
【问题描述】:

在使用 Kubernetes 集群运行 Spark 作业时,我们收到以下错误:

2018-11-30 14:00:47 INFO  DAGScheduler:54 - Resubmitted ShuffleMapTask(1, 58), so marking it as still running.
2018-11-30 14:00:47 WARN  TaskSetManager:66 - Lost task 310.0 in stage 1.0 (TID 311, 10.233.71.29, executor 3): ExecutorLostFailure (executor 3 exited caused by one of the running tasks) Reason: 
The executor with id 3 exited with exit code -1.
The API gave the following brief reason: Evicted
The API gave the following message: The node was low on resource: ephemeral-storage. Container executor was using 515228Ki, which exceeds its request of 0. 
The API gave the following container statuses:

如何配置作业以便我们可以增加每个容器的临时存储大小?

我们使用 spark 2.4.0 和 Kubernetes 1.12.1

spark提交选项如下

--conf spark.local.dir=/mnt/tmp \
--conf spark.executor.instances=4 \
--conf spark.executor.cores=8 \
--conf spark.executor.memory=100g \
--conf spark.driver.memory=4g \
--conf spark.driver.cores=1 \
--conf spark.kubernetes.memoryOverheadFactor=0.1 \
--conf spark.kubernetes.container.image=spark:2.4.0 \
--conf spark.kubernetes.namespace=visionlab \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image.pullPolicy=Always \
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.myvolume.options.claimName=pvc \
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.myvolume.mount.path=/mnt/ \
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.myvolume.mount.readOnly=false \
--conf spark.kubernetes.executor.volumes.persistentVolumeClaim.myvolume.options.claimName=pvc \
--conf spark.kubernetes.executor.volumes.persistentVolumeClaim.myvolume.mount.path=/mnt/ \
--conf spark.kubernetes.executor.volumes.persistentVolumeClaim.myvolume.mount.readOnly=false

【问题讨论】:

  • 您能否为部署提供 .yaml 文件? API 通知node was low on resource,您尝试附加更多空间吗?
  • 问题是executor pods在根/var/data/spark-1b1495d5-ad6d-4a56-92cd-b10eb81e28fe创建了一个emptyDir来存储计算结果。我们节点的根节点确实有足够的空间,我们需要将SPARK_LOCAL_DIRS 设置为另一个位置,但我们不知道该怎么做?

标签: apache-spark kubernetes


【解决方案1】:

看起来您的工作可能是在临时存储的 pod 中请求 0。如果您查看docs,您会发现临时存储是节点上根磁盘的一部分。因此,您可以尝试指定 hostPath 挂载。

我的猜测是 PVC 发生了一些事情,并且容器正在使用临时卷,或者如果您指定卷,则可能需要 hostPath 和 PVC(对于/mnt/tmp)。我会检查:

$ kubectl describe pvc
$ kubectl describe pv

在撰写本文时,Spark Driver 中没有选项可以发布 Kubernetes Request 以限制临时存储。

【讨论】:

  • 我尝试将每个执行程序的 /tmp 映射到具有 hostPath 的节点上的本地卷,但似乎没有任何效果。
  • 如果我的 PCV 上没有足够的空间,您认为会发生这种情况吗?
  • 到目前为止,我的理解是 SPARK_LOCAL_DIRS 附加到一个 emptyDir 并且需要一个临时存储。有没有办法改变这种行为并将其附加到 hostPath ?
【解决方案2】:

正如@Rico 所说,从 spark 2.4.3 开始,无法通过驱动程序配置设置临时存储限制。相反,您可以使用 LimitRange 为命名空间中的所有新 pod 设置临时存储限制:

apiVersion: v1
kind: LimitRange
metadata:
  name: ephemeral-storage-limit-range
spec:
  limits:
  - default:
      ephemeral-storage: 8Gi
    defaultRequest:
      ephemeral-storage: 1Gi
    type: Container

这会将默认值应用于在 LimitRange 的命名空间中创建的执行程序:

$ kubectl get pod spark-kub-1558558662866-exec-67 -o json | jq '.spec.containers[0].resources.requests."ephemeral-storage"'
"1Gi"

这有点笨拙,因为它将默认值应用于您命名空间中的所有容器,但如果您的工作负载是统一的,它可能是一个解决方案。

【讨论】:

    【解决方案3】:

    遇到了同样的问题,但我能够升级到 Spark 3.x,您可以在其中提供 Pod Template

    --conf spark.kubernetes.executor.podTemplateFile=my_pod_template.yml
    

    您可以在其中设置临时存储请求

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mycontainer
        image: myimage:latest
        resources:
          requests:
            ephemeral-storage: "50Gi"
    

    【讨论】:

      【解决方案4】:

      这是因为您的 spark 作业没有足够的存储空间来存储临时缓存数据

      首先您需要检查您的 pod 部署,以确定将用于挂载的卷名,例如 spark-local-dir-1 然后进入你的spark executor pod,打印出$SPARK_LOCAL_DIR来识别当前临时spark数据位置的位置,在你的配置中用"spark.local.dir": "/tmp/spark-temp/"修改路径(改变$SPARK_LOCAL_DIR),最后用现有的pvc挂载你的目录声明(注意提供大存储空间,例如100GB)。以下代码是在 kubernetes 上提交作业时的 spark 配置。

      "spark.kubernetes.driver.volumes.persistentVolumeClaim.spark-local-dir-1.options.claimName": "spark-temp-local",
      "spark.kubernetes.driver.volumes.persistentVolumeClaim.spark-local-dir-1.mount.path": "/tmp/spark-temp",
      "spark.kubernetes.driver.volumes.persistentVolumeClaim.spark-local-dir-1.mount.readOnly": "false",
      
      "spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.options.claimName": "spark-temp-local",
      "spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.mount.path": "/tmp/spark-temp",
      "spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.mount.readOnly": "false",
      "spark.local.dir": "/tmp/spark-temp/"
      

      【讨论】:

        猜你喜欢
        • 2019-06-09
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 1970-01-01
        相关资源
        最近更新 更多