티스토리 뷰

클러스터환경

스파크는 여러 컴퓨터에 설치해놓고, 데이터 분석을 분산처리할 수 있게 해준다.

스파크 클러스터 모델은 마스터 역할을 하는 드라이버 프로그램과 실제로 데이터 처리 역할을 하는 익스큐터로 구성되어있다.

마스터 서버에 설치되어있는 드라이버 프로그램이 여러 워커 노드 서버에 설치되있는 익스큐터들에게 데이터 연산 작업을 시키는 구조인거다.

드라이버 프로그램은 스파크 컨텍스트를 생성하고 관리한다. 드라이버 프로그램에서 메인 함수를 실행하면, 워커 노드들에서 익스큐터 프로세스들이 돌아가게 된다.
스파크 컨텍스트는 데이터베이스의 커넥션 같은 존재이다. 스파크 컨텍스트를 통해 rdd나 어큐뮬레이터 변수 등을 생성하고 사용할 수 있다. 
나는 스파크 컨텍스트를 애플리케이션이 돌아가는 동안 여러대의 서버들에서 공유되어야 하는 변수 등이 관리되는 객체로 이해하고 있다.

내가 읽고 있는 책에서는 스파크 애플리케이션이라는 용어를 데이터를 분석하는 작업 단위를 의미한다. 
메인함수가 호출되는 하나의 프로그램을 의미한다고 보면 된다. 
아무튼, 스파크 애플리케이션을 구현하면서 주의해야하는 점은, 한 애플리케이션에서는 하나의 스파크 컨텍스트만 생성할 수 있고, 다른 애플리케이션의 자원을 공유할 수가 없다는 점이다. 
그래서 스파크 컨텍스트에 저장되어있는 어큐뮬레이터 변수를 다른 애플리케이션에서 접근할 수 없기도 하다. 

스파크 클러스터 모델에서는 익스큐터가 자원 할당 단위가 된다고 한다. 
익스큐터 하나가 사용할 자원(cpu, 메모리)를 정한 뒤, 작업 실행 요청이 발생할 때마다 필요한 만큼의 익스큐터를 할당하는 방식으로 자원을 할당한다고 한다.


클러스터 환경에서 스파크가 동작되는 방식

1. 드라이버 프로그램에서 스파크 컨텍스트를 생성해서, 

2. 클러스터 매니저에게 데이터 처리를 할거라고 알려주면

3. 클러스터 매니저가 워커 노드에 익스큐터 프로세스를 띄운다 ( 워커 노드에는 익스큐터 프로세스가 여러개 뜰 수 있다 )

4. 그러면 드라이버 프로그램이 연산을 시작한다. 데이터를 지지고 볶는 척하는 트랜스포메이션 연산이 호출될 때는 실제로 작업을 처리하지는 않는다. 액션 연산이 호출될 때 실제로 작업이 처리된다. 아무튼.. 액션 연산이 호출될 때, 실제 JOB이 생성된다. JOB은 액션연산 갯수만큼 생성이 된다.

5. 이 JOB들은 바로 워커노드로 가지 않는다. 스테이지라는 단계를 거치고 나서, 워커 노드에 가서 열일을 한다.

이 단계에서는 셔플을 최소화하는 방식으로 연산을 처리할 수 있게 스테이지라는 것들을 묶는다. 관심법으로 이해하기에, 뭔가 같이 셋트로 묶어있는게 좋은 데이터들 + 연산 작업들을 스테이지라는 한 덩어리로 묶는 개념인건가 싶었다.

6. 마지막으로 이 스테이지들은 태스크라는 단위로 쪼개져서, 워커노드의 익스큐터 프로세스들로 전달된다. 이 태스크들은 익스큐터 프로세스 안에서 쓰레드로 처리된다. 

7. 익스큐터는 할당받은 태스크들을 처리하는 역할도 하지만, 데이터들을 나중에 재사용할 수 있게 저장하는 역할도 한다.


디플로이 모드

클러스터 매니저마다 조금씩 다른 방식으로 애플리케이션을 실행시키는데, 이렇게 다른 실행모드를 디플로이 모드라고 한다.

대표적으로는 클라이언트 디플로이 모드와 클러스터 디플로이 모드가 있다.


클라이언트 디플로이 모드

클라이언트 디플로이 모드는 애플리케이션을 실행한 프로세스에서 드라이버 프로그램을 구동하는거다. 

이 경우, 드라이버 프로그램의 작업이 클라이언트 서버 프로세스에 포함된다. 스파크 쉘을 띄어놓고, 워커 노드들에서 오는 결과값이 올 때까지 기다려야하는 상황이 디플로이 모드 환경이라고 이해된다. 스파크 쉘을 꺼버리면, 애플리케이션이 종료되는 상황으로 이해된다.


클러스터 디플로이 모드

클러스터 디플로이 모드는 애플리케이션을 실행한 프로세스에서는 클러스터 매니저에게 작업 실행만 요청하고 바로 종료되는 거다. 그러면 실제 드라이버 프로그램이 실행은 클러스터 내부에서 실행되는 것을 의미한다. 스파크 쉘을 꺼버려도, 뒷단에서 애플리케이션이 알아서 다 돌고, 종료되는 상황으로 이해된다.

데이터 분석을 위해 스파크를 사용하는 경우나 개발 환경에서는 바로바로 실행결과를 확인할 수 있어야한다. 이런 경우, 클라이언트 디플로이 모드가 적합하다.

반면 배치 작업처럼 이미 정형화되어있고, 고정적인 작업인 경우에는 클러스터 디플로이 모드가 적합하다. 왜냐하면, 드라이버프로그램과 익스큐터간의 메시지 전송을 위한 네트워크 비용이 줄어들 수 있기 때문이다. 


참고 링크 https://aws.amazon.com/ko/blogs/big-data/submitting-user-applications-with-spark-submit/

댓글
댓글쓰기 폼