아파치 스파크 DStream transform

IT 위키

DStream의 transform 연산은 각 배치 간격마다 생성되는 RDD에 대해 직접적인 RDD 연산을 적용할 수 있게 해주는 고급 연산이다. DStream API의 고수준 추상화(map, reduceByKey 등)로는 처리할 수 없는 복잡한 연산이나 외부 RDD와의 연산을 가능하게 한다.

1 개념[편집 | 원본 편집]

  • transform 연산은 DStream 내부의 RDD를 직접 받아서 처리할 수 있는 유일한 API다
  • 즉, 각 배치 시점마다 다음과 같은 방식으로 동작:
    • rdd → func(rdd) 를 수행한 결과로 새로운 RDD를 생성
  • 외부의 정적 RDD와 조인하거나, Spark SQL처럼 DStream 이외의 기능을 결합할 때 유용함

2 문법[편집 | 원본 편집]

new_dstream = original_dstream.transform(lambda rdd: some_operation(rdd))

3 예시 1: 외부 RDD와의 조인[편집 | 원본 편집]

# 정적 사용자 정보 RDD
user_info = sc.parallelize([("user1", "Alice"), ("user2", "Bob")])

# DStream: (user_id, event)
events = ssc.socketTextStream("localhost", 9999) \
             .map(lambda line: line.split(",")) \
             .map(lambda fields: (fields[0], fields[1]))

# 조인 연산
joined = events.transform(lambda rdd: rdd.join(user_info))

4 예시 2: DStream 내 RDD를 동적으로 필터링[편집 | 원본 편집]

def dynamic_filter(rdd):
    blacklist = ["error", "fail", "unauthorized"]
    return rdd.filter(lambda word: word not in blacklist)

filtered = word_dstream.transform(dynamic_filter)

5 특징[편집 | 원본 편집]

  • 고급 사용자 정의 로직 삽입 가능
  • 정적 RDD 또는 외부 DB, 캐시 등과 통합 가능
  • map, flatMap 등 기본 연산보다 자유도 높음

6 주의사항[편집 | 원본 편집]

  • transform 함수 내부에서는 반드시 RDD 연산만 사용해야 하며, DStream 연산은 사용 불가
  • 외부 리소스에 접근할 경우 성능 및 안정성을 고려해 캐싱, 브로드캐스트 등의 전략 필요
  • 디버깅이 어렵기 때문에 체크포인팅과 로그 추적이 중요함

7 같이 보기[편집 | 원본 편집]

8 참고 문헌[편집 | 원본 편집]