학습일지/kubernetes

KubeCon2018 - Apache Spark on Kubernetes: A Technical Deep Dive

inspirit941 2025. 12. 23. 15:10
반응형

https://youtu.be/5-4X3HylQQo?si=K5sBcyJNptaO4dGx

 

 

 

Yinan Li

  • Software Engineer at Google GKE Workload Team
  • Apache Spark Contributter

스크린샷_2025-12-16_오전_9.29.54

 

스크린샷_2025-12-16_오후_5.19.22



Spark

  • Large Scale Data Processing에서 가장 유명한 프레임워크.
  • 다양한 language 지원.
  • batch, streaming, ML, SQL workload 수행

Kubernetes Submission Client

Spark on Kubernetes는 크게 두 가지 part로 나뉜다.

스크린샷_2025-12-16_오후_5.21.58



  • 처음에 Empty Driver pod Spec이 있다.
  • empty driver에 여러 feature step을 추가한다.
    • step 예시: mounting volumes / secrets / 사용자 정의 env variable 추가...
    • 일종의 customization.
  • 최종 Driver Pod Spec이 만들어지고, k8s의 api server에 pod 생성을 요청한다.
  • k8s scheduler가 Driver Pod을 할당하고, 실행한다.

Kubernetes Scheduler Backend

스크린샷_2025-12-16_오후_5.22.54



Driver Pod 내부에서 실행되는 로직.

  • Executor Pod을 생성, 실행하는 Custom Controller 역할
  • Spark Core: handle task scheduling.
    • executor pod의 lifecycle 관리... pod 이벤트 기반 작업 실행.
  • k8s는 driver pod에서 요청한 executor pod를 생성, 실행 / Network & Logging Support

Under the hood

스크린샷_2025-12-16_오후_5.28.57



  • 사용자가 master node 정보와 driver spec 명시해서 submit 요청
  • k8s가 driver pod 생성 / driver pod는 executor pod 생성을 k8s api에 요청
  • k8s가 executor pod를 노드에 할당.
  • executor pod는 driver pod와 통신. executor pod에서 발생하는 이벤트에 따라 driver pod가 적당한 동작을 취한다.

스크린샷_2025-12-16_오후_5.46.19



Executor Pod가 생성되는 방식은 Driver Pod과 비슷함.

  • Empty Pod Spec 받아서
  • Steps 진행
    • volume mount / access Remote Services (HDFS 같은)...
  • Executor Pod Spec 생성 -> API server에 전달

스크린샷_2025-12-16_오후_5.50.40



yarn이나 다른 scheduler backend에서는 network connectivity가 granted (Native Connectivity). 하지만 k8s는 다른 방식으로 동작함.

  • Executor Pod는 Driver Pod와 FQDN으로 통신.
  • 따라서 ubmission Client 쪽에서 headless Service 방식으로 Driver Pod을 노출함.
    • 장표에 있는 setup Service / endpoint for driver / blockManager가 이 뜻임

스크린샷_2025-12-16_오후_5.55.45

 

스크린샷_2025-12-19_오전_10.17.02

{width=900 height=483}

Dependency Management

  • 보통은 컨테이너 프로세스에 필요한 dependency jar파일 같은 걸 이미지에 포함시키는 custom image
  • 이미지에 포함할 게 아니라면, remote storage에 jar파일을 두고 받아쓰는 형태.

dependency 실행법

  • spark 2.3.x: init container로 다운로드. user-specific location에 다운받을 수 있음.
    • spark maintainer들은 이 방식을 좋아하지 않았음.
  • spark 2.4.x: spark-submit 명령어에 통합.
    • driver container가 spart submit을 client mode로 실행할 때, 필요한 외부 dependency를 가져오는 방식.

스크린샷_2025-12-23_오후_2.51.27



spark 2.4 기준 features

  • Java, Python, Scala, R support
  • Static Resource Allocation: executor가 할당받을 자원을 미리 설정할 수 있음. can't change at runtime.
  • driver / executor customize
    • hard CPU / Memory Limit 지원. (fractional CPU 사용 가능한게 YARN과 Mesos 대비 차이점)
    • 기타 k8s native 기능.

스크린샷_2025-12-23_오후_2.51.33



Client Mode (2.4) (2.3버전이 나왔을 때부터 요청했던 요구사항)

  • interactive application (jupyter notebook)
  • 사용자가 driver pod을 inside / outside cluster 선택할 수 있다.
    • 단, outside cluster일 경우 network 설정은 본인이 해야 함. (executor pod과 통신할 수 있게) 이게 불가능한 환경도 있을 거다.
  • jupyter notebook 같은 걸 pod로 실행하면...
    • in-cluster pod이면 network 설정은 쉬워질 수 있음
    • submission client가 실행되지 않기 때문에, headless service같은 건 직접 해야 함.
      • 따라서 driver pod가 생성될 때 붙을 label 가지고 미리 label selector기반 headless service를 배포해둬야 함

스크린샷_2025-12-23_오후_3.01.40

 

스크린샷_2025-12-23_오후_3.01.45

 

스크린샷_2025-12-23_오후_3.04.12



3.0에서는 kerberos 인증 / kubernetes Operator 지원할 예정

  • application-level metrics / driver, executor metrics to Prometheus
  • sparkConf 외에도, pod template 기반으로 customize 지원할 예정.
반응형