티스토리 뷰

github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/docs/design.md#architecture

 

오역, 오해 주의

 

Introduction

독립 스케쥴러, Mesos, yarn 에 이어 스파크 2.3 부터 쿠버네티스는 스파크의 공식적인 스케쥴러가 되었다.
쿠버네티스 위에 스파크 클러스터를 구성하고, 그 스파크 클러스터에 어플리케이션(이하 앱)을 제출하는 방식과 비교해서, 쿠버네티스 자체를 스케쥴러를 사용하는 것은 여러 중요한 장점이 SPARK-18278 에서 논의되었고 많은 진전이 있었다.

그런데 쿠버네티스에서 실행하기 위해 제출하고, 상태를 추적하는 등의 스파크 앱의 생명주기를 관리하는 방식은 Deployment, DaemonSet, StatefulSet 등의 쿠버네티스에 사용하는 다른 종류의 작업들과는 크게 다르다. 쿠버네티스 오퍼레이터는 이 차이를 줄이고, 스파크앱을 쿠버네티스에 자연스럽게 명세하고, 실행하고 모니터링 할 수 있도록 해준다.

 

특히 이 쿠버네티스 오퍼레이터는 스파크 앱을 관리하기 생명주기를 관리하기 위해 오퍼레이터 패턴을 활용하는 최신 경향을 따른다. 오퍼레이터를 통해, 스파크 제출 절차를 다룰 필요없이 YAML 파일을 작성하여 선언적인 방법으로 스파크 앱을 명세하고 실행할 수 있다. 또한 스파크앱의 상태를 다른 쿠버네티스 작업들과 동일한 방식으로 추적하고 확인할 수 있다. 이 문서는 이 오퍼레이터에의 디자인과 구조에 대해 다룬다. 스파크 앱을 명세하기 위한 구체적인 정의는 API Definition 에 기술되어 있다.

 

Architecture

오퍼레이터는 다음의 것들로 구성된다.

  • SparkApplication controller 제어기
  • submission runner 제출 실행기
  • spark pod monitor 감시기
  • mutating admission webhook 앱 수정을 위한 웹훅
  • sparkctl 커맨드라인도구

사용자는 sparkctl (또는 kubectl) 을 사용해 SparkApplication 오프젝트를 생성한다. controller 는 watcher 를 통해 API 서버에서 이 오브젝트를 받아서 spark-submit 의 인수들을 전달하기 위한 submission 을 submission runner 에 보낸다. submission runner 는 실행할 앱을 제출하고 앱의 드라이버 팟을 생성한다. 드라이버 팟은 시작되고 나서 익스큐터 팟들을 생성한다. 앱이 실행되는 동안에는 spark pod monitor 가 팟들을 감시하고 controller 에 상태를 다시 보낸다.

 

The CRD(CustomResourceDefinition) Controller

SparkApplication controller( 짧게 CRD controller) 는 한 쿠버네티스 클러스터의 모든 네임스페이스 내의 SparkApplication 오브젝트들의 생성, 갱신, 삭제 이벤트를 감시하고 각 이벤트에 따른 동작을 수행한다. 새로운 SparkApplication 오브젝트가 추가되면(  ResourceEventHandlerFuncs 의 AddFunc 콜백함수가 호출되는 경우), 내부 큐에 이 오브젝트를 넣고, 워커들은 이 오브젝트들을 꺼내서 submission 을 준비하고 실제로 클러스터에 제출할 submission runner 에 보낸다. submission 에는 spark-submit 에 필요한 인수들의 목록이 포함되어있다. submission runner 의 제출 워커수는 설정할 수 있다. SparkApplication 오브젝트를 삭제하면, 내부큐에서 제거되고 이 앱과 관련된 모든 쿠버네티스 자원들은 삭제되거나 가비지 컬렉션 된다.

 

SparkApplication 오브젝트가 업데이트되는 경우( ResourceEventHandlerFuncs 의 UpdateFunc 이 호출된 경우), 예를 들어, 사용자가 kubectl apply 를 실행하여 업데이트를 적용했을 때, controller 는 SparkApplicationSpec 내 앱 명세가 변경되었는지 확인한다. 내용이 그대로 동일하다면 controller 는 이 업데이트를 무시한다. 캐시 재동기화에 의한 업데이트 등 앱 명세 변경이 없는 업데이트는 재 제출이 발생하지 않도록 한다. 앱 명세가 변경되었다면 현 실행의 드라이버 팟을 삭제해서 현재 실행을 취소하고 업데이트된 명세로 앱을 새로 실행한다. 드라이버 팟을 삭제하면 해당 실행을 사실상 죽이게 되고, 삭제되는 드라이버 팟이 소유자인 하위 익서큐터 팟들도 삭제되도록 한다.

 

