Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/BigData

Apache Spark 자료구조 - RDD

DH’s Blog 2023. 11. 9. 13:06
반응형

 

지난 시간에 스파크의 등장배경과 아키텍처 구조에 대해 살펴보았다. 아직 보지 못했다면 아래 페이지를 참고하도록 하자. 이번 시간에는 스파크 자료구조 중 하나인 RDD에 대해서 자세히 알아보도록 하자.

2023.11.09 - [[기술공부]/BigData] - Apache Spark에 대하여 - 등장 배경과 아키텍처

 

Apache Spark에 대하여 - 등장 배경과 아키텍처

대규모 빅데이터를 저장하고 처리하기 위해 Hadoop이 등장하게 되었지만 시간이 지나면서 성능적으로 아쉬운 부분이 생기게 되었다. 하둡의 이러한 부분을 보완하기 위해 등장한 것이 Apach Spark이

developers-haven.tistory.com

 

 

🔎 Spark Application 구현방법
Spark v1 → RDD
Spark v2 → DataFrame, DataSet

 

RDD(Resilient Distributed DataSet)

Spark v1에서는 드라이버가 RDD API를 이용하여 인메모리 데이터를 처리하는 방식을 가진다. RDD내의 데이터들은 클러스터 노드에 분산되어 병렬처리 되어지고 아래 그림의 원리를 하나씩 알아보도록 하자.

 


1. RDD에 대하여

RDD 연산 Flow

 

 ▪️ 변경이 불가능한 데이터 모음(객체)를 가리킨다.

 ▪️ RDD를 변경하기 위해서는 새로운 RDD를 생성하거나, 연산 작업 등을 통해 새로운 결과를 받아야 한다.

 ▪️ 새로운 RDD를 생성하는 것을 트랜스포메이션(transformation), 연산 작업으로 결과를 얻는 것을 액션(action)이라 한다.

 ▪️ RDD는 내부적으로 데이터를 생성하여 처리하거나, 외부 데이터를 읽어서 처리할 수 있다.

 

 

 

 

 

 


2. RDD연산에 대하여(Transformation & Action)

transformation & action

(1) 트랜스포메이션과 액션이란?

 ▪️ 트랜스포메이션(transformation) : RDD를 이용하여 새로운 RDD를 반환하는 것

 ▪️ 액션(action) : 연산 작업 등을 처리하여 RDD로부터 새로운 결과를 반환하는 것

 

Spark는 지연처리(lazy evaluation)를 지원하며 lineage를 가진다. 지연 처리가 가능한 이유는 Spark는 트랜스포메이션에 대한 메타데이터(metadata)를 저장하고 있어서 액션이 호출되면 해당 메타데이터를 기반으로 RDD를 처리하기 때문이다.

 

지연처리란?
 ▪️ 트랜스포메이션 호출 시에는 연산 수행과정을 기록만 하고, 실제 액션이 호출되면 메모리에 데이터를 올려서 작업을 처리하는 방식

lineage란?
 ▪️
RDD가 생성되는 순서를 나타내며, RDD 생성 과정을 모두 기록하고 있어서 fault-tolerance를 보장한다.
 ▪️ 특정 RDD에 대한 정보가 메모리에서 유실되어도 그래프를 복기하여 다시 복구가 가능하다.

 

 

 

 

 

(2) 트랜스포메이션 종류

narrow & wide Transformation

 

#narrow transformation

 ▪️ 하나의 연산을 처리하기 위한 데이터가 하나의 클러스터 노드에 있는 것을 의미한다.

 ▪️ map, filter, union 연산을 예로 들 수 있다.

 

 

