TimeCharacteristic
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
此處可以取以下三類值:
Event Time
事件時間,事件(Event)本身的時間,即數據流中事件實際發生的時間,通常使用事件發生時的時間戳來描述,這些事件的時間戳通常在進入流處理應用之前就已經存在了,事件時間反映了事件真實的發生時間。所以,基於事件時間的計算操作,其結果是具有確定性的,無論數據流的處理速度如何、事件到達算子的順序是否會亂,最終生成的結果都是一樣的。
Ingestion Time
攝入時間,事件進入Flink的時間,即將每一個事件在數據源算子的處理時間作為事件時間的時間戳,並自動生成水位線(watermarks,關於watermarks下文會詳細分析)。
Ingestion Time從概念上講介於Event Time和Processing Time之間。與Processing Time相比 ,它的性能消耗更多一些,但結果卻更可預測。由於 Ingestion Time使用穩定的時間戳(在數據源處分配了一次),因此對記錄的不同窗口操作將引用相同的時間戳,而在Processing Time中每個窗口算子都可以將記錄分配給不同的窗口。
與Event Time相比,Ingestion Time無法處理任何亂序事件或遲到的數據,即無法提供確定的結果,但是程序不必指定如何生成水位線。在內部,Ingestion Time與Event Time非常相似,但是可以實現自動分配時間戳和自動生成水位線的功能。
Processing Time
處理時間,根據處理機器的系統時鍾決定數據流當前的時間,即事件被處理時當前系統的時間。還以窗口算子為例(關於window,下文會詳細分析),基於處理時間的窗口操作是以機器時間來進行觸發的,由於數據到達窗口的速率不同,所以窗口算子中使用處理時間會導致不確定的結果。在使用處理時間時,無需等待水位線的到來后進行觸發窗口,所以可以提供較低的延遲。
舉一個實際的例子:
站在看電影的普通大眾來說肯定是關心電影的上映時間;也就是處理時間 也就是processTime
站在研究電影劇情的人來說肯定關心的是電影整個系列的故事發展,應該先看1999的星球大戰1....也就是eventTime。
另外再看一個例子:
eventTime 是追求數據准,接受一定的延遲
processTime是追求快,容忍數據存在一定的偏差
flink默認使用eventTime
flink中的setStreamTimeCharacteristic
- flink的TimeCharacteristic枚舉定義了三類值,分別是ProcessingTime、IngestionTime、EventTime
- ProcessingTime是以operator處理的時間為准,它使用的是機器的系統時間來作為data stream的時間;IngestionTime是以數據進入flink streaming data flow的時間為准;EventTime是以數據自帶的時間戳字段為准,應用程序需要指定如何從record中抽取時間戳字段
- 指定為EventTime的source需要自己定義event time以及emit watermark,或者在source之外通過assignTimestampsAndWatermarks在程序手工指定