아파치 스파크 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 참고 문헌[편집 | 원본 편집]
- https://spark.apache.org/docs/latest/streaming-programming-guide.html#transform
- Spark: The Definitive Guide (O'Reilly)