Apache Spark

김도비·2022년 9월 18일
0

Spark

목록 보기
2/4
post-thumbnail

패스트 캠퍼스를 통해 Apache Spark를 이용한 빅데이터 분석 입문 과정 교육을 정리했던걸 옮겨보자 한다.

Apache Spark

Apache Spark는 대용량 데이터를 다루기 위한 빠르고 범용적인 인메모리 기반 클러스터 컴퓨팅 엔진

In-Memory 기반 기술이라는 점 중요!
Disk에서 데이터를 읽어오는 것보다는 Memory에 올려놓고 읽어오는 것이 속도가 빠름. 주로 사용하는 데이터를 Cache 해놓고 쓰게되면 좀 더 빠르고 효율적으로 사용할 수 있음.

분산 메모리 기반 분산 병렬 처리
Scala, Java, Python, R 기반 High-level APIS 제공
배치,대화형쿼리, 스트리밍, 머신러닝과 같은 다양한 작업 지원하는 범용 엔진으로 Apache Hadoop과 호환

Apache Spark 사용용도 및 목적

대용량 데이터를 빠르게 처리하기 위해 만들어진 엔진. 저용량 데이터 처리에는 비효율적
분석용 엔진(OLAP 적합)

Apache Spark 구조

Spark는 크게보면 Spark Application 과 Cluster Manager로 구성되어 있음.

Spark Application - 실제 일을 수행하는 역할을 담당
Cluster Manager - Spark Application 사이에 자원을 중계해주는 역할을 담당

  • Spark Application

Spark Application - Driver Process와 Executor Process로 구성

  • Spark Driver
    Spark Application을 실행하는 프로세스이며,한개의 노드에서 실행된다.

    스파크 전체의 main() 함수를 실행하고. SparkContext 객체를 생성한다. Application 라이프 사이클을 관리하고, 사용자로 부터 입력을 받아서 애플리케이션에 전달, 작업 처리 결과를 사용자에게 알려준다.
    사용자가 구성한 사용자 프로그램(Job)을 task 단위로 변환하여, Executor로 전달한다.

Spark Driver는 실행 시점에 Deploy Mode를 Client Mode 와 Cluster Mode로 설정할 수 있다.

Client Mode - 클러스터 외부에서 드라이버를 실행

Driver는 spark-submit의 일부로 실행됨
Driver Program 출력을 직접 확인 가능
애플리케이션 실행하는 동안 작업 노드 들에 계속 연결되어 있어야함

Cluster Mode - 클러스터 내에서 드라이버를 실행

Driver가 Cluster내의 작업 노드(Worker) 중 하나에서 실행됨
실행 후 개입하지 않는 방식

  • Executor
    다수의 worker 노드에서 실행되는 프로세스로, Spark Driver가 할당한 작업(task)을 수행하여 결과를 드라이버에게 알려준다.
    Executor 동작 중 오류가 발생하게 되면 재작업을 진행한다. 또한 블록매니저를 통해 Cache하는 RDD를 저장한다.
    1개의 Spark Application에는 1개의 Spark Driver와 N개의 Executor가 존재한다.
    이 때, Executor는 Cluster Manager에 의하여 해당 Spark Application에 할당되며, 해당 Spark Application이 완전히 종료된 후 할당 해제된다.
    그렇기 때문에, 서로 다른 Spark Application 간의 직접적인 데이터 공유는 불가능(각 Spark Application이 별도의 JVM프로세스에서 동작)

  • Task
    Executor에서 실행되는 실제 작업이며, Executor Cache를 공유하여 작업의 속도를 높일 수 있다.

  • Spark Job 구성
    Spark Application의 작업은 잡(Job), 스테이지(Stage), 태스크(Task)로 구성
    잡(Job) - Spark Application으로 제출된 작업
    스테이지(Stage) - 잡을 작업의 단위에 따라 구분한 것이 스테이지
    태스크(Task) - Executor에서 실행되는 실제 작업. 데이터를 읽거나, 필터링 하는 실제 작업을 처리

  • Cluster Manager
    Cluster Manager 는 Spark와 붙이거나 뗄 수 있는, Pluggable한 컴포넌트로, Spark Application의 리소스를 효율적으로 분배하는 역할을 담당한다.
    Spark는 Executor에 Task를 할당하고 관리하기 위하여 클러스터 매니저에 의존한다.

이 때, Spark는 Cluster Manager의 상세 동작을 알지 못한다.(Black-box)
단지 Cluster Manager와의 통신을 통하여, 할당 가능한 Executor를 전달받는다.
YARN
하둡 클러스터 매니저
리소스 매니저, 노드 매니저로 구성 됨
Mesos
동적 리소스 공유 및 격리를 사용하여 여러 소스의 워크로드를 처리
아파치의 클러스터 매니저
마스터와 슬레이브로 구성됨
StandAlone
스파크에서 자체적으로 제공하는 클러스터 매니저
각 노드에서 하나의 익스큐터만 실행 가능

  • Spark Application 실행과정
    사용자가 Spark-submit을 통해 Application 제출
    Spark Driver가 main()을 실행하며, SparkContext를 생성되어 Cluster Manager와 연결 됨
    Spark Driver가 Cluster Manager로부터 Executor 실행을 위한 리소스를 요청
    Cluster Manager는 Driver에게 요청 받은 리소스 만큼 Executor 자원을 할당한 후 실행
    Executor 실행은 Cluster Manager, Task 할당은 Driver
    Driver를 통해 사용자 애플리케이션이 실행
    DAG Schedling을 통해 드라이버는 작업을 Task 단위로 분할하여 Executor에게 보냄
    Executor들은 단위 작업(Task)들을 계산해 Driver Program 결과 전달
    Driver는 main()이 끝나거나 SparkContext.stop()이 호출된다면 Executor들은 중지되고 Cluster Manager에 사용했던 자원을 반환

Apache Spark 특징

In-Memory 컴퓨팅(Disk 기반도 사용 가능)
RDD(Resilient Distributed Dataset) 데이터 모델
다양한 API 지원
다양한 개발 언어지원(Scala,Java,Python,R, SQL)
Hadoop과 유연한 연계(HDFS,HBase,Yarn ...)
빠른 데이터 프로세싱(In-Memory Cached RDD)
대화형 질의를 위한 Interactive Shell(Scala,Python,R InterPreter)
실시간(Real-time) Stream Processing( VS MapReduce)
하나의 어플리케이션에서 배치,SQL Query,스트리밍, 머신러닝 같은 다양한 작업을 하나의 워크플로우로 결합 가능

Spark Architecture

Hadoop vs Spark

Hadoop - on Disk

Hadoop의 경우 데이터 작업을 위해서 읽고 저장하고를 반복한다. Hadoop의 특성상 저장할 때 직렬화 발생과 디스크 I/O , 또 3Copy 기반이기에 속도가 느림.

Spark - In Memory + DAG

Spark는 데이터 작업 후 메모리에 저장하기에 다시 불어오는데 캐시를 이용하기에 속도가 빠름.

Spark vs Hadoop - Speed

당 테스트 지표를 참고해서 보게되면 속도에 있어서 큰 차이를 보여주고 있다.

Spark vs Hadoop - Ease of Use

같은 데이터 Word Count 프로그램을 구성하더라도, 확연히 코드량이 적고 , 직관성에 있어서 차이가 보인다. 물론 Scala 문법을 쓰기위해서 추가적인 공부가 필요한 점은 존재함.

RDD(Resilient Distributed Dataset)

  1. RDD 개념
    Resillient Distributed Data를 풀어 설명해보자면

Resillient(회복력 있는, 변하지 않는) : 메모리 내부에서 데이터가 손실 시 유실된 파티션을 재연산해 복구할 수 있음
Distributed(분산된) : 스파크 클러스터를 통하여, 메모리에 분산되어 저장됨
Data : 파일, 정보 등

즉, "회복력 있는 분산 데이터" 정도로 해석해 볼 수 있음.
여기서 Resillient(회복력)이 가장 핵심 포인트

RDD는 위의 그림과 같은 Lineage를 가진다. 불변의 특성을 가지는데(Read Only),
그렇기 때문에 특정 동작을 위해서는 기존 RDD를 변형한 새로운 RDD가 생성될 수밖에 없다.
그래서 위처럼 Spark 내의 연산에 있어 수많은 RDD들이 생성되게 되는데 이때 생성되는 연산순서가 바로 Lineage 이다.

특정 동작에 의해 생성되는 RDD Lineage는 DAG(Directed Acyclic Graph)의 형태를 가지게되는데

아래 그림의 형태를 참고

노드간의 순환(cycle : 시작점과 끝점이 같은 형태)이 없으며, 일정항 방향성을 가지기에 각 노드 간에는 의존성이 있으며, 노드 간의 순서가 중요한 형태이다.
이러한 DAG에 의하여, 특정 RDD 관련 정보가 메모리에서 유실되었을 경우, 그래프를 복기하여 다시 계산하고, 자동으로 복구가 가능.
스파크는 이러한 특성 때문에 Fault-tolerant(작업 중 장애나 고장이 발생하여도 예비 부품이나 절차가 즉시 그 역할을 대체 수행함으로써 서비스의 중단이 없게 하는 특성)를 보장하는 강력한 기능 제공

  1. RDD 동작원리
    RDD는 스파크의 가장 기본적인 데이터 단위
    모든 작업은 새로운 RDD를 생성하거나/이미 존재하는 RDD를 새로운 RDD로 변형하거나/최종 결과 계산을 위해 RDD에서 연산 API를 호출하는 것 중 하나에 의해 수행 (Read Only 특성)

위 참조 그림처럼 Data source로부터 최종 Data에 도달하기 위해서는 많은 RDD가 새로 생성되고 변형되는 작업이 발생하게 됨.

그림 중, Transformation과 Action에 대한 얘기가 나오는데 RDD에서 중요핵심 용어이다.

RDD 동작 원리의 핵심은 Lazy Evaluation이고, 쉽게 말해 즉시 실행하지 않는 것을 의미함.
Action 연산자를 만나기 전까지는, Transformation 연산자가 아무리 쌓여도 처리하지 않는 점이 존재.
이는 Hadoop의 Map Reduce 동작과 대조적이기 때문에, Spark는 간단한 operation들에 대한 성능적 이슈를 고려하지 않아도 된다는 장점 지님.

Transformation 연산자는 기존 RDD에서 새로운 RDD를 생성하는 동작(반환 값은 RDD)
Transformation에서는 Spark가 실제 연산작업을 수행하지 않는다.

Transformation 대표 연산자 종류

이름 용도
map() RDD의 각 요소에 함수를 적용하고, 결과 RDD를 리턴
filter() 조건에 통과한 값만 리턴
distinct() RDD의 값 중 중복을 제거
union() 두 RDD에 있는 데이터를 합친다. (RDD간 합집합)
intersection() 두 RDD에 모두 있는 데이터만을 반환한다. (RDD간 교집합)

Action 연산자는 기록된 모든 작업을 실제 수행하는 연산자입니다. (그림의 파란색 화살표)
리턴값이 데이터 또는 실행 결과죠.

Action 대표 연산자 종류

이름 용도
collect() RDD의 모든 데이터를 리턴
count() RDD의 값 갯수를 리턴
top(num) 상위 num 갯수만큼 리턴
reduce(func) RDD의 값들을 병렬로 병합 연산한다. (병합 기준 : func)

  1. RDD 특징
    Dataset : 메모리 및 디스크에 분산 저장된 변경 불가능한 데이터 객체 모음
    Distributed : RDD에 있는 데이터는 클러스터에 자동 분배 및 병렬 연산 수행
    Resilient : 클러스터의 한 노드가 실패하더라도 다른 노드가 작업처리(RDD Lineage,Automatically rebuilt on failure)
    Immutable : RDD 수정 X. 변형을 통한 새로운 RDD 생성
    Operation APIS
    Transformations(데이터 변형 : map,filter,groupBy,join)
    Actions(결과연산 리턴 및 저장 : count,collect,save)
    Lazy Evaluation : All transformations(Action 실행 때까지)
    Controllable Persistence : Cache in RAM/Disk 가능(반복 연산에 유리)
  1. RDD -Lazy Evaluation(No Cache vs Cache)

No Cache
Cache를 사용하지 않게되면 작업 후 같은 작업 실행 시 파일을 다시 처음부터 읽는 작업을 진행함.

Cache
Cache를 해놓고 쓰게되면 속도면에 있어서 30배정도 차이가 나는 걸 확인 할 수 있음.

profile
모든 걸 기록하자

0개의 댓글