Spark) spark volume data spill 이슈_spark-local-dir
한줄요약: spark-local-dir 로 실행안하는 사용자들 어칼까.. 이러다 다 죽음 ㅜㅜ
요약
- spark-submit의 대량 read 작업시 spark job이 죽음
- 대량 작업이라 data spill 관련 문제로 추정
- spark-local-dir 을 이용해 해결
설명
1. spark-submit의 대량 read 작업시 spark job이 죽음
2. 대량 작업이라 data spill 관련 문제로 추정
예전에 airflow로 잡돌릴 때, pvc 를 생성해서 해결해줬던 것으로 기억
(이름을 spark-loca-dir로 만들어주면 되는 것)
https://mightytedkim.tistory.com/43
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