溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Flink中時間的示例分析

發(fā)布時間:2022-01-14 14:26:47 來源:億速云 閱讀:173 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)Flink中時間的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一,fink支持的時間

Flink的流式應(yīng)用支持不同的時間觀。

1,處理時間

處理時間是指執(zhí)行相應(yīng)操作的機(jī)器的系統(tǒng)時間。

當(dāng)流程序采用處理時間運(yùn)行時,所有基于時間的操作(如時間窗口)將使用運(yùn)行各自運(yùn)算符的機(jī)器的系統(tǒng)時鐘。例如,每小時處理時間窗口將包括在系統(tǒng)時鐘顯示一個小時的時間之間到達(dá)特定操作之間的所有記錄。

處理時間是最簡單的時間概念,不需要流和機(jī)器之間的協(xié)調(diào)。它提供最好的性能和最低的延遲。然而,在分布式和異步環(huán)境中,處理時間不能提供決定論,因?yàn)樗资苡涗浀竭_(dá)系統(tǒng)(例如從消息隊(duì)列)到達(dá)的速度的影響,也與記錄在系統(tǒng)內(nèi)部的操作算子之間流動的速度有關(guān)。

2,事件時間

事件時間是每個事件在其生產(chǎn)設(shè)備上發(fā)生的時間。這個時間通常是嵌入在事件中他們進(jìn)入fink和事件的時間戳可以從事件中提取。每小時事件時間窗口將包含所有事件,該事件都包含到該時間的事件時間戳,而不管事件何時到達(dá),以及它們到達(dá)的順序。

事件時間給出正確的結(jié)果,即使在亂序的事件,遲滯的事件,或從備份或持久的日志的回放數(shù)據(jù)。使用事件時間,時間的進(jìn)展取決于數(shù)據(jù),而不是墻上的時鐘。事件時間程序必須指定如何生成事件時間Watermarks,這是在事件時間內(nèi)發(fā)出信號的機(jī)制。該機(jī)制如下所述。

事件時間處理通常會產(chǎn)生一定的延遲,這是因?yàn)樗哂械却笃谑录蜔o序事件的特定時間的特性。因此,基于事件間的程序常常與處理時間操作相結(jié)合。

3,注入時間

   注入時間是指事件進(jìn)入flink的時間。在Sources操作符中每條事件都會獲取Sources的當(dāng)前時間作為時間戳,基于時間的操作(比如windows)會依據(jù)這個時間戳。

   注入時間在概念上在事件時間和處理時間之間。與處理時間相比,它稍微更消耗性能些,但是卻提供了可預(yù)測的結(jié)果。因?yàn)樽⑷霑r間使用固定的時間戳(在Sources處一次分配),不同的窗口操作都會使用相同的時間,而使用處理時間每個窗口操作,都可能分配給消息不同的時間窗口(基于本地系統(tǒng)時間)。

   與事件時間相比,注入時間程序不能處理任何無需時間或者滯后數(shù)據(jù),但是程序不需要指定如何生成watermark。

   在內(nèi)部,注入時間和事件時間非常相似,但是注入時間有自動時間戳分配和自動watermark生成的功能。

Flink中時間的示例分析

二,設(shè)定時間特性

一個flink流程序第一部分往往是設(shè)置基礎(chǔ)時間特性。該設(shè)置確定了流的Sources頭如何操作(比如是否分配一個時間戳)與此同時確認(rèn)窗口操作(如KeyedStream.timeWindow(Time.seconds(30)).)如何使用時間的概念。

下面的flink程序展示了以小時時間窗口聚合事件。窗口的行為與時間特性相互適應(yīng)。

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(...);

注意,為了使用事件時間來運(yùn)行這個例子,程序使用Sources來直接定義數(shù)據(jù)的事件時間和決定watermark,或者程序在Sources后必須注入一個Timestamp Assigner & Watermark Generator。這些功能主要描述了如何去使用事件時間戳,和事件流展示出來的無序程度。

