726 words
4 minutes
[DE Design Pattern]05-2. Dynamic Joiner
2. Data Enrichment: Dynamic Joiner
01. Pattern Overview
- Dynamic Joiner는 두 스트리밍 데이터셋을 결합하는 패턴.
- 기본적으로 양쪽 스트림이 모두 동적이기 때문에 단순 JOIN으로는 매칭 실패가 너무 많음
- join의 핵심 컨셉은 **시간 경계(time boundaries)**와 버퍼링
- 버퍼링은 먼저도착한 스트림을 일정시간 버퍼에 보관해서 매칭되는 스트림이 도착할때 까지 기다리는 것
02. GC Watermark와 버퍼링
- 버퍼를 무한히 유지할 수 없으므로 GC(Garbage Collection) Watermark이 필요.
- wartermark는 이 시점 이전의 이벤트는 더 이상 기다리지 않는다는 일종의 threashold값
# Apache Spark Structured Streamingvisits = ( visits_stream .withWatermark("event_time", "10 minutes") # 10분까지 late data 허용)
ads = ( ads_stream .withWatermark("display_time", "10 minutes"))
# 비즈니스 룰: 광고는 방문 후 최대 2분 이내에 표시visits_with_ads = visits.join( ads, expr(""" page = visit_page AND display_time BETWEEN event_time AND event_time + INTERVAL 2 MINUTES """), "left_outer")03. Temporal Table JOIN (Apache Flink)
Flink의 Temporal Table Function은 특정 시점의 최신 값을 자동으로 가져오는 조인방식
# 개념 (Flink Java API)# 1. 각 테이블에 watermark 설정# visits: watermark = event_time - 1 minute# ads: watermark = update_time - 1 minute
# 2. Temporal Table Function 생성# ads_lookup = ads_table.create_temporal_table_function(# time_attr="update_time", primary_key="ad_page"# )
# 3. joinLateral로 "event_time 시점의 최신 ad" 매칭# result = visits.join_lateral(ads_lookup(event_time))Spark의 시간 범위 조인은 양쪽 버퍼를 유지하는 반면, Flink의 Temporal Table은 한쪽(ads)의 최신 스냅샷만 유지
04. 주요 트레이드오프
- Space vs Exactness: 버퍼를 크게 잡으면 조인 성공률이 높아지지만 리소스 비용 증가. 작게 잡으면 비용은 줄지만 매칭 실패 증가
- Late data: GC Watermark이 이미 지나간 뒤 도착하는 레코드는 조인 불가. Chapter 3의 Late Data 처리 패턴과 결합 필요
- 100% 보장 불가: Static이든 Dynamic이든 late data로 인해 완벽한 조인 결과를 보장할 수 없음. 추가적인 late data 추적/통합이 필요
Concept
- Dynamic Joiner : 두 스트리밍 데이터셋을 시간 경계와 버퍼링을 활용하여 결합하는 패턴
- GC Watermark : 버퍼에서 오래된 레코드를 제거하는 임계값. 무한 버퍼 증가를 방지
- Time Boundaries : 두 스트림 간 허용되는 지연 차이를 정의하는 시간 조건ㅓ
- Watermark : 스트림 처리에서 “이 시점 이전의 event_time data는 더 이상 도착하지 않을 것이라 판단하는”하는 일종의 경계선. event_time progress pointer
- Temporal Table Function : Flink의 기능으로, 특정 시점의 가장 최신 참조 값을 자동 매칭하는 조인 방식
- Space vs Exactness Trade-off : 버퍼 크기(리소스)와 조인 정확도 간의 균형 문제
- Stream-to-Stream JOIN : 양쪽 모두 동적인 스트림 간 결합. Static Joiner와 달리 시간 관리가 필수
[DE Design Pattern]05-2. Dynamic Joiner
https://yjinheon.netlify.app/posts/02de/de-design-pattern/05_data_value/05-02-dynamic_joiner/