RDD?
Resilient Distributed Dataset
의 약자로써 Spark의 최초에 도입된 데이터 구조- Resilient ( 회복력 있는, 불변의)
- 메모리 내 데이터가 손실되도
복구 가능
하고,생성된 데이터는 불변
이다. - 복구는 데이터를 저장하는 것이 아닌 새로 만들어 복구한다
- 메모리 내 데이터가 손실되도
- Distributed (분산된)
- Spark Cluster를 통해 메모리에 분산되어 있음
- Dataset
- 데이터
- 즉
데이터는 여러 서버에 분산되어 저장
되고, 처리할 때동시에 병렬로 처리가능
하고 일부 서버에서장애 발생시 복구가 가능
하다.- 데이터 요소가 모인 집합
- 스파크 클러스터에 나눠져 저장됨
- Resilient ( 회복력 있는, 불변의)
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로 동작하여 이미 동작해야 할 것을 알고 있기에 최적화된 방식으로 동작한다
- 위 그림처럼 프로그래머가 최적화 하지 않고 수행한다면 A처럼 순서에 따라 동작할 것이다
- 하지만 Lazy하게 동작하여 자동으로 최적화 된다면 B처럼 동작할 수 있다
Transformation
- 기존의 RDD를 새로운 RDD로 생성하는 것.
- 이름 그대로 RDD에 변형이 발생하는 것.
- e.g) Filter , Join …
- 이름 그대로 RDD에 변형이 발생하는 것.
- Transformation은
Action Function
이 호출되기 전까지는 Lineage만 생성하고 쌓아둔다 - Return 값은 RDD 이다
- RDD01를 이용하여 RDD02를 생성하는 것.
- Transformation은 2개로 구분된다
- narrow dependency
- 위 그림과 같이 단순히 더하는 것 과 같이
Partition 이동이 없고
,Shuffle이 발생하지 않는
상황 - 즉 다른 Partition에 존재하는 데이터를 알 필요 없는 연산
- e.g
val rdd2 = rdd2.map(case (key,value) => (key,value +1))
- e.g
- 위 그림과 같이 단순히 더하는 것 과 같이
- wide dependency
- 위 그림과 같이 단순히 더하는 것 과 같이
Partition 이동이 있거
나 ,Shuffle이 발생
하는 상황 - 즉 서로 다른 Partition에 존재하는 데이터를 참조해야 하는 연
- e.g
val rdd3 = rdd2.reduceByKey(_ + _ )
- e.g
- 위 그림과 같이 단순히 더하는 것 과 같이
Action
- 실질적으로 연산을 하는 연산자
- 즉 , return 값이 데이터 혹은 실행 결과인 것
Lazy evaluation
에 따라Action Function
이 호출 될 때 연산을 시작한다.- 한번에 실행시키기 때문에 최적화된 방법으로 처리할 수 있다.
- collect(), count() 등이 있다.
Lineage
- Resilient를 만족 시킬때 RDD는 실질적인 데이터를 저장하는 것이 아니라, 작업 내용을 기억하고 있는 것이다.
- 이러한 작업 과정 읽기 전용 모델로 만든 것을 Lineage라고 부른다.
- Lineage는 Dag의 형태로 구성되어있다.
Dag
Directed Acyclic Graph
즉 방향성을 가진 그래프
- 노드간 순환이 없고, 순서가 중요하다.
- 만약 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 |