flink中的setStreamTimeCharacteristic


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

  1. flink的TimeCharacteristic枚舉定義了三類值,分別是ProcessingTime、IngestionTime、EventTime
  2. ProcessingTime是以operator處理的時間為准,它使用的是機器的系統時間來作為data stream的時間;IngestionTime是以數據進入flink streaming data flow的時間為准;EventTime是以數據自帶的時間戳字段為准,應用程序需要指定如何從record中抽取時間戳字段
  3. 指定為EventTime的source需要自己定義event time以及emit watermark,或者在source之外通過assignTimestampsAndWatermarks在程序手工指定


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM