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

+ Recent posts