IT용어위키



아파치 스파크 RDD reduceByKey

Apache Spark RDD reduceByKey(아파치 스파크 RDD reduceByKey)는 키-값(Key-Value) 형식의 RDD에서 동일한 키를 가진 값들을 그룹화하여 연산을 수행하는 집계(aggregation) 연산이다. `reduceByKey`는 키별로 데이터를 병합하며, 동일한 키를 가진 데이터를 같은 파티션에서 연산하여 성능을 최적화한다.

개요

`reduceByKey` 연산은 키-값 RDD에서 동일한 키를 가진 값들에 대해 지정된 이항 연산(Binary Function)을 적용하여 하나의 값으로 축소(reduce)하는 연산이다. 이는 `groupByKey`와 유사하지만, 불필요한 데이터 셔플링을 방지하여 성능이 향상된다.

  • 키별로 병렬 연산 수행
    • 동일한 키를 가진 데이터를 같은 파티션에서 연산하여, 불필요한 네트워크 전송을 줄인다.
  • 연산자는 결합 법칙을 만족해야 함
    • 키별로 값을 병합하는 과정에서 파티션 간 연산이 이루어진다.

문법

`reduceByKey`는 키-값 쌍의 RDD에서 사용되며, 스칼라(Scala)와 파이썬(Python)에서 다음과 같이 정의된다.

Scala

def reduceByKey(func: (V, V) => V): RDD[(K, V)]

Python

def reduceByKey(func: Callable[[V, V], V]) -> RDD[Tuple[K, V]]

사용 예제

1. Scala에서의 reduceByKey 사용 예제

import org.apache.spark.{SparkConf, SparkContext}

val conf = new SparkConf().setAppName("RDD ReduceByKey Example").setMaster("local")
val sc = new SparkContext(conf)

val rdd = sc.parallelize(Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("a", 5)))

// 키별로 값 합산
val result = rdd.reduceByKey(_ + _).collect()

result.foreach(println)  
// 출력: ("a", 9), ("b", 6)

2. Python에서의 reduceByKey 사용 예제

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("RDD ReduceByKey Example").getOrCreate()
sc = spark.sparkContext

rdd = sc.parallelize([("a", 1), ("b", 2), ("a", 3), ("b", 4), ("a", 5)])

# 키별로 값 합산
result = rdd.reduceByKey(lambda x, y: x + y).collect()

print(result)  
# 출력: [('a', 9), ('b', 6)]

reduceByKey와 groupByKey의 차이

`reduceByKey`는 `groupByKey`와 비슷한 기능을 수행하지만, 성능 차이가 크다. `groupByKey`는 모든 데이터를 셔플링한 후 그룹화하지만, `reduceByKey`는 파티션별로 사전 병합을 수행하여 네트워크 비용을 줄인다.

reduceByKey와 groupByKey 비교
연산 셔플링 비용 키별 연산 수행 방식 사용 예제
`groupByKey` 높음 모든 값을 그룹화 후 연산 `rdd.groupByKey().mapValues(sum)`
`reduceByKey` 낮음 파티션별로 사전 연산 후 병합 `rdd.reduceByKey(_ + _)`

reduceByKey의 내부 동작 방식

1. 각 파티션에서 동일한 키를 가진 데이터를 먼저 로컬에서 병합한다. 2. 병합된 데이터만 네트워크를 통해 전송하여 셔플링 비용을 줄인다. 3. 최종적으로 모든 데이터를 합쳐 하나의 값으로 축소한다.

동작 예시

RDD = `[("a", 1), ("b", 2), ("a", 3), ("b", 4), ("a", 5)]`, 연산 `+`를 수행할 경우:

1. 파티션 1에서 "a" 값 병합 → ("a", 1 + 3) → ("a", 4)
2. 파티션 2에서 "b" 값 병합 → ("b", 2 + 4) → ("b", 6)
3. 파티션 3에서 "a" 값 유지 → ("a", 5)
4. 최종 병합: ("a", 4 + 5) → ("a", 9), ("b", 6)

주의점 및 성능 고려사항

  • `reduceByKey`에서 사용하는 연산자는 결합 법칙(Associativity)을 만족해야 한다.
  • RDD의 파티션 수가 많을수록 성능이 향상될 수 있다.
  • `groupByKey`보다 `reduceByKey`를 사용하는 것이 일반적으로 더 효율적이다.

같이 보기

참고 문헌


  출처: IT위키(IT위키에서 최신 문서 보기)
  * 본 페이지는 공대위키에서 미러링된 페이지입니다. 일부 오류나 표현의 누락이 있을 수 있습니다. 원본 문서는 공대위키에서 확인하세요!