본문 바로가기
데엔(Data-Engineering)/스파크(Spark)

[Spark] 01. 스파크 기초 (동작 과정)

by KwonSoonBin 2023. 2. 6.

스파크란?

빅데이터 처리를 위한 오픈소스 고속 분산처리 엔진이다.

※Hadoop의 연산엔진(MR)을 대체하는 분산처리 [플랫폼 / 엔진 / 프로젝트 / 프레임워크 / 솔루션] ※

 

많은 기업에서 사용한다. 왜?

빅데이터의 문제 + 기존 시스템 개선

  • 규모 : 데이터의 크기가 증가
  • 속도 : 데이터가 생성되는 속도 증가
  • 다양성 : 데이터의 종류 증가
  • 기존 Hadoop의 연산엔진(MR) DISK I/O 작업 방식을 개선하기 위해 (속도 문제)

 

 하둡은 크게 3부분으로 나뉜다. 파일시스템(hdfs), 연산엔진(mapreduece), 리소스관리(yarn)

이들 중 스파크는 연산엔진을 대체하는 플랫폼이다.

기존 Hadoop의 연산엔진에서 속도가 문제였던 이유

위 사진과 같이 디스크 작동은 느리다.

HDD/SDD 부터 CPU까지의 거리?도 문제지만 

hadoop의 MR 은 hdfs 의 파일을 읽어드린 후 연산 중간 파일(셔플 결과 등)을 hdfs에 쓰고 그것을 다시 읽어서 연산하기 때문이다.

  • HDD/SDD 부터 CPU까지의 속도 문제
  • 셔플 결과을 다시 쓰고 읽는 연산 과정

 

그래서 데이터를 나누고 여러 노드의 메모리에서 동시에 처리하는 spark를 사용한다. (in-memory연산)

기본 방식(Hadoop의 디스크 I/O) 보다 약100배 빠르다.

 

 

스파크의 특징

  • in-memory연산(빠르다)
  • 스파크는 수평적 확장이 가능하다.
    • 노드를 필요에 따라 계속 늘릴 수 있다.
  • RDD(Resilient Distributed Dataset)
    •  여러 분산 노드에 걸쳐서 저장
    • 변경 불가능
    • 여러 개의 파티션으로 분리
  • Hadoop MapReduce 보다 빠르다.
    • 메모리 상에서는 100배
    • 디스크 상에서는 10배
  • Lazy Evaluation
    • 태스크를 정의할때는 연산을 하지 않다가 결과가 필요할때 연산한다.
    • 기다리면서 연산 과정을 최적화 할 수 있다.

 

Spark 애플리케이션의 동작 과정 & 각 구간 역할

Spark 애플리케이션의 동작 과정

용어 정리 및 역할 

Driver Program :

  • Spark 애플리케이션 관련 정보를 유지 관리
  • 사용자의 프로그램이나 입력에 대응
  • executor 작업을 실행, 분석, 배포, 예약

spark app을 실행하는 프로세스, 한 개의 노드에서 실행되며, main()함수를 실행하고 SparkContext 객체를 생성한다.

spark app의 라이프 사이클 관리, 사용자로 부터 입력을 받아서 애플리케이션에 전달

우리가 작업하는 환경, Script(java,python,scala)를 작성하는 공간

 

Driver 프로세스가 절대적으로 필수적이다. 이것이 Spark 애플리케이션의 심장과 같으며,

애플리케이션 수명 내내 각종 주요 정보를 모두 유지한다.

 

 

SparkContext :

  • Job을 Task단위로 나눈다.
  • Cluster Manager로 부터 할당 가능한 Executor를 전달받는다.
  • Cluste Manager로 부터 할당받은 Executor로 Task를 넘긴다.

Driver 에서 Cluster Manager 와 실제 연결되는 객체

사용자가 구성한 프로그램을 수행하기 위해 Job을 task 단위로 나누어  Executor로 전달한다.

(Cluste Manager 통신을 통하여, 할당 가능한 Executor를 전달받고, Job을 task 단위로 나누어 Executor에게 할당한다.)

 

 

Cluster Manager :

  • Spark app의 리소스를 효율적으로 배분, (클러스터내의 워커 리소스를 관리)
  • SparkContext 요청에 따른 할당 가능한 Executor를 전달

실제 시스템을 제어하고 Spark 애플리케이션에 리소스를 할당하는 작업은 클러스터 관리자가 맡는다.

Cluster Manager 는 스파크와 붙이거나 뗄 수 있는 Pluggable한 컴포넌트 여러 코어 클러스터 관리자들이 있는데 Spark의 독립 실행형 클러스터 관리자, YARN 또는 Mesos 등이 이에 해당된다. (ex: Yarn, Mesos, aws-Eleatic MapReduce, StandAlone 등)

 

