欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

為玉泉街道等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及玉泉街道網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、玉泉街道網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

流式計(jì)算分為無(wú)狀態(tài)和有狀態(tài)兩種情況。無(wú)狀態(tài)計(jì)算觀察每個(gè)獨(dú)立的事件,Storm就是無(wú)狀態(tài)的計(jì)算框架,每一條消息來(lái)了以后和前后都沒有關(guān)系,一條是一條。比如我們接收電力系統(tǒng)傳感器的數(shù)據(jù),當(dāng)電壓超過(guò)240v就報(bào)警,這就是無(wú)狀態(tài)的數(shù)據(jù)。但是如果我們需要同時(shí)判斷多個(gè)電壓,比如三相電路,我們判斷三相電都高于某個(gè)值,那么就需要將狀態(tài)保存,計(jì)算。因?yàn)檫@三條記錄是分別發(fā)送過(guò)來(lái)的。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

Storm需要自己實(shí)現(xiàn)有狀態(tài)的計(jì)算,比如借助于自定義的內(nèi)存變量或者redis等系統(tǒng),保證低延遲的情況下自己去判斷實(shí)現(xiàn)有狀態(tài)的計(jì)算,但是Flink就不需要這樣,而且作為新一代的流處理系統(tǒng),F(xiàn)link非常重視。

一致性

其實(shí)就是消息傳遞的正確性。在流處理中,一致性分為 3 個(gè)級(jí)別。

  • at-most-once:最多一次,可能會(huì)丟失。

  • at-least-once:最少一次,可能會(huì)重復(fù),而計(jì)算的時(shí)候可能就會(huì)多次運(yùn)算影響結(jié)果。

  • exactly-once:恰好保證一次,這樣得到的結(jié)果是最準(zhǔn)確的。

最先保證 exactly-once 的系統(tǒng)(Storm Trident 和 Spark Streaming),但是在性能和表現(xiàn)力這兩個(gè)方面付出了很大的代價(jià)。為了保證 exactly-once,這些系統(tǒng)無(wú)法單獨(dú)地對(duì)每條記錄運(yùn)用應(yīng)用邏輯,而是同時(shí)處理多條(一批)記錄,保證對(duì)每一批的處理要么全部成功,要么全部失敗。這就導(dǎo)致在得到結(jié)果前, 必須等待一批記錄處理結(jié)束。因此,用戶經(jīng)常不得不使用兩個(gè)流處理框架 (一個(gè)用來(lái)保證 exactly-once,另一個(gè)用來(lái)對(duì)每個(gè)元素做低延遲處理),結(jié)果使基礎(chǔ)設(shè)施更加復(fù)雜。

但是,F(xiàn)link解決了這種問(wèn)題。

檢查點(diǎn)機(jī)制

檢查點(diǎn)是 Flink 最有價(jià)值的創(chuàng)新之一,因?yàn)樗?Flink 可以保 證 exactly-once,并且不需要犧牲性能。

Flink 檢查點(diǎn)的核心作用是確保狀態(tài)正確,即使遇到程序中斷,也要正確。記住這一基本點(diǎn)之后,我們用一個(gè)例子來(lái)看檢查點(diǎn)是如何運(yùn)行的。Flink 為 用戶提供了用來(lái)定義狀態(tài)的工具。例如,以下這個(gè) Scala 程序按照輸入記錄 的第一個(gè)字段(一個(gè)字符串)進(jìn)行分組并維護(hù)第二個(gè)字段的計(jì)數(shù)狀態(tài)。

val stream: DataStream[(String, Int)] = ...

val counts: DataStream[(String, Int)] = stream
.keyBy(record => record._1)
.mapWithState((in: (String, Int), count: Option[Int]) =>    
 count match {
     case Some(c) => ( (in._1, c + in._2), Some(c + in._2) )
     case None => ( (in._1, in._2), Some(in._2) )
})

該程序有兩個(gè)算子:keyBy 算子用來(lái)將記錄按照第一個(gè)元素(一個(gè)字符串) 進(jìn)行分組,根據(jù)該 key 將數(shù)據(jù)進(jìn)行重新分區(qū),然后將記錄再發(fā)送給下一個(gè)算子:有狀態(tài)的 map 算子(mapWithState)。map 算子在接收到每個(gè)元素后, 將輸入記錄的第二個(gè)字段的數(shù)據(jù)加到現(xiàn)有總數(shù)中,再將更新過(guò)的元素發(fā)射出去。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

輸入流中的 6 條記錄被檢查點(diǎn)屏障 (checkpoint barrier)隔開,所有的 map 算子狀態(tài)均為0(計(jì)數(shù)還未開始)。所有 key 為 a 的記錄將被頂層的 map 算子處理,所有 key 為 b 的記錄將被中間層的 map 算子處理,所有 key 為 c 的記錄則將被底層的 map 算子處理。

如果輸入流來(lái)自消息傳輸系統(tǒng)Kafka,這個(gè)相互隔離的位置就是偏移量。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

檢查點(diǎn)屏障像普通記錄一樣在算子之間流動(dòng)。當(dāng) map 算子處理完前 3 條記錄 并收到檢查點(diǎn)屏障時(shí),它們會(huì)將狀態(tài)以異步的方式寫入穩(wěn)定存儲(chǔ).

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

當(dāng)沒有出現(xiàn)故障時(shí),F(xiàn)link 檢查點(diǎn)的開銷極小,檢查點(diǎn)操作的速度由穩(wěn)定存儲(chǔ)的可用帶寬決定。

如果檢查點(diǎn)操作失敗,F(xiàn)link 會(huì)丟棄該檢查點(diǎn)并繼續(xù)正常執(zhí)行,因?yàn)橹蟮?某一個(gè)檢查點(diǎn)可能會(huì)成功。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

在這種情況下,F(xiàn)link 會(huì)重新拓?fù)洌赡軙?huì)獲取新的執(zhí)行資源),將輸入流 倒回到上一個(gè)檢查點(diǎn),然后恢復(fù)狀態(tài)值并從該處開始繼續(xù)計(jì)算。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

Flink 將輸入流倒回到上一個(gè)檢查點(diǎn)屏障的位置,同時(shí)恢復(fù) map 算子的狀態(tài)值。然后,F(xiàn)link 從此處開始重新處理。這樣做保證了在記錄被處理之后,map 算子的狀 態(tài)值與沒有發(fā)生故障時(shí)的一致.

Flink 檢查點(diǎn)算法的正式名稱是異步屏障快照(asynchronous barrier snapshotting)。

保存點(diǎn)

狀態(tài)版本控制

檢查點(diǎn)由 Flink 自動(dòng)生成,用來(lái)在故障發(fā)生時(shí)重新處理記錄,從而修正狀 態(tài)。Flink 用戶還可以通過(guò)另一個(gè)特性有意識(shí)地管理狀態(tài)版本,這個(gè)特性叫作保存點(diǎn)(savepoint)。

保存點(diǎn)與檢查點(diǎn)的工作方式完全相同,只不過(guò)它由用戶通過(guò) Flink 命令行工 具或者 Web 控制臺(tái)手動(dòng)觸發(fā),而不由 Flink 自動(dòng)觸發(fā),用戶可以從保存點(diǎn)重啟作業(yè),而不用從頭開始。對(duì)保存點(diǎn)的另一種理解是,它在明確的時(shí)間點(diǎn)保存應(yīng)用程序狀態(tài)的版本。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

在圖中,v.0 是某應(yīng)用程序的一個(gè)正在運(yùn)行的版本。我們分別在 t1 時(shí)刻和 t2 時(shí)刻觸發(fā)了保存點(diǎn)。因此,可以在任何時(shí)候返回到這兩個(gè)時(shí)間點(diǎn),并且重 啟程序。更重要的是,可以從保存點(diǎn)啟動(dòng)被修改過(guò)的程序版本。舉例來(lái)說(shuō), 可以修改應(yīng)用程序的代碼(假設(shè)稱新版本為 v.1),然后從t1 時(shí)刻開始運(yùn)行 改動(dòng)過(guò)的代碼。

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

使用保存點(diǎn)更新Flink 應(yīng)用程序的版本。新版本可以從舊版本生成的一個(gè) 保存點(diǎn)處開始執(zhí)行.

端到端的一致性

Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算

在該應(yīng)用程序架構(gòu)中,有狀態(tài)的Flink 應(yīng)用程序消費(fèi)來(lái)自消息隊(duì)列的數(shù)據(jù), 然后將數(shù)據(jù)寫入輸出系統(tǒng),以供查詢。

輸入數(shù)據(jù)來(lái)自Kafka,在將狀態(tài)內(nèi)容傳送到輸出存儲(chǔ)系統(tǒng)的過(guò)程中,如何保證 exactly-once 呢?這 叫作端到端的一致性。本質(zhì)上有兩種實(shí)現(xiàn)方法,用哪一種方法則取決于輸 出存儲(chǔ)系統(tǒng)的類型,以及應(yīng)用程序的需求。

(1) 第一種方法是在 sink 環(huán)節(jié)緩沖所有輸出,并在 sink 收到檢查點(diǎn)記錄時(shí), 將輸出“原子提交”到存儲(chǔ)系統(tǒng)。這種方法保證輸出存儲(chǔ)系統(tǒng)中只存在 有一致性保障的結(jié)果,并且不會(huì)出現(xiàn)重復(fù)的數(shù)據(jù)。從本質(zhì)上說(shuō),輸出存 儲(chǔ)系統(tǒng)會(huì)參與 Flink 的檢查點(diǎn)操作。要做到這一點(diǎn),輸出存儲(chǔ)系統(tǒng)需要 具備“原子提交”的能力。

(2) 第二種方法是急切地將數(shù)據(jù)寫入輸出存儲(chǔ)系統(tǒng),同時(shí)牢記這些數(shù)據(jù)可能 是“臟”的,而且需要在發(fā)生故障時(shí)重新處理。如果發(fā)生故障,就需要將 輸出、輸入和 Flink 作業(yè)全部回滾,從而將“臟”數(shù)據(jù)覆蓋,并將已經(jīng)寫 入輸出的“臟”數(shù)據(jù)刪除。注意,在很多情況下,其實(shí)并沒有發(fā)生刪除 操作。例如,如果新記錄只是覆蓋舊紀(jì)錄(而不是添加到輸出中),那么 “臟”數(shù)據(jù)只在檢查點(diǎn)之間短暫存在,并且最終會(huì)被修正過(guò)的新數(shù)據(jù)覆蓋。

根據(jù)輸出存儲(chǔ)系統(tǒng)的類型,F(xiàn)link 及與之對(duì)應(yīng)的連接器可以一起保證端到端 的一致性,并且支持多種隔離級(jí)別。

看完上述內(nèi)容,你們掌握Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁(yè)題目:Flink如何實(shí)現(xiàn)有狀態(tài)的計(jì)算
當(dāng)前路徑:http://www.chinadenli.net/article30/jdjcpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)全網(wǎng)營(yíng)銷推廣企業(yè)網(wǎng)站制作網(wǎng)站收錄App設(shè)計(jì)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)