Chapter 2 스파크 간단히 살펴보기

스파크의 기본 아키텍쳐

데이터를 처리하는 경우에는 단일 컴퓨터로 처리하기에 어려움이 있다. 그러기에 여러 컴퓨터의 자원을 모아서 하나의 컴퓨터처럼 작동하도록 하는 컴퓨터 클러스터를 구성한다. 이것만으로도 충분하지 않아 작업을 조율할 프레임워크가 필요한데 스파크가 이러한 역할을 수행한다. 스파크 내부의 클러스터 매니저는 애플리케이션 수행에 필요한 자원을 할당하여 작업을 처리한다.

스파크 애플리케이션

스파크 애플리케이션은 드라이버 프로세스와 익스큐터로 구성되어 있다. 드라이버 프로세스는 정보의 유지관리, 입력에 대한 응답, 작업의 분석, 배포, 스케줄링을 수행한다. 익스큐터는 드라이버프로세스로부터 작업을 할당받아 코드를 실행하고 실행 결과를 드라이버 노드에 보고하는 역할을 수행한다. 각 작업에 필요한 자원은 클래스터 매니저로부터 할당을 받는다.

스파크의 다양한 언어 API

스파크는 5가지 언어에 대해 작동한다. 먼저 스칼라는 스파크의 기본 언어이다. 스칼라가 스파크의 기본 언어이지만 언어가 어렵고 스파크 자체가 JVM을 사용하기 때문에 자바역시 지원한다. 그 외에도 파이썬, SQL, R의 언어를 지원한다. 각각의 코드는 익스큐터의 JVM에서 실행할 수 있는 코드로 변환되어 실해되게 된다.

스파크 API

스파크가 두가지 종류의 API를 지원하기 때문에 다양한 언어로 스파크를 사용할 수 있다. 하나는 저수준의 비구조적 API이고, 다른 하나는 고수준의 구조적 API이다.

DataFrame

DataFrame은 대표적인 구조적 API이다. DataFrame의 형태는 스프레드시트의 형식과 유사하며, 로우와 컬럼으로 구성되어 있다. DataFrame의 컬럼과 컬럼의 타입을 정의한 목록을 스키마라고 부른다. DataFrame과 스프레드시트의 가장 큰 차이점은 저장소의 위치이다. 스프레드시트가 단일 컴퓨터에 존재하는 반면, DataFrame의 여러대의 컴퓨터의 분산되어 저장되어 있는데 이는 용량이 크거나 연산에 오랜 시간이 걸리는 것을 방지하기 위함이다.

파티션

파티션은 익스큐터가 병렬로 작업을 처리하기 위한 청크 단위의 데이터이다. 즉, 클러스터의 물리적 머신에 존재하는 로우의 집합을 의미한다. 사실 여기까지 읽으면 이해가 잘 되지 않는데 책에서 파티션의 개수나 익스큐터의 개수가 1개라면 병렬성이 1이 된다고 말하는 예시로 비추어 보아, 파티셔닝이란 데이터를 처리하기 위해 몇개의 데이터 조각으로 나눌것인지 결정하는 과정이라고 이해하였다.

트랜스포메이션

스파크의 핵심 데이터구조는 불변성을 가진다고 한다. 데이터의 구조를 변경할 수 없다는 말이 무슨말일까? 이는 사용자가 요청하거나 실행하기 전까지는 구조를 변경할 수 없다는 말로 이해되는데, DataFrame의 변경을 위해 변경 방법을 알려줘야 한다는 문장을 통해 유추하였다. 변경을 위해 사용하는 명령을 트랜스포메이션이라고 부른다.

트랜스포메이션에는 두가지 종류가 존재하는데, 좁은 의존성과 넓은 의존성이 있다. 좁은 의존성을 가진 트랜스포메이션은 입력 파티션이 출력 파티션과 일대일 관계를 가지고 영향을 미친다. 넓은 의존성은 이와 반대로 하나의 입력 파티션이 출력 파티션과 일대다 관계를 가지고 영향을 미친다. 이때 파티션끼리 교환이 일어나는 것을 셔플이라고 한다고 한다.

지연 연산

스파크가 연산 처리에 강점을 가지고 유명한 이유는 지연 연산 때문일 것이다. 스파크는 연산 명령을 받으면 데이터를 수정하지 않고 트랜스포메이션의 실행 계획을 세운다. 코드를 실행하는 마지막 순간까지 대기하다가 실행 계획에 따라 수행하는데, 불필요하게 데이터의 흐름이 발생하는 것을 막아 전체 데이터 흐름을 최적화할 수 있다.

액션

트랜스포메이션을 활용하여 실행 계획을 세운 뒤 실제로 수행하기 위해 필요한 것이 액션 명령이다. 액션은 말 그대로 트랜스포메이션으로부터 결과를 계산하도록 하는 지시 명령이다. 액션은 3가지 유형이 있다.

  1. 콘솔에서 데이터를 보이도록 하는 액션
  2. 각 언어로 된 네이티브 객체에 데이터를 모으는 액션
  3. 출력 데이터소스에 저장하는 액션

첫번째는 단순히 결과값을 화면에 출력한다는 의미이고, 세번재는 출력 결과를 모아놓는다는 뜻으로 이해했는데 두번째 유형에 대해서는 이해가 되지 않는다. 네이티브 객체라는 단어를 처음 들어봐서 그런 것 같은데 구글링을 해도 정확한 의미를 파악할 수 없었다. 추후에 추가적인 공부가 필요할 것 같다.

액션이 지정되면 스파크 잡이 시작되는데, 스파크 잡은 좁은 트랜스포메이션과 넓은 트랜스포메이션을 수행한다. 그리고 각 언어에 적합한 네이티브 객체에 결과를 모은다.

스파크 UI

스파크를 실행하고 있다면 다음의 주소에서 스파크 UI를 확인할 수 있다.

http://localhost:4040

뒤의 포트 숫자는 4040이 default값인데 해당 포트가 사용중이라면 다른 포트를 사용할 것이다. 해당 페이지에서 스파크 잡을 모니터링 할 수 있어 튜닝과 디버깅 과정에서 유용하다.

Reference

스파크 완벽 가이드
아파치 스파크

profile
개발자 지망생입니다.

1개의 댓글

comment-user-thumbnail
2022년 1월 8일

열심히 하시는 모습 보기 좋아요!

답글 달기