'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

Data/Spark

Spark) spark volume data spill 이슈_spark-local-dir

MightyTedKim 2022. 3. 21. 15:22
728x90
반응형

한줄요약: spark-local-dir 로 실행안하는 사용자들 어칼까.. 이러다 다 죽음 ㅜㅜ

요약

  1. spark-submit의 대량 read 작업시 spark job이 죽음
  2. 대량 작업이라 data spill 관련 문제로 추정
  3. spark-local-dir 을 이용해 해결

설명

1. spark-submit의 대량 read 작업시 spark job이 죽음

2. 대량 작업이라 data spill 관련 문제로 추정

예전에 airflow로 잡돌릴 때, pvc 를 생성해서 해결해줬던 것으로 기억

(이름을 spark-loca-dir로 만들어주면 되는 것)

https://mightytedkim.tistory.com/43

 

(Kubernetes) k8s와 Airflow 이용한 spark작업_SparkKubernetesOperator

요약 1. kubenetes 환경에서 airflow를 이용해 spark_submit을 함 2. SparkKubernetesOpertor(SKO)를 선택함 개요 상황 쿠버네티스 클러스터 환경에서 spark_submit 관리 필요 후보 (3가지) KubernetePodOperato..

mightytedkim.tistory.com

 

3. spark-local-dir 을 이용해 해결

AS-IS

spark.kubernetes.executor.volumes.persistentVolumeClaim.data.options.claimName", "OnDemand"

###
$ k describe pod/test-spark-9077be7fa7a8dbbc-exec-6 -n spark
Volumes:
  data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  test-spark-9077be7fa7a8dbbc-exec-6-pvc-0
    ReadOnly:   false
  spark-local-dir-1:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>

TO-BE

   .config("spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-hgkim.options.claimName", "OnDemand") \
    .config("spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-hgkim.options.storageClass", "rook-ceph-block") \
    .config("spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-hgkim.options.sizeLimit", "10Gi") \
    .config("spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-hgkim.mount.path", "/opt/spark-scratch") \
    .config("spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-hgkim.mount.readOnly", "false") \

###
# empty-dir이 없다는 것을 확인
$k describe pod/hgkim-exec-1 -n spark-operator
  spark-local-dir-hgkim:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  hgkim-7aa9417fa9e191b1-exec-1-pvc-0
    ReadOnly:   false

더 이상 data spill이 일어나지 않음

기타

공식 문서에서도 scratch space를 이용하는 방법에 대해서 알려준다.

Using Volume For Scratch Space

By default, Spark uses temporary scratch space to spill data to disk during shuffles and other operations. The scratch directory defaults to /tmp of the container. If that storage isn't enough or you want to use a specific path, you can use one or more volumes. The volume names should start with spark-local-dir-.

spec:
  volumes:
    - name: "spark-local-dir-1"
      hostPath:
        path: "/tmp/spark-local-dir"
  executor:
    volumeMounts:
      - name: "spark-local-dir-1"
        mountPath: "/tmp/spark-local-dir"
    ...

Then you will get SPARK_LOCAL_DIRS set to /tmp/spark-local-dir in the pod like below.

참고

-https://www.slideshare.net/databricks/apache-spark-on-k8s-best-practice-and-performance-in-the-cloud 

728x90
반응형