Apache Beam을 사용하여 스트리밍 BigQuery 테이블 위에 구현 한 작은 델타 작업에 이상한 문제가 있습니다.BigQuery의 델타 작업에서 레코드가 누락됩니다.
데이터를 BigQuery 테이블에 스트리밍하고 매 시간마다 스트리밍 테이블의 새 레코드를 조정 된 테이블에 복사하는 작업을 실행합니다. 델타는 스트리밍 테이블에 도입 된 CreateDatetime 열 위에 구축됩니다. 레코드가 스트리밍 테이블에로드되면 현재 UTC 타임 스탬프를 가져옵니다. 따라서 델타는 당연히 배치가 실행되는 현재 시간까지 지난 시간보다 새로운 CreateDatetime을 갖는 모든 레코드를 가져옵니다.
1. Start: LastDeltaDate = 2017-01-01 00:00:00
2. 1st Delta Run:
- NowUTC = 2017-10-01 06:00:00
- LastDeltaDate = 2017-01-01 00:00:00
- at the end of the successful run LastDeltaDate = NowUTC
3. 2nd Delta Run:
- NowUTC = 2017-10-01 07:00:00
- LastDeltaDate = 2017-10-01 06:00:00
- at the end of the successful run LastDeltaDate = NowUTC
...
를 지금은 내 스트리밍 테이블에 있지만 내 화해 테이블에 도착하지 않을 기록을 찾아 매일 다음과 같이
CreatedDatetime >= LastDeltaDate AND
CreatedDatetime < NowUTC
LastDeltaDate의 논리이다. 내가 타임 스탬프를 확인하면 배치 실행과 멀리 떨어져 있으며 Google Datflow 로그를 확인할 때 그 당시에 쿼리에 대해 반환 된 레코드가없는 것을 볼 수 있지만 지금 같은 쿼리를 실행할 때 기록. 스트리밍 된 레코드가 질의에 늦게 도착할 수있는 방법이 있습니까? 아니면 아파치 빔이 레코드를 처리하고 있지만 오랫동안 쓰지 않았을 가능성이 있습니까? 나는 창 전략을 적용하지 않을거야.
아이디어가 있으십니까?
어떻게 LastDeltaDate를 결정합니까? –
@BenChambers LastDeltaDate 결정 방법에 대한 설명으로 내 질문을 업데이트했습니다. – jimmy