-
Flink : 시간 특성과 워터마크카테고리 없음 2025. 3. 10. 10:47300x250
flink에서 시간 정보가 필요한 작업이 있을 때(ex: window operator) 선택할 수 있는 시간 속성에 대해서 기술한다.
시간 속성
처리 시간(processing time) : flink에서 실제로 데이터스트림을 처리하는 시점의 시간. 데이터를 실제로 처리하게 되었을 때에야 시간을 알 수 있으므로 데이터스트림이 비결정적이다. 시스템으로부터 현재 시간을 직접 불러와서 사용하므로 워터마크를 만들 필요가 없기 때문에 해당 오버헤드가 없다.
이벤트 시간(event time) : 데이터가 디바이스나 애플리케이션에서 발생하거나 생성된 시점의 시간. 무엇을 이벤트 시간으로 삼을지 정하고, 또 워터마크는 어떻게 생성할 건지 정책을 직접 정해서 워터마크를 생성해야 한다. 오버헤드가 발생하지만 이벤트 시간이 정해진 채로 유입되므로 데이터스트림이 결정적이다.
수집 시간(ingestion time) : 데이터가 flink에 유입된 시간으로 워터마크를 자동 생성한다. 이벤트 타임이 필요하지만 타임 스탬프를 확보할 수 없거나, 그냥 워터마크를 간단히 정의하고 싶을 때 대안으로 사용한다. 프로세싱 타임보다는 결정적이지만 이벤트 타임만큼은 아니면서 성능은 이벤트 타임과 비슷할 수 있다. 지금은 사실상 deprecated된 듯하다.
워터마크 : flink에서 데이터를 처리할 때 checkpoint barrier처럼 스트림 중간중간에 넣어주는 timestamp record. 시간 속성을 event time으로 정했을 때 함께 정의하여 생성된다.
기준으로 삼은 시간 속성에 대하여, operator로 하여금 데이터 스트림을 워터마크에 기록된 시간까지는 확실히 처리했고, 앞으로는 그 시간 이후의 데이터만 유입될 것이라는 정보를 알려주는 역할을 한다. 즉, flink는 시간 속성으로 처리 시간을 사용할 때에는 시스템으로부터 직접 현재 시간을 읽어와서 시간을 판단하지만, 이벤트 시간을 사용할 때에는 시스템의 현재 시간을 참조하지 않고 watermark로 시간의 경과를 판단한다.
워터마크를 어떻게 정의하느냐에 따라 유입이 지연된 데이터에 대해서도 순서를 틀리지 않고 처리할 수 있다. 가령 밑의 그림을 예시로 들면, 워터마크를 이벤트 시간보다 2분 빠르게 생성하면, 워터마크보다 빠르게 들어왔지만 그 텀이 2분 이내인 데이터는 window에서 처리가 보류된다. 이러면 보류된 데이터보다 실제로 이벤트 시간이 빠르지만 더 늦게 들어온 데이터(워터마크보다는 나중의 시간)의 순서가 꼬이는 것을 방지할 수 있다. 예상되는 network delay를 감안해서 워터마크를 적절히 설정하면 된다.
한편 반대로 워터마크가 새로 유입되지 않으면 마지막으로 유입된 워터마크 이후로 시간이 얼마나 지났는지 스스로 판단하지 않는다(못한다). 예를 들어 window size를 시간 단위을 기준으로 해서 2분으로 정했다면, window 시작 시간으로부터 실제로 2분이 지났어도 그에 해당하는 watermark의 유입이 없으면 아직 그 시간이 지나지 않은 것으로 판단하여 window를 닫지 않는다.

그래서 시간의 순서 보장이 중요한 시계열 데이터를 좀 더 안정적으로 처리할 수 있도록 돕는다.
300x250