#wide transformation

 ▪️ 하나의 연산을 처리하기 위한 데이터가 여러 클러스터 노드에 분산되어 저장되어 있는 것을 의미한다.
 ▪️ 데이터가 분산되어 있어서 메모리 간의 전달량이 많아지고, 네트워크 연산 처리량이 증가하게 된다.

 ▪️ 즉, 여러 파티션에 걸쳐있는 데이터로 연산 처리가 필요할 때 발생하며 상황에 따라 shuffle이 발생한다.

 ▪️ join, groupByKey, reduceByKey 연산을 예로 들 수 있다.

 

 

 

 

 

(3) DAG(Directed Acyclic Graph)

DAG

 

 ▪️ RDD가 생성되는 연산 순서를 lineage라 하며, lineage는 DAG 형태를 가진다.

 ▪️ DAG는 노드의 순환이 없고 일정한 방향성을 가지기 때문에 노드 간에 서로 의존성을 가지고 있다.

 ▪️ DAG 구조 특징상 RDD 연산 과정에서 특정 RDD 정보가 메모리에서 유실되어도 그래프를 복기하여 다시 계산해서 복구가능하다. (fault-tolerance 보장)

 

 

 


3. RDD 코드 예시 (python)

case1. 내부 데이터 이용하기

내부 데이터를 이용하는 경우 parallelize() 메소드를 이용하여 처리한다.

 

예시 - 내부 데이터를 정의하여 RDD를 생성하고 트랜스포메이션과 액션 연산을 처리해본다.

from pyspark import SparkContext
sc = SparkContext.getOrCreate() # RDD는 SparkContext 객체 사용

data = [1,2,3,4,5] # 내부 데이터 정의
rdd1 = sc.parallelize(data) # RDD 생성

# transformation (작업 구성)
rdd2 = rdd1.map(lambda x : x*x) # [1,4,9,16,25]

# action (작업 처리)
result = rdd2.reduce(lambda a,b : a+b) # rdd2 전체합 = 1+4+9+16+25

print(result) # 55 결과 확인

case1 실행결과

 

 

 

 

case2. 외부 데이터 이용하기

외부 데이터를 이용하는 경우 textFile() 메소드를 이용하여 처리한다.

 

예시 - 텍스트 데이터를 이용하여 RDD를 생성하고 텍스트 파일을 합치는 트랜스포메이션과 연산을 처리해본다.

from pyspark import SparkContext
sc = SparkContext.getOrCreate() # RDD는 SparkContext 객체 사용

rdd1 = sc.textFile("/content/sample_data/data1.txt")
rdd2 = sc.textFile("/content/sample_data/data2.txt")

# transformation (rdd1,rdd2를 합친다)
rdd3 = rdd1.union(rdd2)

for rd in rdd3.collect(): # action (collect()는 처리 결과를 배열로 반환해주는 액션 함수)
  print(rd)

case2 실행결과

 

 

나의 경우 파이썬을 기준으로 실습을 해보았고 추가 트랜스포메이션, 액션에 사용되는 함수는 아래 페이지를 참고할 수 있다.

https://spark.apache.org/docs/2.0.2/api/scala/index.html#org.apache.spark.rdd.RDD

 

https://spark.apache.org/docs/2.0.2/api/scala/index.html#org.apache.spark.rdd.RDD

 

spark.apache.org

 

 

 

 

 

 

 


 

이번 시간에는 RDD가 무엇인지에 대해서 살펴보았고, 더 확실히 이해하기 위해 파이썬을 이용하여 실습을 진행해보았다. RDD는 다양한 언어를 지원하기 때문에 본인에게 더 익숙한 언어로 실습해보는 것을 추천한다. (두번째 실습에서 사용한 텍스트 파일은 함께 첨부해놨으니 이용하길) 그럼 다음시간에는 RDD에 이어서 또 다른 자료구조인 DataFrame, DataSet에 대해서 배워보도록 하자.

 

 

참고 사이트
https://luminousmen.com/post/spark-core-concepts-explained
https://wikidocs.net/28473
https://1004jonghee.tistory.com/entry/Spark-RDD
https://zrr.kr/4y9S

 

data1.txt
0.00MB
data2.txt
0.00MB

반응형