Apache Flink — 스트림을 엔진으로 돌린다 · 패턴 인식 (MATCH_RECOGNIZE) · 실습
무차별 대입과 카드 시험을 패턴으로 잡는다
목표
로그인·결제 사건에서 MATCH_RECOGNIZE 로 무차별 대입(실패 3번 이상 뒤 성공)과 카드 시험(로그인 뒤 소액 결제 뒤 큰 결제)을 찾고, AFTER MATCH SKIP 전략 · WITHIN · 탐욕/비탐욕 · 워터마크 지연이 매치를 어떻게 바꾸는지 확인한다.
왜 중요한가
탐지 규칙은 "연달아 · 그 뒤에 · 얼마 안에" 처럼 행의 순서에 대한 조건이라 GROUP BY 나 창 집계로는 못 쓴다. MATCH_RECOGNIZE 는 이것을 선언적으로 쓰게 해 주지만, 같은 패턴도 전략·수량자·시간 제한에 따라 경보 수가 몇 배로 달라진다. 이 실습의 채점기는 클러스터에 묻지 않는다. 원본 파일에서 같은 규칙으로 매치를 파이썬으로 다시 찾아 여러분의 sql-client 출력과 한 행씩 대조한다.
단계
1. flink-up 뒤 /root/flink/cep/ddl.sql 에 cep_events.csv 를 읽는 events 표(워터마크 ts - INTERVAL '1' SECOND)를 만들고, 종류(kind)별 건수 n 을 내는 /root/flink/cep/count.sql 의 출력을 /root/flink/cep/count.out 에 저장하세요.
2. 무차별 대입 패턴(F{3,} S, AFTER MATCH SKIP PAST LAST ROW)의 /root/flink/cep/brute.sql 출력을 /root/flink/cep/brute.out 에 저장하세요. 열은 user_id, first_fail, fails, ok_ts.
3. 전략만 SKIP TO NEXT ROW 로 바꾼 /root/flink/cep/nextrow.sql 의 출력을 /root/flink/cep/nextrow.out 에 저장하세요.
4. 2단계 패턴에 WITHIN INTERVAL '30' SECOND 를 더한 /root/flink/cep/within.sql 의 출력을 /root/flink/cep/within.out 에 저장하세요.
5. 카드 시험 패턴(S T+ B, 탐욕)의 /root/flink/cep/greedy.sql 출력을 /root/flink/cep/greedy.out 에 저장하세요. 열은 user_id, login_ts, small_n, big_amount, big_ts.
6. T 수량자만 비탐욕(T+?)으로 바꾼 /root/flink/cep/reluctant.sql 의 출력을 /root/flink/cep/reluctant.out 에 저장하세요.
7. cep_events_shuffled.csv 를 워터마크 지연 10초로 읽는 /root/flink/cep/ddl-shuffled.sql, 0초로 읽는 /root/flink/cep/ddl-shuffled0.sql 을 만들어 brute.sql 을 각각 돌린 출력을 /root/flink/cep/shuffled.out·/root/flink/cep/shuffled0.out 에 저장하세요.
8. /root/flink/cep/report.json 에 매치 수와 금액 합을 모으세요.
참고
- 원본 열:
user_id STRING, kind STRING, amount INT, ts TIMESTAMP(3)(머리글 없는 CSV).kind는FAIL(로그인 실패) ·OK(로그인 성공) ·PAY(결제). ts 는 파일 전체에서 겹치지 않는 초 단위입니다. cep_events_shuffled.csv는 같은 행을 도착 순서만 흐트러뜨린 파일입니다. 어떤 행도 자기보다 8초 넘게 뒤의 행보다 늦게 도착하지 않습니다.- 표 정의를 되풀이하지 않으려면
sql-client.sh -i ddl.sql -f brute.sql > brute.out 2>&1. 스트리밍 결과라 출력 맨 앞에op열(+I)이 붙고 끝에Received a total of N rows가 찍힙니다. - 카드 시험 조건:
S AS S.kind = 'OK',T AS T.kind = 'PAY' AND T.amount < 20,B AS B.kind = 'PAY' AND B.amount >= 10. MEASURES 는S.ts AS login_ts, COUNT(T.amount) AS small_n, B.amount AS big_amount, B.ts AS big_ts. - 흔한 실수: 패턴 변수 사이에 다른 행이 끼면 매치가 안 됩니다(엄격한 연속). 마지막 변수에는 탐욕 수량자를 붙일 수 없습니다.
- 공식 문서: [Pattern Recognition](https://nightlies.apache.org/flink/flink-docs-release-2.3/docs/sql/reference/queries/match_recognize/) · [Time Attributes](https://nightlies.apache.org/flink/flink-docs-release-2.3/docs/concepts/sql-table-concepts/time_attributes/) · [Timely Stream Processing](https://nightlies.apache.org/flink/flink-docs-release-2.3/docs/concepts/time/)
8단계
- 사건 표를 만들고 센다
- 실패 세 번 이상 뒤 성공
- SKIP TO NEXT ROW 로 바꾼다
- 30초 안에 끝난 것만
- 카드 시험 — 탐욕 수량자
- 비탐욕으로 바꾼다
- 흐트러진 도착 순서와 워터마크
- 보고서 — 규칙이 경보 수를 정한다