loading
본문 바로가기
Skill-UP/Spark

[Spark] Spark RDD(Resillient Distributed Data)란?

by 개발자 김모씨 2020. 9. 15.
반응형

<Spark RDD(Resillient Distributed Data)란?>

 

안녕하세요.
RDD란? 이라는 글로 돌아온,
개발자 김모씨입니다.

오늘은 스파크의 데이터 구조인 RDD에 대해 알아볼 건데요.
스파크는 기본적으로 RDD들의 흐름에 의해 동작한다고 보시면 됩니다.

스파크가 무엇인지, 스파크의 구조는 어떤지
저번 글을 읽지 않으셔서 아직 모르시는 분들(!)
얼렁 가서 훑고 오시죠!

 

[Spark] Apache Spark(아파치 스파크)란?

빅데이터 빅데이터 빅데이터.... 뉴스에서고, 채용공고에서고 연일 화두에 오르는 키워드이다. 특히 이 글을 보는 당신이 컴공이라면, 마치 족쇄마냥 우리의 진로를 고민하게 만드는 단어일 것��

artist-developer.tistory.com

 

스파크의 데이터 구조는 크게
- RDD (Resillient Distributed Data)
- Dataframe 
- Dataset
세 종류로 구분할 수 있습니다.

이건 스파크에 도입된 시간 순서대로 나열한 것이고,
이번 포스팅에서는 그 중 가장 처음으로 도입된 데이터 구조인, RDD에 대해 알아봅시다.

 

RDD 개념

RDD는 Spark 1.0부터 스파크에 도입되었던 가장 기초적인 데이터 구조입니다.
(현재 버전은 3.0.1)

우선....이름부터 어렵네요......
풀네임인 Resillient Distributed Data를 풀어 설명해보자면,
- Resillient(회복력 있는, 변하지 않는) : 메모리 내부에서 데이터가 손실 시 유실된 파티션을 재연산해 복구할 수 있음
- Distributed(분산된) : 스파크 클러스터를 통하여, 메모리에 분산되어 저장됨
- Data : 파일, 정보 등
입니다.
즉, "회복력 있는 분산 데이터" 정도로 해석할 수 있겠죠.
(저는 여기서 Resillient라는 단어를 난생 처음 봤네요. 이게뭐람......)

여기서 키포인트는 저 Resillient 라는 단어입니다.
여기에 스파크의 핵심 철학이 내포되어 있어요.

RDD는 위의 그림과 같은 Lineage를 가집니다. (Lineage의 사전적 의미 : 혈통) 
RDD는 Resillient 즉, 불변의 특성을 가지는데(Read Only),
그렇기 때문에 특정 동작을 위해서는 기존 RDD를 변형한 새로운 RDD가 생성될 수밖에 없습니다.
그래서 위처럼 Spark 내의 연산에 있어 수많은 RDD들이 생성되게 되는 것이죠.
이 때 생성되는 연산 순서가 바로 Lineage입니다.

특정 동작에 의해 생성되는 RDD Lineage는 DAG(Directed Acyclic Graph)의 형태를 가집니다.
DAG가 생소한 분들을 위해 그림으로 설명하자면,


이런 느낌의 그래프를 의미합니다.
노드간의 순환(cycle : 시작점과 끝점이 같은 형태)이 없으며, 일정항 방향성을 가지기 때문에
각 노드 간에는 의존성이 있으며, 노드 간의 순서가 중요한 형태죠.


이러한 DAG에 의하여, 특정 RDD 관련 정보가 메모리에서 유실되었을 경우,
그래프를 복기하여 다시 계산하고, 자동으로 복구할 수 있습니다.
스파크는 이러한 특성 때문에 Fault-tolerant(작업 중 장애나 고장이 발생하여도 예비 부품이나 절차가 즉시 그 역할을 대체 수행함으로써 서비스의 중단이 없게 하는 특성)를 보장하는 강력한 기능을 가지고 있습니다. (매우 중요!)

 

RDD 동작 원리

앞서 언급한 것처럼, RDD는 스파크의 가장 기본적인 데이터 단위입니다.
모든 작업은 새로운 RDD를 생성하거나/이미 존재하는 RDD를 새로운 RDD로 변형하거나/최종 결과 계산을 위해 RDD에서 연산 API를 호출하는 것 중 하나에 의해 수행됩니다. (Read Only 특성 때문)

 

출처 : https://m.blog.naver.com/tajogood/220783546981

 

RDD의 흐름을 직관적으로 묘사하는 그림입니다.
이처럼 특정 Data source로부터 최종 Data에 도달하기 위해서는,
많은 RDD가 새로 생성되고 변형되는 작업이 발생하죠.

그림 중, TransformationAction에 대한 이야기가 나왔는데, 이에 대해 알아봅시다.

RDD 동작 원리의 핵심Lazy Evaluation(느긋한 연산)이라는 키워드에 있습니다.
Lazy Evaluation이란, 쉽게 말해 즉시 실행하지 않는 것을 의미하죠.
Action 연산자를 만나기 전까지는, Transformation 연산자가 아무리 쌓여도 처리하지 않습니다.
이는 Hadoop의 Map Reduce 동작과 대조적이기 때문에,
Spark는 간단한 operation들에 대한 성능적 이슈를 고려하지 않아도 된다는 장점을 가지고 있습니다.

Transformation(변환) 연산자는 기존 RDD에서 새로운 RDD를 생성하는 동작입니다. (그림의 녹색 화살표)
리턴값이 RDD죠.
위에서 언급한 것처럼,
Transformation에서는 Spark가 실제 연산작업을 수행하지 않아요.
대표적인 Transformation 연산자의 종류로는 아래와 같은 것들이 있습니다.

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

 

Action 연산자는 기록된 모든 작업을 실제 수행하는 연산자입니다. (그림의 파란색 화살표)
리턴값이 데이터 또는 실행 결과죠.
대표적인 Action 연산자의 종류로는 아래와 같은 것들이 있습니다.

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



오늘은 이렇게, 스파크의 가장 기본적인 데이터 구조인 RDD가 무엇인지에 대해 알아보았습니다.
앞으로, Dataframe, Dataset을 천천히 설명해 볼 겁니다.

네~네~ 어렵다는 거 알아요....ㅠㅠ
스파크가 원래 좀 어렵슴다.....

그래도, 최근 데이터 엔지니어링 분야에서 가장 핫한 스파크!!
무엇인지 알고, 다룰 줄 안다는 것 자체가
강력한 무기가 되겠죠??

힘내서 다음 포스트로 가봅시당
고고고고고고고고고

 

 

반응형

댓글