[Flink]Flink1.3 Stream指南六 事件时间与处理时间
Flink在數據流中支持幾種不同概念的時間。
1. 處理時間 Processing Time
Processing Time(處理時間)是指執行相應操作機器的系統時間(Processing time refers to the system time of the machine that is executing the respective operation.)。
當一個流程序以處理時間來運行時,所有基于時間的操作(如: 時間窗口)將使用運行相應算子(operator)所在機器的系統時間。例如:一個按處理時間每小時進行處理的時間窗口將包括所有的記錄,其按系統時鐘一小時內到達指定算子(an hourly processing time window will include all records that arrived at a specific operator between the times when the system clock indicated the full hour.)。
處理時間是最簡單的一個時間概念,不需要在數據流和機器之間進行協調。它有最好的性能和最低的延遲。然而,在分布式或者異步環境中,處理時間具有不確定性,因為容易受到記錄到達系統速度的影響(例如從消息隊列到達的記錄),還會受到系統內記錄流在不同算子之間的流動速度的影響(speed at which records arrive in the system, and to the speed at which the records flow between operators inside the system)。
2. 事件時間 Event Time
Event Time(事件時間)是每個獨立事件在它生產設備上產生的時間。在進入Flink之前,事件時間通常要嵌入到記錄中,并且事件時間也可以從記錄中提取出來。一個按事件時間每小時進行處理的時間窗口將包含所有的記錄,其事件時間都在這一小時之內,不管它們何時到達,以及它們以什么順序到達。
事件時間即使在亂序事件,延遲事件以及從備份或持久化日志中的重復數據也能獲得正確的結果。對于事件時間,時間的進度取決于數據,而不是任何時鐘。事件時間程序必須指定如何生成事件時間的Watermarks,這是表示事件時間進度的機制。
按事件時間處理往往會導致一定的延遲,因為它要等待延遲事件和無序事件一段時間。因此,事件時間程序通常與處理時間操作相結合使用。
3. 提取時間 Ingestion Time
Ingestion Time是事件進入Flink的時間。在source operator中,每個記錄將源的當前時間記為時間戳,基于時間的操作(如時間窗口)會使用該時間戳。
提取時間概念上處在事件時間和處理時間之間。與處理時間相比,提取時間的成本稍微更高一些,但是可以提供更可預測的結果。因為提取時間的時間戳比較穩定(在源處只記錄一次),同一數據在流經不同窗口操作時將使用相同的時間戳,而對于處理時間,每個窗口算子可能將記錄分配給不同的窗口(基于本地系統時鐘以及傳輸延遲)。
與事件時間相比,提取時間程序無法處理任何無序事件或延遲事件,但程序不必指定如何生成watermarks。
在內部,提取時間與事件時間非常相似,但事件時間會自動分配時間戳以及自動生成watermark(with automatic timestamp assignment and automatic watermark generation)。
4. 設定時間特性
Flink DataStream程序的第一部分通常設置基本的時間特性(base time characteristic)。該設置定義數據流源的行為方式(例如,它們是否產生時間戳),以及窗口操作如KeyedStream.timeWindow(Time.seconds(30))應使用哪一類型時間,是事件時間還是處理時間等。
以下示例展示了一個按每小時處理的時間窗口聚合事件的Flink程序。窗口的行為會與時間特性相匹配。
Java版本:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); // alternatively: // env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime); // env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); DataStream<MyEvent> stream = env.addSource(new FlinkKafkaConsumer09<MyEvent>(topic, schema, props)); stream .keyBy( (event) -> event.getUser() ) .timeWindow(Time.hours(1)) .reduce( (a, b) -> a.add(b) ) .addSink(...);Scala版本:
val env = StreamExecutionEnvironment.getExecutionEnvironment env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime) // alternatively: // env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime) // env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) val stream: DataStream[MyEvent] = env.addSource(new FlinkKafkaConsumer09[MyEvent](topic, schema, props)) stream .keyBy( _.getUser ) .timeWindow(Time.hours(1)) .reduce( (a, b) => a.add(b) ) .addSink(...)備注:
為了以事件時間中運行此示例,程序需要使用定義了事件時間并自動產生watermarks的源,或者程序必須在源之后設置時間戳分配器和watermarks生成器。上述函數描述了如何獲取事件時間戳,以及展現事件流的無序程度。備注:
Flink版本:1.3原文:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/event_time.html#event-time--processing-time--ingestion-time
總結
以上是生活随笔為你收集整理的[Flink]Flink1.3 Stream指南六 事件时间与处理时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: as3 文档类引用
- 下一篇: Layer 父子页面之间的交互