PyFlink로 Kafka 소스 windowed aggregation 구현
실습 순서
- 가상환경에서 `pip install apache-flink`를 실행한다.
- 간단한 Python 프로듀서(또는 kafka-console-producer)로 `sensor-readings` 토픽에 `{"sensor_id": "A", "temperature": 23.5, "event_time": <ms>}` 형태의 JSON 이벤트를 몇 초 간격으로 계속 흘려보낸다.
- PyFlink 스크립트를 작성한다: Kafka 소스 연결 → JSON 파싱 → Day 2에서 배운 event_time 기준 WatermarkStrategy.forBoundedOutOfOrderness(초 단위) 적용 → keyBy(sensor_id) → Day 3에서 배운 Tumbling Window(1분) → 평균 온도 집계.
- 스크립트를 실행하고, 콘솔(또는 print sink)에 1분마다 sensor_id별 평균 온도가 찍히는지 관찰한다.
- Flink Web UI의 Jobs 탭에서 방금 제출한 잡이 RUNNING 상태로 보이는지, 처리된 레코드 수(Records Sent/Received)가 올라가는지 확인한다.
기대 결과
1분(윈도우 크기)마다 sensor_id별 평균 온도 값이 콘솔에 출력되고, Flink Web UI의 잡 그래프에서 소스→keyBy→window→sink로 이어지는 연산자 체인과 레코드 처리량을 확인할 수 있다.
Troubleshooting
PyFlink 스크립트가 Kafka 커넥터를 못 찾는다는 에러
PyFlink는 Kafka 커넥터 jar를 별도로 다운로드해 classpath에 추가해야 한다(pip 패키지에 기본 포함 안 됨) — 공식 문서의 'Kafka SQL Connector' 다운로드 안내를 따른다.
윈도우 결과가 전혀 안 찍힌다
watermark가 윈도우 종료 시점을 넘어서야 결과가 나온다는 점(Day 3-1)을 다시 떠올려본다 — 프로듀서가 계속 새 이벤트를 보내고 있는지, event_time이 실제로 증가하고 있는지 확인.