아파치 스파크(Apache Spark)는 대규모 데이터 처리를 위한 분산 컴퓨팅 프레임워크로, 다양한 연산(Transformation 및 Action)을 제공한다. 스파크 연산은 크게 변환(Transformation)과 액션(Action)으로 나뉘며, 이들을 활용하여 데이터를 효율적으로 처리할 수 있다.
연산의 종류
아파치 스파크의 연산은 크게 두 가지로 나뉜다.
- Transformation(변환) - 기존 RDD(Resilient Distributed Dataset)에서 새로운 RDD를 생성하는 연산.
- Action(액션) - RDD에서 연산을 수행하고 최종 결과를 반환하는 연산.
Transformation 연산
Transformation 연산은 지연 실행(lazy evaluation)을 기반으로 동작하며, 액션이 호출될 때까지 실행되지 않는다.
주요 Transformation 연산
연산 | 설명 | 예제 |
---|---|---|
map | 각 요소에 함수를 적용하여 새로운 RDD를 생성 | rdd.map(lambda x: x * 2) |
flatMap | 각 요소를 여러 개의 출력 요소로 변환 | rdd.flatMap(lambda x: x.split(" ")) |
filter | 조건을 만족하는 요소만 포함하는 RDD 생성 | rdd.filter(lambda x: x % 2 == 0) |
distinct | 중복 요소를 제거한 새로운 RDD 생성 | rdd.distinct() |
union | 두 개의 RDD를 병합하여 하나의 RDD 생성 | rdd1.union(rdd2) |
intersection | 두 개의 RDD에서 공통 요소만 포함 | rdd1.intersection(rdd2) |
subtract | 첫 번째 RDD에서 두 번째 RDD의 요소를 제거 | rdd1.subtract(rdd2) |
cartesian | 두 개의 RDD의 데카르트 곱을 생성 | rdd1.cartesian(rdd2) |
Action 연산
Action 연산은 RDD에서 연산을 수행하고 결과를 반환하는 연산이다. Action 연산이 호출될 때, 스파크는 지연 실행된 Transformation을 실행하여 최종 결과를 생성한다.
주요 Action 연산
연산 | 설명 | 예제 |
---|---|---|
collect | RDD의 모든 요소를 리스트로 반환 | rdd.collect() |
count | RDD의 요소 개수를 반환 | rdd.count() |
first | RDD의 첫 번째 요소를 반환 | rdd.first() |
take(n) | RDD의 처음 n개 요소를 반환 | rdd.take(5) |
reduce | RDD의 모든 요소에 연산을 적용하여 단일 값 반환 | rdd.reduce(lambda a, b: a + b) |
foreach | 각 요소에 대해 함수를 실행 (반환 없음) | rdd.foreach(lambda x: print(x)) |
Key-Value 기반 연산
아파치 스파크는 Key-Value 형태의 RDD(Pair RDD)에 대해 다양한 연산을 제공한다.
주요 Key-Value 연산
연산 | 설명 | 예제 |
---|---|---|
reduceByKey | 동일한 키를 가진 값들을 집계 | rdd.reduceByKey(lambda a, b: a + b) |
groupByKey | 동일한 키를 가진 값들을 그룹화 | rdd.groupByKey() |
sortByKey | 키를 기준으로 정렬 | rdd.sortByKey() |
join | 두 개의 Key-Value RDD를 조인 | rdd1.join(rdd2) |
leftOuterJoin | 왼쪽 RDD의 모든 키와 오른쪽 RDD에서 일치하는 키를 조인 | rdd1.leftOuterJoin(rdd2) |
rightOuterJoin | 오른쪽 RDD의 모든 키와 왼쪽 RDD에서 일치하는 키를 조인 | rdd1.rightOuterJoin(rdd2) |
연산 최적화 기법
아파치 스파크에서는 성능을 최적화하기 위해 다양한 기법을 활용한다.
- 캐싱(Caching)과 체크포인팅(Checkpointing) - 반복 사용되는 RDD를 메모리에 저장하여 성능을 향상.
- 파티셔닝(Partitioning) - 데이터를 균등하게 분배하여 작업 부하를 줄임.
- Shuffling 최소화 - reduceByKey는 groupByKey보다 적은 Shuffling을 발생시켜 성능이 좋음.
- BroadCast Variable - 모든 워커 노드에서 공통적으로 사용하는 변수를 캐싱하여 네트워크 비용 절감.