스파크는 익스큐터에 태스크를 할당하고 관리하기 위하여 클러스터 매니저의 도움을 받는다.

이 때, 스파크는 클러스터 매니저의 상세 동작을 알지 못한다.(Black-box)

 

Q.Cluster Manager 가 executor 생성하는 주체?

 

Worker Node :

 Worker Node는 1CPU 하나당 1Node가 배치되어 인메모리 연산을 진행한다.

클러스터에서 애플리케이션을 실행시킬 수 있는 Node를 의미

 

 

Executor : 

  • Driver가 할당한 코드를 실행
  • Executor에서 연산 결과를 다시 driver 노드에 보고

driver가 할당한 (Task)작업을 실제 작업을 담당, 진행하는 프로세스, Spark Driver가 할당한 작업을 수행하고 결과를 Driver Program에 반환,보고한다.

(YARN 컨테이너라고 불리기도 한다) (블록매니저를 통해 cache하는 RDD를 저장한다.)

 

Task :

Executor에서 실행되는 실제 작업 단위

 

스파크안에서 수행되는 작업은 stage, task로 구성된다

job : 스파크애플리케이션한테 제출된 작업

stage : 단위에 따라 job을 구분한 작업 , Job을 여러 단위의 Stage로 쪼갤 수 있다. Map 과 Reduce로 쪼개는 것과 비슷한 매커니즘.

 

실행 순서

  1. 사용자가 Spark-submit을 통해 어플리케이션을 제출
  2. Spark Driver가 main()을 실행하며, SparkContext를 생성
  3. SparkContext가 Cluster Manager와 연결
  4. Spark Driver가 Executor 실행을 위한 리소스를 Cluster Manager에 요청
  5. Cluster Manager는 리소스 할당 및 Task 할당 가능한 Executor들을 Spark Driver에 알려준다.
  6. Spark Context는 작업 내용을 task 단위로 분할하여 Executor에 보낸다.
  7. 각 Executor는 작업을 수행하고, 결과를 Driver에 보고한다.

 

정리

스파크 어플리케이션은 Driver 프로세스와 N개의 Executor 프로세스로 구성된다.

Spark Driver는

한 개의 노드에서 실행되며, 스파크 전체의 main() 함수를 실행.
애플리케이션 내 정보의 유지 관리, 익스큐터의 실행 및 실행 분석, 배포 등의 역할을 수행.

사용자가 구성한 프로그램을 수행하기 위해 Driver 의 Spark Context가 Job을 task 단위로 나누어  Executor로 전달한다.

 

추가 내용 (참고 정도?)

- Executor는 해당 스파크 어플리케이션에 할당되며 해당 스파크 어플리케이션 종료 후 할당에서 해방된다.

그래서, 서로 다른 스파크 어플리케이션 간의 직접적인 데이터 공유는 불가능하다.
(각 스파크 어플리케이션이 별도의 JVM프로세스에서 동작하므로)

- 독립 실행형 클러스터 관리자의 경우 한 클러스터에서 동시에 여러 개의 Spark 애플리케이션을 실행할 수 있다 

- 스파크는 익스큐터에 태스크를 할당하고 관리하기 위하여 클러스터 매니저의 도움을 받는다.

- 사용자가 구성을 통해 노드마다 몇 개의 executor를 포함할지 지정할 수 있습니다. 


 

역사

Spark 1.0

2014년 정식 발표

RDD를 이용한 인메모리 처리 방식

DataFrame

Project Tungsten- 엔진 업그레이트로 메모리와 cpu효율 최적화

 

Spark 2.0

2016년 발표

단순화+성능 개선

Structured Streaming

DataSet이라는 DataFrame의 확장형 자료구조 등장

Catalyst Optimizer 프로젝트 - 언어에 상관없이 동일한 성능을 보장

 - 파이썬 자바 스칼라 R

 

Spark 3.0

2020년 발표

MLlib 기능 추가

Spark SQL기능 추가


(아래 2개 적용함으로써)Spark 2.4보다 약 2배 빨라짐

 - Adaptive execution

 - Dynamic partition pruning

Pyspark 사용성 개선

딥러닝 지원 강화

 - GPU노드 지원(worker node가 GPU노드 사용 가능)

 - 머신러닝 프레임워크와 연계 가능(파이토치,텐서플로우 같은 ML프레임워크 연계 가능)

GraphX - 분산 그래프 연산

python 2지원 종료

쿠버네티스 지원 강화

 

 

구성

Spark Core

Spark  SQL

Spark  Streaming

MLlib

GraphX

 

 

 

 

 

참고 자료

https://www.databricks.com/kr/glossary/what-are-spark-applications

https://artist-developer.tistory.com/8

https://bcho.tistory.com/m/1387

https://magpienote.tistory.com/189

댓글