日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time)

發(fā)布時(shí)間:2024/9/27 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Flink在流處理程序中支持不同的時(shí)間概念。

  • 處理時(shí)間(processing time):處理時(shí)間是指執(zhí)行相應(yīng)操作的機(jī)器的系統(tǒng)時(shí)間。
    當(dāng)流處理程序基于處理時(shí)間運(yùn)行時(shí),所有基于時(shí)間的操作(如時(shí)間窗口)將使用運(yùn)行相應(yīng)運(yùn)算符的機(jī)器的系統(tǒng)時(shí)鐘。 每小時(shí)處理時(shí)間窗口將包括在系統(tǒng)時(shí)鐘指示整個(gè)小時(shí)之間到達(dá)特定運(yùn)算符的所有記錄。 例如,如果應(yīng)用程序在上午9:15開(kāi)始運(yùn)行,則第一個(gè)每小時(shí)處理時(shí)間窗口將包括在上午9:15到10:00之間處理的事件,下一個(gè)窗口將包括在上午10:00到11:00之間處理的事件,以此類(lèi)推。
    處理時(shí)間是最簡(jiǎn)單的時(shí)間概念,不需要流和機(jī)器之間的協(xié)調(diào)。 它提供最佳性能和最低延遲。 但是,在分布式和異步環(huán)境中,處理時(shí)間不提供確定性,因?yàn)樗菀资艿接涗浀竭_(dá)系統(tǒng)的速度(例如從消息隊(duì)列),記錄在系統(tǒng)內(nèi)的運(yùn)算符之間流動(dòng)的速度的影響,以及停電(計(jì)劃或其他)。

  • 事件時(shí)間(event time):事件時(shí)間是每個(gè)事件在其生產(chǎn)設(shè)備上發(fā)生的時(shí)間。此時(shí)間通常在進(jìn)入Flink之前嵌入記錄中,并且可以從每個(gè)記錄中提取該事件時(shí)間戳。 在事件時(shí)間,時(shí)間的進(jìn)展取決于數(shù)據(jù),而不是任何時(shí)鐘。 事件時(shí)間程序必須指定如何生成事件時(shí)間水印,這是表示事件時(shí)間進(jìn)度的機(jī)制。 該水印機(jī)制在下面的后面部分中描述。
    在一個(gè)完美的世界中,事件時(shí)間處理將產(chǎn)生完全一致和確定的結(jié)果,無(wú)論事件何時(shí)到達(dá)或其它們的順序。 但是,除非事件已知按順序到達(dá)(按時(shí)間戳),否則事件時(shí)間處理會(huì)在等待無(wú)序事件時(shí)產(chǎn)生一些延遲。 由于只能等待一段有限的時(shí)間,因此限制了確定性事件時(shí)間應(yīng)用程序的運(yùn)行方式。
    假設(shè)所有數(shù)據(jù)都已到達(dá),事件時(shí)間操作將按預(yù)期運(yùn)行,即使在處理無(wú)序或延遲事件或重新處理歷史數(shù)據(jù)時(shí)也會(huì)產(chǎn)生正確且一致的結(jié)果。 例如,每小時(shí)事件時(shí)間窗口將包含帶有落入該小時(shí)的事件時(shí)間戳的所有記錄,無(wú)論它們到達(dá)的順序如何,或者何時(shí)處理它們。 (有關(guān)更多信息,請(qǐng)參閱有關(guān)遲到事件的部分。)
    請(qǐng)注意,有時(shí)基于事件時(shí)間的程序處理實(shí)時(shí)數(shù)據(jù)時(shí),它們將使用一些處理時(shí)間(processing time)操作,以保證它們及時(shí)進(jìn)行。

  • 進(jìn)入時(shí)間(Ingestion time): 進(jìn)入時(shí)間是事件進(jìn)入Flink的時(shí)間。 在源運(yùn)算符處,每個(gè)記錄將源的當(dāng)前時(shí)間作為時(shí)間戳,并且基于時(shí)間的操作(如時(shí)間窗口)引用該時(shí)間戳。
    進(jìn)入時(shí)間在概念上位于事件時(shí)間和處理時(shí)間之間。與處理時(shí)間相比,它代價(jià)稍高,但可以提供更可預(yù)測(cè)的結(jié)果。 因?yàn)檫M(jìn)入時(shí)間使用穩(wěn)定的時(shí)間戳(在源處分配一次),所以對(duì)記錄的不同窗口操作將引用相同的時(shí)間戳,而在處理時(shí)間中,每個(gè)窗口操作符可以將記錄分配給不同的窗口(基于本地系統(tǒng)時(shí)鐘和 任何傳輸延誤)。

