松江微網(wǎng)站建設(shè)重慶seo技術(shù)分享
目錄
Flink關(guān)鍵特性
流式處理
豐富的狀態(tài)管理
豐富的時(shí)間語(yǔ)義支持
?? Data pipeline
容錯(cuò)機(jī)制
Flink SQL
CEP in SQL
Flink 應(yīng)用程序可以消費(fèi)來(lái)自消息隊(duì)列或分布式日志這類(lèi)流式數(shù)據(jù)源(例如 Apache Kafka 或 Kinesis)的實(shí)時(shí)數(shù)據(jù),也可以從各種的數(shù)據(jù)源中消費(fèi)有界的歷史數(shù)據(jù)。同樣,Flink 應(yīng)用程序生成的結(jié)果流也可以發(fā)送到各種sink中。
Apache Flink由于其廣泛的特性,是開(kāi)發(fā)和運(yùn)行許多不同類(lèi)型應(yīng)用的優(yōu)秀選擇。Flink的特性包括對(duì)流和批處理的支持、復(fù)雜的狀態(tài)管理、event-time處理語(yǔ)義、以及exactly-once保證。此外,Flink可以部署在各種資源管理平臺(tái)上,例如Yarn、Mesos和Kubernetes,也可以作為一個(gè)standalone的集群。Flink具有高可用性,沒(méi)有單點(diǎn)故障的情況。Flink已經(jīng)被證明可以擴(kuò)展到數(shù)千個(gè)核和TB級(jí)的應(yīng)用,并提供高吞吐量和低延遲。
Flink關(guān)鍵特性
-
流式處理
無(wú)界流是有始無(wú)終的數(shù)據(jù)流,即無(wú)限數(shù)據(jù)流,程序必須持續(xù)不斷地對(duì)到達(dá)的數(shù)據(jù)進(jìn)行處理。有界流是限定大小的有始有終的數(shù)據(jù)集合,即有限數(shù)據(jù)流,批處理是有界數(shù)據(jù)流處理的范例??梢詫?duì)整個(gè)數(shù)據(jù)集的數(shù)據(jù)進(jìn)行排序、統(tǒng)計(jì)或匯總計(jì)算后再輸出結(jié)果。
這種以流為世界觀的架構(gòu),獲得的最大好處就是具有極低的延遲。
-
豐富的狀態(tài)管理
狀態(tài)由一個(gè)任務(wù)維護(hù),并且用來(lái)計(jì)算某個(gè)結(jié)果的所有數(shù)據(jù),都屬于這個(gè)任務(wù)的狀態(tài),可以認(rèn)為狀態(tài)就是一個(gè)本地變量,可以被任務(wù)的業(yè)務(wù)邏輯訪問(wèn)。
Flink會(huì)進(jìn)行狀態(tài)管理,包括狀態(tài)一致性、故障處理以及高效存儲(chǔ)和訪問(wèn),以便開(kāi)發(fā)人員可以專(zhuān)注于應(yīng)用程序的邏輯。Flink提供豐富的狀態(tài)管理,包括多種基礎(chǔ)狀態(tài)類(lèi)型、豐富的State Backend,State可以存儲(chǔ)在內(nèi)存上或RocksDB等上,并支持異步以及增量的Checkpoint機(jī)制、精確一次語(yǔ)義等等。
Flink 應(yīng)用程序的狀態(tài)訪問(wèn)都在本地進(jìn)行,因?yàn)檫@有助于其提高吞吐量和降低延遲。通常情況下 Flink 應(yīng)用程序都是將狀態(tài)存儲(chǔ)在 JVM 堆上,但如果狀態(tài)太大,我們也可以選擇將其以結(jié)構(gòu)化數(shù)據(jù)格式存儲(chǔ)在高速磁盤(pán)中。
時(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)單。
- Ingestion Time:是數(shù)據(jù)進(jìn)入Flink的時(shí)間
- Processing Time:是每一個(gè)執(zhí)行基于時(shí)間操作的算子的本地系統(tǒng)時(shí)間,與機(jī)器相關(guān),如默認(rèn)的時(shí)間屬性。
- Watermark支持:Flink引入Watermark概念,用以衡量事件時(shí)間的發(fā)展。Watermark也為平衡處理時(shí)延和數(shù)據(jù)完整性提供了靈活的保障。當(dāng)處理帶有Watermark的事件流時(shí),在計(jì)算完成之后仍然有相關(guān)數(shù)據(jù)到達(dá)時(shí),Flink提供了多種處理選項(xiàng),如將數(shù)據(jù)重定向(side output)或更新之前完成的計(jì)算結(jié)果。
- 高度靈活的流式窗口支持:Flink能夠支持時(shí)間窗口、計(jì)數(shù)窗口、會(huì)話(huà)窗口,以及數(shù)據(jù)驅(qū)動(dòng)的自定義窗口,可以通過(guò)靈活的觸發(fā)條件定制,實(shí)現(xiàn)復(fù)雜的流式計(jì)算模式。
-
?? Data pipeline
ETL(抽取-轉(zhuǎn)換-加載)是在存儲(chǔ)系統(tǒng)間轉(zhuǎn)換和移動(dòng)數(shù)據(jù)的一種常用方法。通常,ETL任務(wù)會(huì)定期的觸發(fā),將業(yè)務(wù)數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)拷貝到分析數(shù)據(jù)庫(kù)或數(shù)據(jù)倉(cāng)庫(kù)中。
?data pipeline的作用和ETL任務(wù)類(lèi)似。它們轉(zhuǎn)換數(shù)據(jù),將數(shù)據(jù)從一個(gè)存儲(chǔ)系統(tǒng)移動(dòng)到另一個(gè)存儲(chǔ)系統(tǒng)。然而,data pipeline操作不是定期的觸發(fā),而是作為一個(gè)連續(xù)不斷的流處理方式處理數(shù)據(jù)。因此,它們能從不斷產(chǎn)生數(shù)據(jù)的源中讀取記錄,并以較低延遲將其移動(dòng)到目的地。
連續(xù)的data pipelines相比周期性的ETL作業(yè),其最大的優(yōu)點(diǎn)使具有更低的延遲。此外,data pipeline更加通用,可以用于更多場(chǎng)景,因?yàn)樗鼈兡苓B續(xù)地使用和發(fā)出數(shù)據(jù)。
-
容錯(cuò)機(jī)制
Flink的Checkpoint和故障恢復(fù)能力保證了任務(wù)在故障發(fā)生前后的應(yīng)用狀態(tài)一致性,為某些特定的存儲(chǔ)支持了事務(wù)型輸出的功能,即使在發(fā)生故障的情況下,也能夠保證精確一次的輸出。
Flink基于Checkpoint實(shí)現(xiàn)容錯(cuò),用戶(hù)可以自定義對(duì)整個(gè)任務(wù)的Checkpoint策略,當(dāng)任務(wù)出現(xiàn)失敗時(shí),可以將任務(wù)恢復(fù)到最近一次Checkpoint的狀態(tài),從數(shù)據(jù)源重發(fā)快照之后的數(shù)據(jù)。即重置數(shù)據(jù)源從狀態(tài)中記錄的上次消費(fèi)的偏移量開(kāi)始重新進(jìn)行消費(fèi)處理。而且狀態(tài)快照在執(zhí)行時(shí)會(huì)異步獲取狀態(tài)并存儲(chǔ),并不會(huì)阻塞正在進(jìn)行的數(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
SELECT userId, COUNT(*)
FROM clicks
GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId
-
CEP in SQL
CEP SQL 通過(guò)MATCH_RECOGNIZE的SQL語(yǔ)法實(shí)現(xiàn)。MATCH_RECOGNIZE子句自Oracle Database 12c起由Oracle SQL支持,用于在SQL中表示事件模式匹配。CEP SQL使用舉例如下:
SELECT T.aid, T.bid, T.cid
FROM MyTableMATCH_RECOGNIZE (PARTITION BY useridORDER BY proctimeMEASURESA.id AS aid,B.id AS bid,C.id AS cidPATTERN (A B C)DEFINEA AS name = 'a',B AS name = 'b',C AS name = 'c') AS T