1、處理時間
處理時間是指執行相應 算子操作的機器的系統時間。 當流程序在處理時間運行時,所有基於時間的 算子操作(如時間窗口)將使用 運行相應算子的機器的系統時鍾。每小時處理時間窗口將包括在系統時鍾指示 整個小時之間到達特定算子的所有記錄。例如,如果應用程序在上午9:15開始 運行,則第一個每小時處理時間窗口將包括在上午9:15到上午10:00之間處理 的事件,下一個窗口將包括在上午10:00到11:00之間處理的事件,因此上。 處理時間是最簡單的時間概念,不需要流和機器之間的協調。它提供最佳性能 和最低延遲。但是,在分布式和異步環境中,處理時間不提供確定性,因為它 容易受到記錄到達系統的速度(例如從消息隊列)到記錄在系統內的算子之間 流動的速度的影響。和停電(預定或其他)。
2、事件時間
事件時間是每個事件在其生產設備上發生的時間。此時間通常在進 入Flink之前嵌入記錄中,並且 可以從每個記錄中提取該事件時間戳。在事件時 間,時間的進展取決於數據,而不是任何掛鍾。事件時間程序必須指定如何生 成事件時間水印,這是表示事件時間進度的機制。該水印機制在下面的后面部 分中描述。
在一個完美的世界中,事件時間處理將產生完全一致和確定的結果,無論事件 何時到達,或者它們的排序。但是,除非事件已知按順序到達(按時間戳), 否則事件時間處理會在等待無序事件時產生一些延遲。由於只能等待一段有限 的時間,因此限制了確定性事件時間應用程序的可能性。 假設所有數據都已到達,事件時間 算子操作將按預期運行,即使在處理無序或 延遲事件或重新處理歷史數據時也會產生正確且一致的結果。例如,每小時事 件時間窗口將包含帶有落入該小時的事件時間戳的所有記錄,無論它們到達的 順序如何,或者何時處理它們。(有關更多信息,請參閱有關遲發事件的部 分。)
請注意,有時當事件時間程序實時處理實時數據時,它們將使用一些處理時間 算子操作,以確保它們及時進行。
3、攝取時間
攝取時間是事件進入Flink的時間。在源算子處,每個記錄將源的當 前時間作為時間戳,並且基於時間的算子操作(如時間窗口)引用該時間戳。攝取時間在概念上位於事件時間和處理時間之間。與處理時間相比 ,它稍貴一 些,但可以提供更可預測的結果。因為 攝取時間使用穩定的時間戳(在源處分 配一次),所以對記錄的不同窗口 算子操作將引用相同的時間戳,而在處理時 間中,每個窗口算子可以將記錄分配給不同的窗口(基於本地系統時鍾和任何 運輸延誤)。與事件時間相比,攝取時間程序無法處理任何無序事件或后期數據,但程序不 必指定如何生成水印。在內部,攝取時間與事件時間非常相似,但具有自動時間戳分配和自動水印生成函數。
Flink DataStream程序的第一部分通常設置基本時間特性。該設置定義了數據流源 的行為方式(例如,它們是否將分配時間戳),以及窗口 算子操作應該使用的時間 概念 KeyedStream.timeWindow(Time.seconds(30)) 。
以下示例顯示了一個Flink程序,該程序在每小時時間窗口中聚合事件。窗口的行為 適應時間特征。
final StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment(); env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTim e); env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) ; DataStream<MyEvent> stream=env.addSource(new FlinkKafkaConsume r09<MyEvent>(topic,schema,props)); stream.keyBy((event)->event.getUser())
.timeWindow(Time.hours(1))
.reduce((a,b)-> a.add(b))
.addSink(...);