與事件時(shí)間相比,進(jìn)入時(shí)間程序無(wú)法處理任何無(wú)序事件或延遲數(shù)據(jù),但程序不必指定如何生成水印。

在內(nèi)部,攝取時(shí)間與事件時(shí)間非常相似,但具有自動(dòng)分配時(shí)間戳和自動(dòng)生成水印功能。

設(shè)置時(shí)間特征(Setting a Time Characteristic)

Flink DataStream程序的第一部分通常設(shè)置基本時(shí)間特性。 該設(shè)置定義了數(shù)據(jù)流源的行為方式(例如,它們是否將分配時(shí)間戳),以及像KeyedStream.timeWindow(Time.seconds(30))這樣的窗口操作應(yīng)該使用什么時(shí)間概念。

以下示例顯示了一個(gè)Flink程序,該程序在每小時(shí)時(shí)間窗口中聚合事件。 窗戶(hù)的行為適應(yīng)時(shí)間特征。

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

請(qǐng)注意,為了基于事件時(shí)間運(yùn)行此示例,程序需要使用直接定義數(shù)據(jù)事件時(shí)間的源并自己輸出水印,或者程序必須在源之后注入時(shí)間戳分配器和水印生成器。 這些函數(shù)描述了如何訪(fǎng)問(wèn)事件時(shí)間戳,以及事件流表現(xiàn)出的無(wú)序程度。

以下部分描述了時(shí)間戳和水印背后的一般機(jī)制。 有關(guān)如何在Flink DataStream API中使用時(shí)間戳分配和水印生成的指南,請(qǐng)參閱Generating Timestamps / Watermarks。

事件時(shí)間和水印(Event Time and Watermarks)

注意:Flink實(shí)現(xiàn)了數(shù)據(jù)流模型中的許多技術(shù)。 有關(guān)活動(dòng)時(shí)間和水印的詳細(xì)介紹,請(qǐng)查看以下文章。

  • Streaming 101 by Tyler Akidau
  • The Dataflow Model paper

支持事件時(shí)間的流處理器需要一種方法來(lái)衡量事件時(shí)間的進(jìn)度。 例如,當(dāng)事件時(shí)間超過(guò)一小時(shí)結(jié)束時(shí),需要通知構(gòu)建每小時(shí)窗口的窗口運(yùn)算符,以便運(yùn)算符可以關(guān)閉正在進(jìn)行的窗口。

事件時(shí)間可以獨(dú)立于處理時(shí)間(由時(shí)鐘測(cè)量)進(jìn)行。 例如,在一個(gè)程序中,運(yùn)算符的當(dāng)前事件時(shí)間可能略微落后于處理時(shí)間(考慮到接收事件的延遲),而兩者都以相同的速度進(jìn)行。 另一方面,通過(guò)快速轉(zhuǎn)發(fā)已經(jīng)在Kafka主題(或其它消息隊(duì)列)中緩沖的一些歷史數(shù)據(jù),另一個(gè)流程序只需幾秒鐘處理幾周的事件時(shí)間。

Flink中用于衡量事件時(shí)間進(jìn)度的機(jī)制是水印。 水印作為數(shù)據(jù)流的一部分流動(dòng)并帶有時(shí)間戳t。 Watermark(t)聲明事件時(shí)間已到達(dá)該流中的時(shí)間t,這意味著不應(yīng)該有來(lái)自流的具有時(shí)間戳t’<= t的元素(即,具有更早或等于水印的時(shí)間戳的事件)。

下圖顯示了帶有(邏輯)時(shí)間戳的事件流,以及內(nèi)聯(lián)流動(dòng)的水印。 在該示例中,事件按順序(相對(duì)于它們的時(shí)間戳),意味著水印是流中的周期性標(biāo)記。

水印對(duì)于無(wú)序流是至關(guān)重要的,如下所示,其中事件不按時(shí)間戳排序。 通常,水印是一種聲明,通過(guò)流中的那一點(diǎn),到達(dá)某個(gè)時(shí)間戳的所有事件都應(yīng)該到達(dá)。 一旦水印到達(dá)運(yùn)算符,運(yùn)算符就可以將其內(nèi)部事件時(shí)鐘提前到水印的值。

請(qǐng)注意,事件時(shí)間由一個(gè)新生成的流元素(或多個(gè)元素)繼承,這些元素來(lái)自生成它們的事件或觸發(fā)創(chuàng)建這些元素的水印。

并行流中的水印(Watermarks in Parallel Streams)

在源函數(shù)處或之后生成水印。 源函數(shù)的每個(gè)并行子任務(wù)通常獨(dú)立地生成其水印。 這些水印定義了該特定并行源的事件時(shí)間。

當(dāng)水印流過(guò)流媒處理程序時(shí),它們會(huì)在他們到達(dá)的運(yùn)算符處提前事件時(shí)間。 每當(dāng)運(yùn)算符提前其事件時(shí)間時(shí),它就為其后繼運(yùn)算符生成下游的新水印。

一些運(yùn)算符消費(fèi)多個(gè)輸入流; 例如union,或者跟隨keyBy(…)或partition(…)函數(shù)的運(yùn)算符。 這樣的運(yùn)算符的當(dāng)前事件時(shí)間是其輸入流的事件時(shí)間的最小值。 由于其輸入流更新其事件時(shí)間,運(yùn)算符也是如此。

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

請(qǐng)注意,Kafka源支持每分區(qū)水印,您可以在此處詳細(xì)了解。

晚到元素(Late Elements)

某些元素可能違反水印條件,這意味著即使在Watermark(t)發(fā)生之后,也會(huì)出現(xiàn)更多具有時(shí)間戳t’<= t的元素。 實(shí)際上,在許多現(xiàn)實(shí)世界設(shè)置中,某些元素可以被任意延遲,從而無(wú)法指定某個(gè)事件時(shí)間戳的所有元素將發(fā)生的時(shí)間。 此外,即使遲到可以被限制,通常也不希望延遲太多水印,因?yàn)樗谑录r(shí)間窗口的計(jì)算中引起太大延遲。

出于這個(gè)原因,流程序可能明確地預(yù)料一些晚到元素。 晚到元素是在系統(tǒng)的事件時(shí)鐘(水印產(chǎn)生)之后到達(dá)的元素,事件時(shí)鐘已經(jīng)超過(guò)了晚到元素的時(shí)間戳。 有關(guān)如何在事件時(shí)間窗口中使用延遲元素的更多信息,請(qǐng)參閱Allowed Lateness。

空閑源(Idling sources)

目前,對(duì)于純事件時(shí)間水印生成器,如果沒(méi)有要處理的元素,則水印不能產(chǎn)出。 這意味著在輸入數(shù)據(jù)存在間隙的情況下,事件時(shí)間將不會(huì)進(jìn)行,例如窗口操作符將不會(huì)被觸發(fā),因此現(xiàn)有窗口將不能產(chǎn)生任何輸出數(shù)據(jù)。

為了避免這種情況,可以使用定期水印分配器,它們不僅基于元素時(shí)間戳進(jìn)行分配。 示例解決方案可以是在觀(guān)察不到新事件一段時(shí)間之后切換到使用當(dāng)前處理時(shí)間作為時(shí)間基礎(chǔ)的分配器。

可以使用SourceFunction.SourceContext #markAsTemporarilyIdle將源標(biāo)記為空閑。 有關(guān)詳細(xì)信息,請(qǐng)參閱此方法的Javadoc以及StreamStatus。

調(diào)試水印(Debugging Watermarks)

有關(guān)在運(yùn)行時(shí)調(diào)試水印的信息,請(qǐng)參閱Debugging Windows & Event Time。

運(yùn)算符如何處理水印(How operators are processing watermarks)

作為一般規(guī)則,運(yùn)算符需要在向下游轉(zhuǎn)發(fā)之前完全處理給定的水印。 例如,WindowOperator將首先評(píng)估應(yīng)該觸發(fā)哪些窗口,并且只有在產(chǎn)生由水印觸發(fā)的所有輸出之后,水印本身才會(huì)被發(fā)送到下游。 換句話(huà)說(shuō),由于出現(xiàn)水印而產(chǎn)生的所有元素將在水印之前發(fā)出。

同樣的規(guī)則適用于TwoInputStreamOperator。 但是,在這種情況下,運(yùn)算符的當(dāng)前水印被定義為其兩個(gè)輸入的最小值。

此行為的詳細(xì)信息由OneInputStreamOperator#processWatermark,TwoInputStreamOperator#processWatermark1和TwoInputStreamOperator#processWatermark2方法的實(shí)現(xiàn)定義。

總結(jié)

以上是生活随笔為你收集整理的事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。