前段時(shí)間調(diào)研了一下實(shí)時(shí)計(jì)算相關(guān)技術(shù)焕檬,因?yàn)楹笃跁?huì)搭建我們的數(shù)據(jù)分析平臺(tái)宴霸,由于近期精力有限,沒有做過多深入了解膏蚓,在我們測試庫上搭建flink服務(wù),做了一些常規(guī)的job提交等操作畸写,同時(shí)對apache flink做了一些入門的學(xué)習(xí)驮瞧,由于目前阿里云的實(shí)時(shí)計(jì)算框架,就是采用apache flink技術(shù)枯芬,所有后期會(huì)對apache flink進(jìn)行更深入的學(xué)習(xí)论笔。
核心要素
Checkpoint:Exactly-Once語義實(shí)現(xiàn)的關(guān)鍵;
State:如果當(dāng)前事件的處理結(jié)果與之前事件有關(guān)千所,則稱為有狀態(tài)處理狂魔;相反,如果當(dāng)前事件的處理結(jié)果只與事件本身相關(guān)淫痰,則為無狀態(tài)的最楷;
Window:流計(jì)算的基本單元,window將無限的流分隔成有限大小的bucket進(jìn)行處理待错;
Time:定義事件的順序籽孙;
特性
有狀態(tài)計(jì)算的Exactly-once語義。狀態(tài)是指flink能夠維護(hù)數(shù)據(jù)在時(shí)序上的聚類和聚合火俄,同時(shí)它的checkpoint機(jī)制
支持帶有事件時(shí)間(event time)語義的流處理和窗口處理犯建。事件時(shí)間的語義使流計(jì)算的結(jié)果更加精確,尤其在事件到達(dá)無序或者延遲的情況下瓜客。
支持高度靈活的窗口(window)操作适瓦。支持基于time、count谱仪、session玻熙,以及data-driven的窗口操作,能很好的對現(xiàn)實(shí)環(huán)境中的創(chuàng)建的數(shù)據(jù)進(jìn)行建模芽卿。
輕量的容錯(cuò)處理( fault tolerance)揭芍。 它使得系統(tǒng)既能保持高的吞吐率又能保證exactly-once的一致性。通過輕量的state snapshots實(shí)現(xiàn)
支持高吞吐卸例、低延遲称杨、高性能的流處理
支持savepoints 機(jī)制(一般手動(dòng)觸發(fā))。即可以將應(yīng)用的運(yùn)行狀態(tài)保存下來筷转;在升級應(yīng)用或者處理歷史數(shù)據(jù)是能夠做到無狀態(tài)丟失和最小停機(jī)時(shí)間姑原。
支持大規(guī)模的集群模式,支持yarn呜舒、Mesos锭汛。可運(yùn)行在成千上萬的節(jié)點(diǎn)上
支持具有Backpressure功能的持續(xù)流模型
Flink在JVM內(nèi)部實(shí)現(xiàn)了自己的內(nèi)存管理
支持迭代計(jì)算
支持程序自動(dòng)優(yōu)化:避免特定情況下Shuffle、排序等昂貴操作唤殴,中間結(jié)果進(jìn)行緩存
程序和數(shù)據(jù)源
Flink程序構(gòu)建的基本單元是stream和transformation(請注意般婆,DataSet實(shí)質(zhì)上也是stream)。一個(gè)stream是一個(gè)中間結(jié)果朵逝,一個(gè)transformation是一個(gè)操作蔚袍,該操作以一個(gè)或多個(gè)stream為輸入,計(jì)算輸出一個(gè)或多個(gè)stream為結(jié)果配名。
在運(yùn)行時(shí)啤咽,F(xiàn)link上運(yùn)行的程序會(huì)被映射成streaming dataflows,它包含了streams和transformations操作渠脉。每個(gè)dataflow以一個(gè)或者多個(gè)source開始宇整,以一個(gè)或多個(gè)sink結(jié)束。dataflow類似于有向無環(huán)圖(DAG)芋膘,特殊形式的環(huán)也允許通過iteration構(gòu)建鳞青。
在大多數(shù)情況下,程序中的transformation和dataflow中的操作是一一對應(yīng)關(guān)系索赏,但有時(shí)候一個(gè)transformation可能對應(yīng)了多個(gè)操作盼玄。
并行的數(shù)據(jù)流
在Flink中,程序天生是并行和分布式的:一個(gè)Stream可以被分成多個(gè)Stream分區(qū)(Stream Partitions)潜腻,一個(gè)Operator可以被分成多個(gè)Operator Subtask埃儿,每一個(gè)Operator Subtask是在不同的線程中獨(dú)立執(zhí)行的。一個(gè)Operator的并行度融涣,等于Operator Subtask的個(gè)數(shù)童番,一個(gè)Stream的并行度總是等于生成它的Operator的并行度
API
Flink有四個(gè)主要的API
DataStream API適合用于那些實(shí)現(xiàn)在數(shù)據(jù)流上轉(zhuǎn)換的程序。(例如:過濾威鹿,更新狀態(tài)剃斧,窗口定義,聚合)
DataSet API適合用于那些實(shí)現(xiàn)在數(shù)據(jù)流上轉(zhuǎn)換的程序(例如:過濾忽你,映射幼东,連接,分組)
Table API適合于關(guān)系流和批處理科雳,能輕松嵌入Flink的 DataSet API 和 DataStream API 的類SQL表達(dá)式的語言(Java和Scala)根蟹。
Streaming SQL 允許在流和多表上執(zhí)行SQL查詢。