RDD?

  • Resilient Distributed Dataset 의 약자로써 Spark의 최초에 도입된 데이터 구조
    1. Resilient ( 회복력 있는, 불변의)
      1. 메모리 내 데이터가 손실되도 복구 가능 하고, 생성된 데이터는 불변이다.
      2. 복구는 데이터를 저장하는 것이 아닌 새로 만들어 복구한다
    2. Distributed (분산된)
      1. Spark Cluster를 통해 메모리에 분산되어 있음
    3. Dataset
      1. 데이터
    • 데이터는 여러 서버에 분산되어 저장되고, 처리할 때 동시에 병렬로 처리가능하고 일부 서버에서 장애 발생시 복구가 가능하다.
      • 데이터 요소가 모인 집합
      • 스파크 클러스터에 나눠져 저장됨

Partition

  • RDD는 Partition 단위로 처리가 이루어 진다.
    • Partition단위로 스파크 클러스터에 분산 관리됨
    • Hadoop의 FS인 HDFS를 사용하면 1 Block = 1 Partition으로 구성된다
      • 기본값이 저렇게 되고, Spark API를 이용하여 Partition 수는 조정할 수 있다.
    • Partition 크기,개수에 따라 성능에 영향을 준다.
    • 처리중 Partition 재구성 혹은 Network를 통해 다른서버로 이동되는 Shuffle이 발생할 수 있다
      • Shuffle이 많이 발생하면 성능 저하를 야기할 수 있어 주의해야 한다.
      • Partition 수를 직접 지정할 수 있어 적절히 설정하는 것을 권장

Operation

Spark는 기본적으로 Lazy evaluation으로 처리된다.
RDD는 기본적으로 2개의 큰 연산으로 구분된다.

Lazy evaluation

  • Spark는 기본적으로 지연 구동이 된다.
    • 최척화를 해주는 장점이 있지만, 잘못하면 원치 않게 동작할 수 있어 잘 고민하고 구현해야한다.
  • 최적화 ?
    • Lazy로 동작하여 이미 동작해야 할 것을 알고 있기에 최적화된 방식으로 동작한다
    • Pasted image 20231006111119.png
      • 위 그림처럼 프로그래머가 최적화 하지 않고 수행한다면 A처럼 순서에 따라 동작할 것이다
      • 하지만 Lazy하게 동작하여 자동으로 최적화 된다면 B처럼 동작할 수 있다

Transformation

  • 기존의 RDD를 새로운 RDD로 생성하는 것.
    • 이름 그대로 RDD에 변형이 발생하는 것.
      • e.g) Filter , Join …
  • Transformation은 Action Function이 호출되기 전까지는 Lineage만 생성하고 쌓아둔다
  • Return 값은 RDD 이다
    • RDD01를 이용하여 RDD02를 생성하는 것.
  • Transformation은 2개로 구분된다
    • Pasted image 20231004161104.png
    1. narrow dependency
      • 위 그림과 같이 단순히 더하는 것 과 같이 Partition 이동이 없고, Shuffle이 발생하지 않는 상황
      • 즉 다른 Partition에 존재하는 데이터를 알 필요 없는 연산
        • e.g val rdd2 = rdd2.map(case (key,value) => (key,value +1))
    2. wide dependency
      • 위 그림과 같이 단순히 더하는 것 과 같이 Partition 이동이 있거나 , Shuffle이 발생하는 상황
      • 즉 서로 다른 Partition에 존재하는 데이터를 참조해야 하는 연
        • e.g val rdd3 = rdd2.reduceByKey(_ + _ )

Action

  • 실질적으로 연산을 하는 연산자
    • 즉 , return 값이 데이터 혹은 실행 결과인 것
    • Lazy evaluation에 따라 Action Function이 호출 될 때 연산을 시작한다.
      • 한번에 실행시키기 때문에 최적화된 방법으로 처리할 수 있다.
    • collect(), count() 등이 있다.

Lineage

  • Resilient를 만족 시킬때 RDD는 실질적인 데이터를 저장하는 것이 아니라, 작업 내용을 기억하고 있는 것이다.
  • 이러한 작업 과정 읽기 전용 모델로 만든 것을 Lineage라고 부른다.
  • Lineage는 Dag의 형태로 구성되어있다.

Dag

Directed Acyclic Graph 즉 방향성을 가진 그래프
Pasted image 20231004160214.png

  • 노드간 순환이 없고, 순서가 중요하다.
  • 만약 D에서 장애가 발생하면 B부터 다시 처리하면 되기 때문에 Resilient를 만족시킨다
    • 이러한 특성으로 Spark RDD는 Fault-tolerant를 보장한다.
  • Spark는 Stage로 나누어서 처리되고 Task단위로 연산한다
    • Task는 작업 단위, Task를 묶어 한번에 병렬 처리되는 것을 Job이라고 부른다.
    • E.g위 그림을 보면 Stage 1에는 B와 D의 Task 2개가 존재한다

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

'프로그래밍 및 IT > Spark' 카테고리의 다른 글

spark-scheduling  (0) 2023.11.28
WordCount  (0) 2023.10.13
RDD Action  (0) 2023.10.13
RDD Transformation  (0) 2023.10.13
Spark  (0) 2023.10.04

Spark?

  • Hadoop과 유사한 클러스터 기반의 분산처리 기능을 제공하는 오픈소스 프레임워크
    • 빅데이터 분산처리 플랫폼 / 엔진
  • In-Memory기반으로 처리하기 때문에 반복적인 데이터 처리, 즉 ML 과 같은 것에 뛰어난 성능을 보인다.

Spark Application

  • 제출한 Job을 Task로 변환하여 Executor에게 분산 처리함

Driver

  • 스파크에서 Job을 수행하는 프로그램
    • Main함수를 수행하는 프로그램
    • SparkContext를 생성하고 해당 Instance를 포함한 프로그램
  • Cluster모드에 따라 다른 위치에서 수행되지만 대체로 실행 서버에서 구동.
  • Worker 노드에 작업을 시키고, 결과를 취합한다

Worker

  • 작업을 하는 노드
  • Executor가 동작하는 노드
    • 작업을 수행하는 프로세스
    • Partition 단위로 Job을 수행
    • 1개의 Worker 노드에 N개의 Executor가 동작할 수 있다

Application

  • Spark 위에서 구동되는 프로그램
    • Driver
      • Spark Application을 실행하는 프로세스
      • Spark Context를 생성
      • Spark Application Life cycle 관리
    • Executor
      • Task 실행을 담당
      • 실행 결과를 Driver에게 전달

Cluster Manager

  • 이름 그대로 cluster를 관리하는 매니져
  • cluster mode 종류
    • Yarn
      • Hadoop Cluster Manager
      • Resource Manager / Node Manager로 구성
    • Memos
      • Apache Cluster Manager
      • Master /Slave 구성
    • StandAlone
      • Spark 자체 제공 Cluster Manager
      • 1 Node 1 Executor만 가능
  • deploy mode
    • client
      • Driver Program을 submit한 곳에서 실행
        • 즉 Client Server에서 Driver을 실행
    • cluster
      • Driver Program을 cluster중 무작위 실행
        • 즉 Client Server이외의 worker Node에서 Driver을 실행

Job

  • Spark Application에 제출된 작업
  • N개의 Task로 구성된 병렬 연산 단위
    • Spark Application은 N+1개의 Job으로 구성됨
  • 각 Job은 DAG로 변환된다
  • Dag에서 각각의 Job Node들은 하나 이상의 Spark Stage에 포함됨

Stage

  • N+1개의 Task의 집합
  • 병렬/순차 적으로 수행될 수 있는 작업을 기반으로 생성됨

Task

  • Executor에서 구동하는 최소 실행 단위

실행 순서

Pasted image 20231004170237.png

  • 간단히 보면 위와 같은 방식으로 Job 1 안에 Stage들을 순차적으로 처리 완료 후 job 2를 수 행한다.
  • 처리 순서
    1. SparkContext를 이용하여 RDD연산 정보를 DAG Scheduler에게 전달
    2. DAG를 생성하면, 해당 DAG를 Cluster Manager에게 전달
    3. 이때 Scheduler는 최대한 locality를 높여 stage를 구성
    4. 생성된 DAG를 수행

데이터 구조

  1. Spark_RDD
  2. DataFrame
  3. DataSet

사용 언어

  1. Java
  2. Scala
  3. R
  4. Python

HA

Spark 또한 Master - Slave 구성으로 되어 있기 때문에 HA구성을 만드는 것이 좋다
만약 HA구성을 하지 않으면 SPOF 위험이 생긴다.
구성 시 Zookeeper 등을 이용하여 사용한다

  • 기본 설정
    • SPARK_DAEMON_JAVA_OPTS에 아래 변수들을 추가한다
      • spark.deploy.recoveryMode=ZOOKEEPER
      • spark.deploy.zookeeper.url=
      • spark.deploy.zookeeper.dir=
        • 기본값 : /spark
    • spark-env.sh에 아래와 같이 추가
      • export SPARK_DAEMON_JAVA_OPTS=“-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url={zookeeper url} -Dspark.deploy.zookeeper.dir={zookeeper에서 저장할 경로}”
  • HA구성 하지 않고 단일 복구 모드를 사용하고 싶다면 아래와 같이 하면된다
    • spark-env.sh에 아래와 같이 추가
      - export SPARK_DAEMON_JAVA_OPTS=“-Dspark.deploy.recoveryMode=FILESYSTEM -Dspark.deploy.recoveryDirectory={복구 데이터 경로}”

History Server

Spark의 동작을 확인할 수 있는 Web Server

  • Event Log를 확인 할 수 있다
  • HDSF를 사용한다면 아래와 같이 spark-defaults.conf 에 추가하여 후 start-history-server.sh를 실행하여 구동시켜 사용하면 된다.
spark.eventLog.enabled true // 이벤트로그 저장 여부
spark.eventLog.dir hdfs:///spark-history //이벤트 로그 저장
spark.history.fs.logDirectory hdfs:///spark-history // 종료된 App 로그 저장

보유 기능

  1. SparkStreaming
  2. SparkSQL
  3. SparkMLib
  4. SparkGraphx

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

'프로그래밍 및 IT > Spark' 카테고리의 다른 글

spark-scheduling  (0) 2023.11.28
WordCount  (0) 2023.10.13
RDD Action  (0) 2023.10.13
RDD Transformation  (0) 2023.10.13
Spark_RDD  (0) 2023.10.05

+ Recent posts