華為云計(jì)算 云知識(shí) Flink原理和特性
Flink原理和特性

Flink原理:

  • Stream&Transformation&Operator

用戶實(shí)現(xiàn)的Flink程序是由Stream和Transformation這兩個(gè)基本構(gòu)建塊組成。

1.Stream是一個(gè)中間結(jié)果數(shù)據(jù),而Transformation是一個(gè)操作,它對(duì)一個(gè)或多個(gè)輸入Stream進(jìn)行計(jì)算處理,輸出一個(gè)或多個(gè)結(jié)果Stream。

2.當(dāng)一個(gè)Flink程序被執(zhí)行的時(shí)候,它會(huì)被映射為Streaming Dataflow。一個(gè)Streaming Dataflow是由一組Stream和Transformation Operator組成,它類似于一個(gè)DAG圖,在啟動(dòng)的時(shí)候從一個(gè)或多個(gè)Source Operator開(kāi)始,結(jié)束于一個(gè)或多個(gè)Sink Operator。

圖1為一個(gè)由Flink程序映射為Streaming Dataflow的示意圖。

圖1 Flink DataStream示例

Flink原理和特性1

圖1中“FlinkKafkaConsumer”是一個(gè)Source Operator,Map、KeyBy、TimeWindow、Apply是Transformation Operator,RollingSink是一個(gè)Sink Operator。

  • Pipeline Dataflow

在Flink中,程序是并行和分布式的方式運(yùn)行。一個(gè)Stream可以被分成多個(gè)Stream分區(qū)(Stream Partitions),一個(gè)Operator可以被分成多個(gè)Operator Subtask。

Flink內(nèi)部有一個(gè)優(yōu)化的功能,根據(jù)上下游算子的緊密程度來(lái)進(jìn)行優(yōu)化。

緊密度低的算子則不能進(jìn)行優(yōu)化,而是將每一個(gè)Operator Subtask放在不同的線程中獨(dú)立執(zhí)行。一個(gè)Operator的并行度,等于Operator Subtask的個(gè)數(shù),一個(gè)Stream的并行度(分區(qū)總數(shù))等于生成它的Operator的并行度,如圖4所示。

圖2 Operator

Flink原理和特性2

緊密度高的算子可以進(jìn)行優(yōu)化,優(yōu)化后可以將多個(gè)Operator Subtask串起來(lái)組成一個(gè)Operator Chain,實(shí)際上就是一個(gè)執(zhí)行鏈,每個(gè)執(zhí)行鏈會(huì)在TaskManager上一個(gè)獨(dú)立的線程中執(zhí)行,如圖5所示。

圖3 Operator chain

Flink原理和特性3

圖3中上半部分表示的是將Source和map兩個(gè)緊密度高的算子優(yōu)化后串成一個(gè)Operator Chain,實(shí)際上一個(gè)Operator Chain就是一個(gè)大的Operator的概念。圖中的Operator Chain表示一個(gè)Operator,keyBy表示一個(gè)Operator,Sink表示一個(gè)Operator,它們通過(guò)Stream連接,而每個(gè)Operator在運(yùn)行時(shí)對(duì)應(yīng)一個(gè)Task,也就是說(shuō)圖中的上半部分有3個(gè)Operator對(duì)應(yīng)的是3個(gè)Task。

圖3中下半部分是上半部分的一個(gè)并行版本,對(duì)每一個(gè)Task都并行化為多個(gè)Subtask,這里只是演示了2個(gè)并行度,sink算子是1個(gè)并行度。

Flink關(guān)鍵特性:

  • 流式處理

高吞吐、高性能、低時(shí)延的實(shí)時(shí)流處理引擎,能夠提供ms級(jí)時(shí)延處理能力。

  • 豐富的狀態(tài)管理

流處理應(yīng)用需要在一定時(shí)間內(nèi)存儲(chǔ)所接收到的事件或中間結(jié)果,以供后續(xù)某個(gè)時(shí)間點(diǎn)訪問(wèn)并進(jìn)行后續(xù)處理。Flink提供了豐富的狀態(tài)管理相關(guān)的特性支持,其中包括

多種基礎(chǔ)狀態(tài)類型:Flink提供了多種不同數(shù)據(jù)結(jié)構(gòu)的狀態(tài)支持,如ValueState、ListState、MapState等。用戶可以基于業(yè)務(wù)模型選擇最高效、合適狀態(tài)類型。

