Skip to content
cover-dataengineering

Spark on Kubernetes: 스팟 인스턴스 사용을 위한 기능들

  • DataEngineering

📅 July 23, 2022

⏱️3 min read

스팟 인스턴스 유형을 사용하면 온디맨드에 비해 70~90%의 비용을 절감할 수 있습니다. 하지만 스팟 인스턴스는 가격 입찰, 가용성 등 여러 이유로 중단될 수 있습니다. 따라서 스팟 인스턴스를 사용한다면 노드가 중단되는 상황에 대비할 수 있어야 합니다. 이 글에서는 Spark on Kubernetes를 스팟 인스턴스 위에서 안정적으로 운영하기 위해 필요한 설정들을 정리해보려 합니다.



driver는 on-demand에 할당하기

중단된 노드에 있던 driver pod가 종료되는 경우, Spark 작업은 실패하게 됩니다. executor pod가 종료되는 경우, 캐시된 데이터 또는 셔플 파일을 잃게 되지만 새로운 executor를 통해 이를 다시 계산하기 때문에 전체 작업이 실패하지는 않습니다.

위와 같은 이유로 driver는 온디맨드 인스턴스에 할당하는 것이 안전합니다. 노드 그룹을 분리하고 nodeSelector를 활용한다면 driver는 온디맨드에서, executor는 스팟에서 실행하도록 설정할 수 있습니다.



적절한 인스턴스 유형 선택하기

일부 인스턴스 유형은 해당 시점의 spot market 상황에 따라 안정적으로 확보하지 못할 수도 있습니다. 확보를 못하게 되면 executor는 계속 pending 상태에 머무르게 되고 전체 수행시간도 지연됩니다.

사용량에 비해 크기가 큰 인스턴스 유형을 선택했다면, 여러 executor pod가 하나의 노드에 할당됩니다. 이 때 해당 노드가 중단된다면 여러 executor가 종료되므로 재계산에 더 많은 시간이 소요됩니다.

위와 같은 이유로 적절한 인스턴스 유형을 선택하는 것이 spot kill을 줄이는데 도움이 됩니다. Karpenter를 사용한다면, 여러 인스턴스 유형을 지정하여 Pod의 리소스 요청량에 가장 적합한 노드를 프로비저닝 할 수 있습니다. 또한 Instance FleetAllocation Strategy에 따라 가장 안정적으로 확보 가능한 인스턴스 유형을 선택할 수 있습니다.



Spark 3.1: Graceful Executor Decommissioning

Graceful Executor Decommissioning은 Spark 3.1 버전에 추가된 기능입니다. 이 기능을 통해 노드가 중단되더라도 최소한의 손실로 Spark 작업이 지속되도록 설정할 수 있습니다. 이를 사용하려면 먼저 클러스터에 Node Termination Handler가 설치되어 있어야 합니다. Node Termination Handler는 클라우드에 따라 다르게 설치할 수 있도록 지원하고 있습니다.

이제 노드가 중단되었을 때 과정을 아래 그림을 통해 확인해보겠습니다.

spark-decom

  1. 스팟 인스턴스가 중단되기 약 120초 전에 Termination Handler의 notice 발생
  2. driver가 해당 executor를 blacklist에 추가하고 신규 task의 스케줄링을 차단
  3. 중단되는 노드에 있던 캐시된 데이터, 셔플 파일을 다른 노드로 복제
  4. 실패 처리된 task를 이어서 수행 (복제한 파일을 그대로 활용)

위의 과정을 통해 노드가 중단되었을 때 재계산을 최소화 할 수 있습니다.
이 기능에는 다음과 같이 일부 제한 사항도 존재합니다.

120초의 시간 제한이 있기 때문에 옮겨야할 파일이 아주 큰 경우, 일부 파일 손실이 발생할 수 있습니다. 일반적으로 non-SSD 볼륨은 분당 최대 15GB, SSD 볼륨은 35~40GB 까지 가능합니다. 동시에 많은 executor가 spot kill 당하는 경우, 동일한 이유로 파일 손실이 발생할 수 있습니다.

spark.decommission.enabled
spark.storage.decommission.enabled
spark.storage.decommission.rddBlocks.enabled
spark.storage.decommission.shuffleBlocks.enabled

Graceful Executor Decommissioning은 위의 설정을 통해 활성화 할 수 있습니다.



Spark 3.2: Executor PVC Reuse

spark-reuse

Executor PVC Reuse는 Spark 3.2 버전에 추가된 기능입니다. 이 기능을 통해 spot kill 이후에도 동일한 PVC 연결을 통해 셔플 파일을 재사용할 수 있습니다. 이를 사용하려면 먼저 클러스터에 Dynamic PVC에 대한 설정이 필요합니다.

현재는 NVMe 기반의 SSD에서 사용이 어렵다는 제한 사항이 있습니다.
또한 PVC가 즉시 재사용 불가능한 상황이라면 race condition이 발생할 수도 있습니다.

spark.kubernetes.driver.reusePersistentVolumeClaim
spark.kubernetes.driver.ownPersistentVolumeClaim
spark.kubernetes.executor.volumes.persistentVolumeClaim.data.options.*
spark.kubernetes.executor.volumes.persistentVolumeClaim.data.mount.*

Executor PVC Reuse는 위의 설정을 통해 활성화 할 수 있습니다.


Reference

← PrevNext →
  • Powered by Contentful
  • COPYRIGHT © 2020 by @swalloow