controller 는 pod monitor 와 함께 SparkApplication 오브젝트의 상태를 갱신하는 역할을 한다. pos monitor 는 스파크 팟들을 감시하고 SparkApplication 오브젝트의 SparkApplicationStatus 항목을 업데이트한다. pod monitor 는 스파크 팟의 생성, 갱신, 삭제 이벤트를 탐지하고, 파드의 상태를 담은 상태 갱신 메시지를 생성한 다음 controller 가 처리할 수 있도록 보낸다. controller 가 상태 갱신 메시지를 받으면 cache store 에서 해당 SparkApplication 오브젝트를 가져와서 Status 를 갱신한다.

 

API 정의에 기술된 것처럼, SparkApplicationStatus 타입인 Status 필드는 각 익서큐터 팟들의 상태를 포함한 앱의 전반전인 상태를 보여준다. 전체 상태는 제출 실패로 드라이버 팟이 실행되지 못한 경우를 제외하고는 드라이버팟의 상태를 나타낸다. 최종 앱의 상태는 드라이버팟의 종료 상태이며 드라이버팟이 완료된 경우 COMPLETED, 실패한 경우 FAILED 가 된다. 드라이버팟이 실행도중에 죽는다면 FAIELD 가 최종상태가 된다. 제출이 실패한다면 FAILED_SUBMISSION 상태가 된다. 두 종류의 종료 상태가 있는데 COMPLETED 와 FAILED 이며 이 두 상태의 앱들은 Operator 가 어떤 경우에도 재시도 하지 않는다. 이밖의 상태들은 종료된 것이 아니며 RestartPolicy 에 따라 재시도된다.

 

Handling Application Restart And Failures

SparkApplicationSpec 의 RestartPolicy 항목을 통해 앱 재시작 규칙을 명세할 수 있다.( 참조) 오퍼레이터는 앱의 종료 상태와 재시작 방침을 참고하여 앱을 재시작해야 할지 결정한다. 앞에서 설명한 것처럼 앱의 종료상태는 드라이버팟의 종료상태를 바탕으로 한다. 따라서 드라이버팟의 종료상태와 재시작 방침에 따라 결정된다.

아래 조건들이 사용된다.

  • 재시작 방침이 Never 라면, 종료 시에 재시작하지 않는다
  • Always 라면, 앱의 종료상태와 상관없이 재시작한다. 이 앱들은 COMPLETED 나 FAILED 같은 종료상태에 놓이지 않는다
  • OnFailure 라면, 실패 시에 재시작하며 재시도 회수에 제한이 없다. 실행되는 도중에 드라이버팟이 삭제되는 경우, 실패한 것으로 간주하여 OnFailure 방침인 경우 재시작한다.

오퍼레이터가 앱을 재시작하기로 결정하면 이전의 실행이 종료된 앱의 쿠버네티스 자원들을 없애고, SparkApplication 오브젝트를 내부 작업큐에 넣으며, 제출을 담당하는 워커가 사용하게 한다. 즉 드라이버팟을 재시작하지 않고, 단순히 앱을 다시 제출해서 새 드라이버팟을 생성할 수 있도록 한다.

 

Mutating Admission Webhook

오퍼레이터에는 CRD controller 에 의해 생성된, 특정 주석을 가진 스파크 드라이버와 익서큐터 팟들을 커스터마즈하는 선택적인 방법으로 mutating admission webhook 을 제공한다. 주석들은 앱 명세를 바탕으로 오퍼레이터가 설정한 것들이다. 쿠버네티스 스파크에서 기본적으로 제공하는 것을 제외한 모든 스파크 파드의 커스터미제이션은 mutating admission webhook 을 통해 다룬다

 

Command-line Tool: Sparkctl

sparkctl 은 오퍼레이터를 운영하기 위해 사용하는 도구이다. YAML 파일을 통해 SparkApplication 오브젝트를 생성하고, SparkApplication 오브젝트들의 목록을 보고, SparkApplication 의 상태를 확인하고, 스파크 드리이버가 실행되는 원격포트를 포워딩하고, SparkApplication 오브젝트를 삭제하는데 사용할 수 있다. 자세한 내용은 README 를 참고한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함