豐富的State Backend:State Backend負(fù)責(zé)管理應(yīng)用程序的狀態(tài),并根據(jù)需要進(jìn)行checkpoint。Flink提供了不同State Backend,State可以存儲(chǔ)在內(nèi)存上或RocksDB等上,并支持異步以及增量的checkpoint機(jī)制。

精確一次語(yǔ)義:Flink的Checkpoint和故障恢復(fù)能力保證了任務(wù)在故障發(fā)生前后的應(yīng)用狀態(tài)一致性,為某些特定的存儲(chǔ)支持了事務(wù)型輸出的功能,及時(shí)在發(fā)生故障的情況下,也能夠保證精確一次的輸出。

  • 豐富的時(shí)間語(yǔ)義支持

時(shí)間是流處理應(yīng)用的重要組成部分,對(duì)于實(shí)時(shí)流處理應(yīng)用來(lái)說(shuō),基于時(shí)間語(yǔ)義的窗口聚合、檢測(cè)、匹配等運(yùn)算是非常常見(jiàn)的。Flink提供了豐富的時(shí)間語(yǔ)義支持。

Event-time:使用事件本身自帶的時(shí)間戳進(jìn)行計(jì)算,使亂序到達(dá)或延遲到達(dá)的事件處理變得更加簡(jiǎn)單。

Watermark支持:Flink引入Watermark概念,用以衡量事件時(shí)間的發(fā)展。Watermark也為平衡處理時(shí)延和數(shù)據(jù)完整性提供了靈活的保障。當(dāng)處理帶有Watermark的事件流時(shí),在計(jì)算完成之后仍然有相關(guān)數(shù)據(jù)到達(dá)時(shí),F(xiàn)link提供了多種處理選項(xiàng),如將數(shù)據(jù)重定向(side output)或更新之前完成的計(jì)算結(jié)果。

Processing-time和Ingestion-time支持。

高度靈活的流式窗口支持:Flink能夠支持時(shí)間窗口、計(jì)數(shù)窗口、會(huì)話窗口,以及數(shù)據(jù)驅(qū)動(dòng)的自定義窗口,可以通過(guò)靈活的觸發(fā)條件定制,實(shí)現(xiàn)復(fù)雜的流式計(jì)算模式。

  • 容錯(cuò)機(jī)制

分布式系統(tǒng),單個(gè)task或節(jié)點(diǎn)的崩潰或故障,往往會(huì)導(dǎo)致整個(gè)任務(wù)的失敗。Flink提供了任務(wù)級(jí)別的容錯(cuò)機(jī)制,保證任務(wù)在異常發(fā)生時(shí)不會(huì)丟失用戶數(shù)據(jù),并且能夠自動(dòng)恢復(fù)。

Checkpoint:Flink基于Checkpoint實(shí)現(xiàn)容錯(cuò),用戶可以自定義對(duì)整個(gè)任務(wù)的Checkpoint策略,當(dāng)任務(wù)出現(xiàn)失敗時(shí),可以將任務(wù)恢復(fù)到最近一次Checkpoint的狀態(tài),從數(shù)據(jù)源重發(fā)快照之后的數(shù)據(jù)。

Savepoint:一個(gè)Savepoint就是應(yīng)用狀態(tài)的一致性快照,Savepoint與Checkpoint機(jī)制相似,但Savepoint需要手動(dòng)觸發(fā),Savepoint保證了任務(wù)在升級(jí)或 遷移 時(shí),不丟失掉當(dāng)前流應(yīng)用的狀態(tài)信息,便于任何時(shí)間點(diǎn)的任務(wù)暫停和恢復(fù)。

  • Flink SQL

Table API和SQL借助了Apache Calcite來(lái)進(jìn)行查詢的解析,校驗(yàn)以及優(yōu)化,可以與DataStream和DataSet API無(wú)縫集成,并支持用戶自定義的標(biāo)量函數(shù),聚合函數(shù)以及表值函數(shù)。簡(jiǎn)化數(shù)據(jù)分析、ETL等應(yīng)用的定義。

  • CEP in SQL

Flink允許用戶在SQL中表示CEP(Complex Event Processing)查詢結(jié)果以用于模式匹配,并在Flink上對(duì)事件流進(jìn)行評(píng)估。

CEP SQL通過(guò)MATCH_RECOGNIZE的SQL語(yǔ)法實(shí)現(xiàn)。MATCH_RECOGNIZE子句自O(shè)racle Database 12c起由Oracle SQL支持,用于在SQL中表示事件模式匹配。