스트림과 기준 데이터의 조인
스트리밍 조인은 계속 들어오는 레코드를 낮은 지연 시간으로 처리합니다. 전체 테이블을 한꺼번에 조인하는 배치와 달리, 배치 기준 데이터의 로컬 인덱스 또는 스트림별 제한된 캐시를 사용합니다.
스트림과 배치 데이터셋
- 스트림과 배치 데이터셋을 그래프에 추가합니다.
- 배치 데이터셋 아래의 읽기 모드를
Snapshot으로 바꿉니다. - 왼쪽의 스트림에서
Join을 선택하고 배치 데이터셋을 오른쪽 입력으로 지정합니다. Join Type에서Left Lookup Join을 고르고 일치 조건을 입력합니다.
왼쪽은 스트림이거나 Stream 모드로 읽는 배치 데이터셋이어야 합니다.
로컬 조회 인덱스
처음 시작할 때 배치 데이터셋을 스트리밍 클러스터에 내려받아 조회용 인덱스를 만듭니다. 새 트랜잭션이 들어오면 백그라운드에서 새 데이터 view를 내려받고 조회 가능한 형식으로 바꾼 뒤 그 view를 사용합니다. 트랜잭션 발생과 새 조회 데이터 적용은 동시에 일어나는 작업이 아닙니다.
같은 파이프라인에서 배치 입력을 먼저 변환한 뒤 스트림과 조인할 수는 없습니다. 정리가 필요하면 별도 상위 배치 파이프라인에서 변환하여 기준 데이터셋을 만듭니다.
제한
| 조건 | 영향 |
|---|---|
| 기준 Snapshot 데이터셋은 append-only여야 합니다. | 덮어쓰기나 삭제처럼 append가 아닌 트랜잭션이 있으면 빈 결과가 나올 수 있습니다. 이 경우 append 트랜잭션만 사용한 기준 데이터셋으로 다시 구성합니다. |
| 기준 데이터가 약 8~10 GB를 넘습니다. | 조회 성능이 떨어질 수 있습니다. |
| 새 append 트랜잭션이 감지됩니다. | 기준 데이터의 갱신 빈도는 최대 5분에 한 번입니다. |
| 큰 정적 데이터셋을 사용합니다. | 초기 다운로드와 인덱싱으로 클러스터 시작이 느려질 수 있습니다. |
두 스트림 조인
두 스트림을 추가하고 Join에서 양쪽을 선택합니다. Outer Caching Join을 지정하고 일치 조건과 양쪽 캐시의 보관 기간 및 단위를 설정합니다.
스트림 전체를 무한히 보관하지 않고 각 입력의 키별 캐시에 있는 데이터만 조인합니다. 상태는 task manager들에 분산되며, 더 큰 조인에는 task manager의 메모리나 개수를 늘리는 방법을 검토할 수 있습니다.
키별 최신 값
각 입력은 조인 키마다 가장 최근 값 하나만 유지합니다. 왼쪽 레코드는 같은 키의 오른쪽 최신 레코드와 조인합니다. 과거의 같은 키 레코드 전체와 모든 조합을 만드는 배치 조인이 아닙니다.
어느 한쪽의 행이 도착했지만 반대쪽에 일치하는 값이 아직 없으면 반대쪽 열을 null로 채운 행을 즉시 방출합니다. 양쪽 모두 캐시 만료 시간이 필수이며, 만료는 상태가 무한히 커지는 것을 막습니다.
Left 또는 Right 형태로 사용
Outer Caching Join 뒤에 필터를 붙여 필요한 방향의 결과를 남길 수 있습니다.
- Left 형태가 필요하면 왼쪽 레코드가 없는 결과를 제외합니다.
- Right 형태가 필요하면 오른쪽 레코드가 없는 결과를 제외합니다.
존재 여부를 판별할 때는 원래 데이터에서 null이 나올 수 있는 임의의 속성만 사용하지 말고, 해당 입력 행이 존재하는지 구분할 수 있는 열을 사용해야 합니다. 상대 스트림의 미래 도착을 기다려 과거 결과를 배치 outer join처럼 한 번만 완성하는 계약으로 해석하지 않습니다.