[스터디] 스파크 완벽 가이드 13일차

Kristopher·2022년 2월 2일
0

Spark 스터디

목록 보기
13/16

Chapter 13 RDD 고급개념

Key-Value 형태의 RDD

RDD에는 key-value형태의 데이터를 다룰 수 있는 다양한 메서드가 존재한다. 이러한 메서드들은 <연산명>ByKey 형태의 이름을 가지며 PairRDD타입만 사용할 수 있다. PairRDD타입을 만드는 가장 간단한 방법은 RDD에 Map연산을 수행해 key-value구조로 만드는 것이다.

keyBy() : 현재 값으로부터 키를 생성
mapValues() : (튜플 사용시)튜플의 첫 번째 요소를 key, 두 번째 요소를 value로 지정
collect() : key나 value 전체 추출
lookup() : 특정 key에 대한 결과 찾기
sampleByKey() : RDD를 한번만 처리하면서 무작위 샘플링을 사용하여 RDD 샘플 생성

집계

countByKey() : 각 key의 아이템 수를 구하고 로컬 맵으로 결과를 수집
groupByKey() : 해당 키와 관련된 모든 값을 메모리로 읽어 처리(OutOfMemoryError 발생가능)
reduceByKey() : 리듀스 작업을 수행하여 모든 값을 메모리에 유지하지 않음
aggregate() : 두 함수를 파라미터로 받아, 첫 함수는 파티션 내에서, 두번째 함수는 모든 파티션에서 실행
aggregateByKey() : aggregate와 유사. 파티션 대신 키를 기준으로 연산
combineByKey() : 집계 함수 대신 컴파이너를 사용
foldByKey() : 결합 함수와 항등원인 제로값을 이요해 각 키의 값을 병합

cogroup

스칼라 사용시 최대 3개, 파이썬 사용시 최대 2개의 key-value 형태의 RDD를 그룹화할 수 있으며, 각 키를 기준으로 결합한다. 즉, RDD에 대한 그룹 기반의 조인을 수행한다. 출력 파티션 수나 클러스터에 데이터 분산 방식을 정확하게 제어하기 위해 사용자 정의 파티션 함수를 파라미터로 사용할 수 있다.

조인

fullOuterJoin() : 외부 조인
leftOuterJoin() : 왼쪽 외부 조인
rightOuterJoin() : 오른쪽 외부 조인
cartesian() : 교차조인
zip() : 두개의 RDD를 결합하지만 진자 조인은 아니다.

파티션 제어하기

RDD를 사용하면 데이터가 클러스터 전체에 물리적으로 정확히 분산되는 방식을 정의할 수 있다. 이러한 기능을 가진 메러드들은 구조적 API와 달리 파티션 함수를 파라미터로 사용할 수 있다. 파티션 함수는 보통 사용자 지정 파티셔너를 의미한다.

coalesce() : 데이터의 셔플링 없이 하나의 파티션으로 합칠 때 사용
repartition() : 파티션수를 늘리거나 줄일 때 사용

사용자 정의 파티셔닝은 RDD를 사용하는 가장 큰 이유 중에 하나이다. 구조적 API에서는 사용할 수 없으며, 저수준 API의 세부적인 구현 방식이다. 사용자 정의 파티셔닝의 유일한 목표는 Data Skewness와 같은 문제를 피하고자 클러스터 전체에 데이터를 균등하게 분배하는 것이다. 사용자 정의 파티셔닝을 사용하기 위해선 Partitioner를 확장한 클래스를 구현해야 한다.

사용자 정의 직렬화

병렬화 대상인 모든 객체나 함수는 직렬화할 수 있어야 한다. 이때 기본 직렬화 기능의 속도가 느려 Kryo 라이브러리를 활용해 더 빠르게 객체를 직렬화 할 수 있다. 사용자가 직접 클래스를 등록해야 한다는 점 때문에 기본값으로 설정되어있지는 않다. Kryo에 사용자 정의 클래스를 등록하기 위해서는 registerKryoClasses 메서드를 사용한다.

Reference

스파크 완벽 가이드
아파치 스파크

profile
개발자 지망생입니다.

0개의 댓글