반응형

Spark에 대해 집중적으로 공부하기 전에 Spark의 전체적인 구조와 개념들에 대해 알아보자. 


Spark 기본 아키텍처

  • 이전 글에서 언급한대로, Spark는 클러스터 자원 내에서 분산 처리를 위한 프레임워크이다. (물론, 단일 머신 내에서도 사용 가능하다.)
  • Spark는 클러스터 내의 데이터 처리를 총괄하는 클러스터 매니저Spark Application을 요청하고, 클러스터 매니저가 Spark Application에 대한 자원을 할당하는 방식으로 처리된다. 
  • Spark Application은 2종류의 Process로 구성된다.
    • Driver Process : Cluster 내의 단 하나의 노드에서 실행됨. 대한 정보, 사용자 프로그램과 입력에 대한 응답, Excutor Process의 작업에 대한 분석, 배포, 스케줄링 역할을 수행.  
    • Executor Process : Cluster 환경에 맞게 여러 개의 노드에서 실행될 수 있음. Driver Process가 할당한 작업을 처리하고, 진행 상황을 Driver에 전송. 

스파크 아키텍처 (출처 : https://learn.microsoft.com/ko-kr/dotnet/spark/what-is-spark)

 

SparkSession

  • Spark 아키텍처를 보면, Driver process 내에 SparkSession이 존재하는 것을 볼 수 있다. 
  • SparkSession은 Spark에서 작업을 수행하기 위한 진입점이다. (이전 버전의 SparkContext, SQL Context 등을 통합)
  • SparkSession은 Spark Application과 데이터 소스와의 연결, Cluster 간의 연결을 관리하고, 데이터 처리를 위한 API를 제공하는 역할을 한다.

 

Spark의  API

  • Spark는 기본적으로 Scala, Java, Python, SQL, R 등의 다양한 언어를 지원한다. 사용자들은 본인들이 편한 언어를 통해서, Spark의 API를 호출하면 된다. 
  • 이것은 Spark Session이 각 언어에서 작성된 코드를 API 형태로 받아, Spark 코드로 변환해주기 때문에 가능하다. (이 때문에, 어느 언어의 API를 사용하던 실행 시간등에 큰 차이가 없다.) 
  • Spark는 추상화 수준에 따라 크게 2가지 종류의 API를 제공한다.
    • 저수준의 비구조적 API : RDD, SparkContext, Accumulator, Broadcast Variable
    • 고수준의 구조적 API : DataSet, DataFrame, SQL Table
  • Spark 초기 버전에는 RDD와 같은 저수준의 비구조적 API가 많이 사용되었지만, 더 복잡하고 낮은 추상화 수준을 가지기 때문에, 최신 버전에서는 DataFrame이나 Dataset과 같은 고수준의 구조적 API가 많이 활용된다. 
  • 실제 고수준의 구조화된 API들도, 실제 연산 시에는 RDD로 처리된다. (Spark 내부적 처리)

 

Spark 데이터 처리 방식

  • Spark는 데이터구조는 기본적으로 불변성의 특성(변경하지 못함)을 가지고 있다. 데이터 변경을 위해서는 원하는 변경 방법을 Spark에 "Transformation"라는 명령을 보내야한다.
  • Spark의 연산은 기본적으로 지연 연산 방식을 사용한다. 데이터에 직접적인 수정을 하지 않고, Raw 데이터에 적용할 Transformation의 실행 계획을 생성하고, 물리적 실행 계획으로 Compile한다.
  • 실행 계획에 대한 실제 연산은 "Action" 명령을 통해 이뤄진다.  (즉, 실제 사용될때 연산이 진행된다.)

 

 

 

+ Recent posts