스파크의 기본 아키텍처
-
보통 한 대의 컴퓨터는 대규모 정보를 연산할 만한 자원이나 성능을 가지지 못함
- 연산을 할 수 있다고 해도 완료하는데 너무 많은 시간이 걸림
-
컴퓨터 클러스터는 여러 컴퓨터의 자원을 모아 하나의 컴퓨터처럼 사용할 수 있게 만듦
-
이 클러스터에서 작업을 조율할 수 있는 프레임워크가 필요 -> 스파크가 그런 역할을 하는 프레임워크
-
스파크가 연산에 사용할 클러스터는 클러스터 매니저에서 관리함
-
작업 처리 과정
- 사용자는 클러스터 매니저에 스파크 애플리케이션을 제출(submit)함
- 이를 제출받은 클러스터 매니저는 애플리케이션 실행에 필요한 자원을 할당
- 할당받은 자원으로 작업 처리
스파크 애플리케이션
스파크의 다양한 언어 API
- 스파크의 언어 API를 이용하면 다양한 프로그래밍 언어로 스파크 코드를 실행할 수 있다.
- 스파크는 스칼라로 개발
- 스파크 언어 API를 통해 클러스터 머신에서 실행되는 스파크 코드로 변환
- 스파크는 사용자를 대신해 파이썬이나 R로 작성한 코드를 익스큐터의 JVM에서 실행할 수 있는 코드로 변환함
SparkSession
- 스파크 애플리케이션은 SparkSession이라 불리는 드라이버 프로세스로 제어한다.
- SparkSession 인스턴스는 사용자가 정의한 처리 명령을 클러스터에서 실행한다.
- 하나의 SparkSession은 하나의 스파크 애플리케이션에 대응한다.
spark
SparkSession - hive
SparkContext
Spark UI
Version v2.4.3
Master local[8]
AppName Databricks Shell
myRange = spark.range(1000).toDF('number')
display(myRange.limit(10))
number
0
1
2
3
4
5
6
7
8
9
- 위에서 생성한 DataFrame은 한 개의 column과 1000개의 row로 구성
- 할당된 숫자들(0~999)은 분산 컬렉션(RDD)을 나타냄
- 숫자 범위의 각 부분이 서로 다른 익스큐터에 할당됨
DataFrame
- 가장 대표적인 구조적 API
- 테이블의 데이터를 row와 column으로 단순하게 표현
- 스키마: column과 column의 타입을 정의한 목록
- 수천 대의 컴퓨터에 분산되어 있음
- 단일 컴퓨터에 저장하기엔 데이터가 너무 크거나 계산이 너무 오래 걸릴 수 있기에
*스파크는 Dataset, DataFrame, SQL 테이블, RDD라는 몇 가지 핵심 추상화 개념을 갖고 잇음-> 모두 분산 데이터 모음을 표현함
파티션
- 스파크는 모든 익스큐터가 병렬로 작업을 수행할 수 있도록 파티션이라 불리는 청크 단위로 데이터를 분할함
- 파티션: 클러스터의 물리적 머신에 존재하는 로우의 집합
- 만약 파티션이 하나라면 스파크에 수천 개의 익스큐터가 있더라도 병렬성은 1
- 그리고 수백 개의 파티션이 있더라도 익스큐터가 하나라면 병렬성은 1
- DataFrame의 파티션은 실행 중에 데이터가 컴퓨터 클러스터에서 물리적으로 분산되는 방식
- DataFrame을 사용하면 파티션을 수동 혹은 개별적으로 처리할 필요가 없다.
- 물리적 파티션에 데이터 변환용 함수를 지정하면 스파크가 실제 처리 방법을 결정한다.
트렌스포메이션
- 스파크의 핵심 데이터 구조는 불변성(immutable)을 가짐
- 데이터 구조를 변경하려면 변경 방법을 스파크에게 알려줘야함
- 이때 사용하는 명령을 트랜스포메이션이라함
tmp = myRange.where('number>0 and number%2=0')
- 위 코드를 실행해도 결과는 출력되지 않음
- 추상적인 트랜스포메이션만 지정한 상태이기 때문에 액션을 호출하지 않으면 스파크는 실제 트랜스포메이션을 수행하지 않음
- 트랜스포메이션에는 두 가지 유형이 있음
- 좁은 의존성(narrow dependency)
- 넓은 의존성(wide dependency)
좁은 의존성
- 각 입력 파티션이 하나의 출력 파티션 에만 영향을 미치는 것
- 위 예제에서 where 구문은 좁은 의존성을 가짐
- 파이프라이닝을 자동으로 수행함
넓은 의존성
- 하나의 입력 파티션이 여러 출력 파티션에 영향을 미침
- 스파크가 클러스터에서 파티션을 교환하는 셔플이 수행됨
지연 연산
- 스파크가 연산 그래프를 처리하기 직전까지 기다리는 동작 방식
- 스파크는 연산 명령이 내려진 즉시 데이터를 수정하지 않음
- 원시 데이터에 적용할 트랜스포메이션의 논리적 실행 계획을 생성함
- 코드를 실행하는 마지막 순간까지 대기하다가 트랜스포메이션을 간결한 물리적 실행 계획으로 컴파일함
- 이를 통해 전체 데이터 흐름을 최적화할 수 있는 것임
액션
- 실제 연산을 수행하기위해 액션 명령을 내림
- 액션은 일련의 트랜스포메이션으로부터 결과를 계산하도록 지시하는 것
- 액션의 세 가지 유형
- 콘솔에서 데이터를 보는 액션
- 각 언어로 된 네이티브 객체에 데이터를 모으는 액션
- 출력 데이터소스에 저장하는 액션
tmp.count()
499
- 위처럼 액션을 지정하면 스파크 job이 시작됨
- 스파크가 제공하는 스파크 UI로 클러스터에서 실행 중인 스파크 job 모니터링 가능
스파크 UI
- 스파크 job의 진행 상황을 모니터링할 때 사용
- 확인 정보
- 스파크 job 상태
- 환경 설정
- 클러스터 상태
- etc.
- 핵심 요약(디테일한 내용은 나중에)
- 스파크 job은 개별 액션에 의해 트리거되는 다수의 트랜스포메이션으로 이루어져 있으며,
- 스파크 UI로 job을 모니터링할 수 있다.