下面的部分描述了在時間戳和watermark的一般機(jī)制。為指導(dǎo)如何在數(shù)據(jù)流API的使用時間戳分配和Flink watermark生成,后面會出文章介紹。

三,事件時間和watermark

   支持事件時間的流處理器需要一種方法來測量時間時間的進(jìn)展。例如,一個小時窗口windows的操作,當(dāng)事件時間已經(jīng)超過一個小時的時候需要通知該操作算子,以便操作算子可以關(guān)閉正在進(jìn)行中的窗口。

   事件時間可以獨(dú)立于處理時間前進(jìn)。例如在一個程序中,操作算子的當(dāng)前事件時間可能稍微落后于處理時間(收到事件延遲導(dǎo)致),而兩者都以相同的速度進(jìn)行。另一方面,另一個流程序可能只需要幾秒鐘的處理時間就可以處理通過幾周的事件時間,通過快速處理一些已經(jīng)緩存在kafka主題(或者另外的消息隊(duì)列)中的歷史數(shù)據(jù)。

   Flink中使用watermark去測量事件時間的進(jìn)度。Watermark 流作為數(shù)據(jù)流的一部分,攜帶一個時間戳 t。一個Watermark(t) 聲明事件時間已經(jīng)到達(dá)時間t,意味著已經(jīng)沒有事件時間t1<t的元素在流中存在(也即時間的時間戳應(yīng)該早于或者等于watermark)。

   如下圖:

Flink中時間的示例分析

Watermark對于無序流是至關(guān)重要的,如下圖所示,事件不是根據(jù)時間戳排序。一般來說,watermark是一個聲明,通過流中的那個點(diǎn),所有到達(dá)某個時間戳的時間應(yīng)該已經(jīng)到達(dá),一旦watermark到達(dá)操作算子,操作算子就可以提升內(nèi)部時間到watermark所指定的值。

Flink中時間的示例分析

四,在并行流中的watermark

   Watermark是在Source函數(shù)中直接或者在其后直接生成。一個源函數(shù)的每個并行子任務(wù)通常獨(dú)立的產(chǎn)生watermark。這些watermark定義了特定并行源的事件時間。

   當(dāng)watermark流經(jīng)流程序時,會調(diào)整操作算子中的事件時間至watermark到達(dá)的時間。每當(dāng)操作算子提前它自己的事件時間時,它就會為后繼的操作算子生成一個新的下行watermark。

   一些操作算子使用多個輸入流。例如,union操作,或者keyBy(...)或partition(...)之后的操作.這些操作算子的當(dāng)前事件時間是所有輸入流最小的事件時間。當(dāng)輸入流更新它們的事件時間時,操作算子也會更新。

   下圖顯示了,流經(jīng)并行流的事件和watermark,以及跟蹤事件時間的運(yùn)算符。

Flink中時間的示例分析

五,遲滯元素

   也可能存在違反watermark條件的元素,也即在Watermark(t) 已經(jīng)發(fā)生以后,很多時間戳t1<t的元素也會出現(xiàn)。事實(shí)上,在現(xiàn)實(shí)設(shè)置中,某些元素可能會有任意的延遲,使得所有元素在watermark之前準(zhǔn)時到達(dá)變得不是很可能。即使延遲是有界的,大量延遲watermark也是不可取的,因?yàn)闀?dǎo)致事件時間窗口評估延遲很大。

   鑒于這個原因,流式程序可能明確的期待一些延遲的元素。后面會出文章,詳細(xì)介紹如何在事件時間窗口中處理延遲元素。

六,對比Spark Streaming

   對比Spark Streaming可以知道,我們的Spark Streaming支持的時間是處理時間,這在現(xiàn)實(shí)生活中,尤其是基于時間序列的事件處理的時候,就略顯不足了。所以,在選用流式處理的時候,要結(jié)合自己的業(yè)務(wù)需要。

感謝各位的閱讀!關(guān)于“Flink中時間的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI