Flink 基本原理与生产实践分享【入门必读,概念清晰】
Flink 基本原理與生產(chǎn)實(shí)踐分享【入門必讀,概念清晰】
https://zh.wikipedia.org/zh-hans/Apache_Flink
Apache Flink是由Apache軟件基金會(huì)開(kāi)發(fā)的開(kāi)源流處理框架,其核心是用Java和Scala編寫的分布式流數(shù)據(jù)流引擎。Flink以數(shù)據(jù)并行和流水線方式執(zhí)行任意流數(shù)據(jù)程序,Flink的流水線運(yùn)行時(shí)系統(tǒng)可以執(zhí)行批處理和流處理程序。此外,Flink的運(yùn)行時(shí)本身也支持迭代算法的執(zhí)行。
Flink提供高吞吐量、低延遲的流數(shù)據(jù)引擎以及對(duì)事件-時(shí)間處理和狀態(tài)管理的支持。Flink應(yīng)用程序在發(fā)生機(jī)器故障時(shí)具有容錯(cuò)能力,并且支持exactly-once語(yǔ)義。程序可以用Java、Scala、Python和SQL等語(yǔ)言編寫,并自動(dòng)編譯和優(yōu)化到在集群或云環(huán)境中運(yùn)行的數(shù)據(jù)流程序。
Flink并不提供自己的數(shù)據(jù)存儲(chǔ)系統(tǒng),但為Amazon Kinesis、Apache Kafka、HDFS、Apache Cassandra和ElasticSearch等系統(tǒng)提供了數(shù)據(jù)源和接收器。
?
概述
Apache Flink的數(shù)據(jù)流編程模型在有限和無(wú)限數(shù)據(jù)集上提供單次事件(event-at-a-time)處理。在基礎(chǔ)層面,Flink程序由流和轉(zhuǎn)換組成。 “從概念上講,流是一種(可能永無(wú)止境的)數(shù)據(jù)流記錄,轉(zhuǎn)換是一種將一個(gè)或多個(gè)流作為輸入并因此產(chǎn)生一個(gè)或多個(gè)輸出流的操作”。
Apache Flink包括兩個(gè)核心API:用于有界或無(wú)界數(shù)據(jù)流的數(shù)據(jù)流API和用于有界數(shù)據(jù)集的數(shù)據(jù)集API。Flink還提供了一個(gè)表API,它是一種類似SQL的表達(dá)式語(yǔ)言,用于關(guān)系流和批處理,可以很容易地嵌入到Flink的數(shù)據(jù)流和數(shù)據(jù)集API中。Flink支持的最高級(jí)語(yǔ)言是SQL,它在語(yǔ)義上類似于表API,并將程序表示為SQL查詢表達(dá)式。
編程模型和分布式運(yùn)行時(shí)
Flink程序在執(zhí)行后被映射到流數(shù)據(jù)流,每個(gè)Flink數(shù)據(jù)流以一個(gè)或多個(gè)源(數(shù)據(jù)輸入,例如消息隊(duì)列或文件系統(tǒng))開(kāi)始,并以一個(gè)或多個(gè)接收器(數(shù)據(jù)輸出,如消息隊(duì)列、文件系統(tǒng)或數(shù)據(jù)庫(kù)等)結(jié)束。Flink可以對(duì)流執(zhí)行任意數(shù)量的變換,這些流可以被編排為有向無(wú)環(huán)數(shù)據(jù)流圖,允許應(yīng)用程序分支和合并數(shù)據(jù)流。
Flink提供現(xiàn)成的源和接收連接器,包括Apache Kafka、Amazon Kinesis、HDFS和Apache Cassandra等。
Flink程序可以作為集群內(nèi)的分布式系統(tǒng)運(yùn)行,也可以以獨(dú)立模式或在YARN、Mesos、基于Docker的環(huán)境和其他資源管理框架下進(jìn)行部署。
狀態(tài):檢查點(diǎn)、保存點(diǎn)和容錯(cuò)
Apache Flink具有一種基于分布式檢查點(diǎn)的輕量級(jí)容錯(cuò)機(jī)制。檢查點(diǎn)是應(yīng)用程序狀態(tài)和源流中位置的自動(dòng)異步快照。在發(fā)生故障的情況下,啟用了檢查點(diǎn)的Flink程序?qū)⒃诨謴?fù)時(shí)從上一個(gè)完成的檢查點(diǎn)恢復(fù)處理,確保Flink在應(yīng)用程序中保持一次性(exactly-once)狀態(tài)語(yǔ)義。檢查點(diǎn)機(jī)制暴露應(yīng)用程序代碼的接口,以便將外部系統(tǒng)包括在檢查點(diǎn)機(jī)制中(如打開(kāi)和提交數(shù)據(jù)庫(kù)系統(tǒng)的事務(wù))。
Flink還包括一種名為保存點(diǎn)的機(jī)制,它是一種手動(dòng)觸發(fā)的檢查點(diǎn)。用戶可以生成保存點(diǎn),停止正在運(yùn)行的Flink程序,然后從流中的相同應(yīng)用程序狀態(tài)和位置恢復(fù)程序。 保存點(diǎn)可以在不丟失應(yīng)用程序狀態(tài)的情況下對(duì)Flink程序或Flink群集進(jìn)行更新。從Flink 1.2開(kāi)始,保存點(diǎn)還允許以不同的并行性重新啟動(dòng)應(yīng)用程序,這使得用戶可以適應(yīng)不斷變化的工作負(fù)載。
-------------------------------------------
下面是小象學(xué)院的公開(kāi)課,原始地址在:http://www.chinahadoop.cn/course/1102
下面是我以前的聽(tīng)課筆記,花了很多時(shí)間自己一個(gè)字一個(gè)字敲出來(lái)的,想想還是分享給大家看看,這樣其他人就不用按暫停來(lái)寫聽(tīng)課筆記了。
原講座時(shí)間:2018.1.29? ? 作者:羅江宇
實(shí)時(shí)計(jì)算的一些基本概念
有界數(shù)據(jù):在離線層面很常見(jiàn),讀文件最終會(huì)結(jié)束就是有界。
實(shí)時(shí)計(jì)算用有界數(shù)據(jù)計(jì)算無(wú)界數(shù)據(jù),比如幾分鐘的。實(shí)時(shí)計(jì)算就是處理無(wú)界數(shù)據(jù)的。
事件時(shí)間:事件產(chǎn)生的時(shí)間,一條日志產(chǎn)生的時(shí)間
處理時(shí)間:實(shí)時(shí)計(jì)算處理時(shí)候的時(shí)間。
窗口:最近一分鐘或者幾分鐘的數(shù)據(jù)進(jìn)行切割聚合,窗口就是切分有界數(shù)據(jù)。
水位線:水位線以下的事件已經(jīng)到齊就是一個(gè)標(biāo)準(zhǔn)。
觸發(fā)器:很多情況就是和窗口結(jié)合,觸發(fā)窗口里的數(shù)據(jù)計(jì)算
轉(zhuǎn)換:也稱算子。
at-most-once:數(shù)據(jù)計(jì)算至多一次,會(huì)丟數(shù)據(jù),很少用。
at-lease-once:最少處理一次,數(shù)據(jù)傳輸計(jì)算肯能會(huì)重復(fù)計(jì)算,有數(shù)據(jù)重復(fù)的情況
at-exactly-once:整一次,會(huì)有性能損失。
blink:SQL 方面做了很多改進(jìn),還有就是onyarn做了很多改進(jìn)。
自己公司是Flink千萬(wàn)級(jí)每秒
其他引擎是用微批 ,10秒或者1秒一批,就會(huì)影響延遲。
用系統(tǒng)時(shí)間計(jì)算窗口會(huì)丟失一些時(shí)間,用eventtime就不會(huì)丟。
狀態(tài):機(jī)器宕機(jī),可以恢復(fù)。一個(gè)有狀態(tài)的算。
storm:因?yàn)檫M(jìn)程掛掉,導(dǎo)致?tīng)顟B(tài)丟失。storm已經(jīng)沒(méi)人用了,jstorm只是在其上做一些優(yōu)化。
支持者at-least-once.
從kafka消費(fèi)一個(gè)數(shù)據(jù),再寫到kafka。管理應(yīng)用有很多為問(wèn)題,穩(wěn)定性也有問(wèn)題,比如進(jìn)程掛了。
一進(jìn)來(lái)數(shù)據(jù)就是微批做了切割。低延遲很難達(dá)到。ss2.2做了一個(gè)融合離線和實(shí)時(shí)寫法一樣。也會(huì)支持全流式。
部署:local IDE底下做一些測(cè)試;
cluster:standalone:利用率比較低。
onyarn:提高機(jī)器利用率。
datastreamAPI:流式處理的API
datasetAPI:批量處理,是通過(guò)流式處理做批處理。
用flink還是流失的多。
CEP:復(fù)雜事件處理。有做用戶行為分析,實(shí)時(shí)分控,提高分控吞吐量,業(yè)界有些吞吐量不行。
SQL+CEP和動(dòng)態(tài)CEP,因?yàn)橛脩魧懘a很復(fù)雜。
要先有數(shù)據(jù)構(gòu)建一個(gè)數(shù)據(jù)流,一開(kāi)始上面代碼還少了一塊要構(gòu)建流失環(huán)境變量。選擇是dataset還是datastream.
source:數(shù)據(jù)源,從kafka讀。讀完后做一些轉(zhuǎn)化。這里Map這個(gè)算子就是1對(duì)1的概念。
10秒聚合統(tǒng)計(jì)這個(gè)id的次數(shù)。
整體是來(lái)一條數(shù)據(jù)就流下去,象工廠的流水線一樣。
并行度:多少個(gè)線程去跑。
數(shù)據(jù)切割,一個(gè)算子
timewindow:按時(shí)間切割,等時(shí)間的。這個(gè)實(shí)際用的最多。
Count :按事件的個(gè)數(shù)。
滾動(dòng)window:時(shí)間是對(duì)齊的。適合做BI類似的東西。
固定長(zhǎng)度:兩個(gè)窗口之間無(wú)交集數(shù)據(jù)。一個(gè)數(shù)據(jù)不會(huì)同時(shí)屬于2個(gè)window..可以有時(shí)間的也可可以有count的。
?
?
移動(dòng)窗口,適合求比如最近5分鐘的。也可以做一些監(jiān)控這些事情。
不支持countWindow,只支持timewindow。
<sesion gap的就可以聚合在一起,認(rèn)為是一個(gè)seeeion,適合線上行為分析。在這個(gè)session時(shí)間內(nèi)做了哪些事情。
sesion gap設(shè)置太大就不合理,因?yàn)槎季酆显谝黄鹆恕?/p>
?
3種時(shí)間,
eventtime:事件產(chǎn)生的時(shí)間,這個(gè)一般用的比較多。
ingestion:進(jìn)入flink的時(shí)間(進(jìn)入souce的時(shí)間),
processingtime:某個(gè)算子開(kāi)始處理的時(shí)間(window)
window和eventtime結(jié)合起來(lái)做事情。
水印:數(shù)據(jù)處理到那個(gè)位置了。水印到了說(shuō)明之前的數(shù)據(jù)已經(jīng)到齊了。
數(shù)據(jù)沒(méi)有到齊,都存起來(lái)先。一些中間狀態(tài)。
不要做持久化,只要做配置就會(huì)被Flink托管。機(jī)器掛了,進(jìn)程結(jié)束都可以根據(jù)這些狀態(tài)恢復(fù)。
operatorstate:算子的狀態(tài)
keyedstate:存hash的key
checkpoint:把狀態(tài)做一些容錯(cuò)。以前的流式計(jì)算為了計(jì)算一個(gè)state,所有的算子都要停止,獲取一個(gè)快照,記錄下?tīng)顟B(tài)。相當(dāng)于全局同步。Flink是全局異步,只有某個(gè)標(biāo)志到了,會(huì)把這個(gè)狀態(tài)做一個(gè)快照。
exavtly-once:假如需要依賴外部的東西需要三方都保證。不光是flink保證,還要souce好sink都要保證。
原理是數(shù)據(jù)源加一個(gè)標(biāo)志barriers,以這個(gè)算子為例所有的barriers都到齊了就會(huì)做一個(gè)快照。數(shù)據(jù)源會(huì)定時(shí)發(fā)送barriers進(jìn)來(lái),就是一個(gè)要做快照的標(biāo)志。
checkpoint主要做內(nèi)部失敗,從最近的一個(gè)成功的checkpoint恢復(fù)。
生成t1就會(huì)刪除t0,會(huì)fork一個(gè)版本出來(lái)。從t3時(shí)刻做了一次恢復(fù)從這個(gè)點(diǎn)進(jìn)行一次回溯的計(jì)算。
主要是作為外部恢復(fù),原來(lái)需要的資源不夠,需要把資源改大一點(diǎn),需要重啟。
目前官方的需要通過(guò)命令去做還沒(méi)有一套好的API讓用戶直接調(diào)用java代碼或者scala代碼,目前的savepoint還不是很好用。
運(yùn)行時(shí)架構(gòu)分為三個(gè)角色:client,jobmanager,taskmanager.
先生成一個(gè)圖,通過(guò)AKKA把“”圖“”發(fā)給jobmanager(看成一個(gè)master,做協(xié)調(diào)和分發(fā)的概念)
jobmanager兩個(gè)比較重要的功能:一個(gè)是調(diào)度,這個(gè)節(jié)點(diǎn)分配到那個(gè)taskmanager.
二是checkpoint的協(xié)調(diào)器,checkpoint官方也說(shuō)了是定時(shí)注入到source數(shù)據(jù)源。
taskmanager:真正干事情的,它有task槽的概念。
task槽實(shí)際上就是對(duì)taskmanager資源的分割。task是跑在task槽上真正在執(zhí)行任務(wù)。
taskmanager也會(huì)匯報(bào)心跳做一些統(tǒng)計(jì)。
taskmanager可以看做一個(gè)進(jìn)程。把內(nèi)存和CPU分割為3部分。虛線表示一個(gè)task,可以看成一個(gè)線程。
做一個(gè)chain:source和map 這2個(gè)算子泡在一個(gè)subtask上,這2個(gè)是可以串一起。這種是可以做一些優(yōu)化。
具體組成operatorChain有7個(gè)條件。
operator:一些算子
task:真正運(yùn)行的,就是幾個(gè)operator組成一個(gè)chain運(yùn)行在一個(gè)task上。
ETL:數(shù)據(jù)清洗。
數(shù)據(jù)埋點(diǎn)agent。怎么清洗任務(wù)下發(fā)給flinkETL。
大應(yīng)用好管理,也有風(fēng)險(xiǎn)大的topic,某一臺(tái)機(jī)器一掛影響所有ETL。
小應(yīng)用每個(gè)ETL是隔離不影響,管理成本又增大了,要做監(jiān)控,只會(huì)影響某一個(gè)ETL。
實(shí)際經(jīng)驗(yàn)還是用小應(yīng)用。
計(jì)算規(guī)則中心下發(fā)給Flink,Flink做一個(gè)聚合到es或者druid。druid做一個(gè)OLAP引擎,做一些預(yù)聚合。再落到dashboard做一個(gè)實(shí)時(shí)的BI和告警。ES:日志檢索的。
這里有個(gè)問(wèn)題就是數(shù)據(jù)是先在flink聚合再到druid還是只是flink做個(gè)ETL,聚合在druid里做,因?yàn)樗蓄A(yù)聚合。
實(shí)際生產(chǎn)下要做個(gè)權(quán)衡,如果flink不夠強(qiáng)大的話,那么只做個(gè)ETL。因?yàn)閣indow聚合有些狀態(tài)管理比較消耗資源。
或者可以在flink做1分鐘的基本單元的聚合然后再到druid做10分鐘的很大的聚合進(jìn)行累加也是比較常見(jiàn)的,相當(dāng)于只做一個(gè)基本單元的聚合。因?yàn)榱魇教幚韜indow比較大是不可以的,會(huì)有內(nèi)存過(guò)大導(dǎo)致各自問(wèn)題。
CEP只能靜態(tài)不能動(dòng)態(tài)加載CEP實(shí)時(shí)生效。可以做一些匹配告警這種。
實(shí)時(shí)機(jī)器學(xué)習(xí)做一些推薦,相對(duì)CEP還不是很成熟。
source擴(kuò)大并行度能不能起到作用,有些擴(kuò)大了沒(méi)用。
遇到很多自己寫一些狀態(tài),不符合flink托管的狀態(tài),實(shí)際開(kāi)發(fā)中要考慮狀態(tài)問(wèn)題。
異常一捕獲就會(huì)丟失數(shù)據(jù)。不捕獲又不好。需要權(quán)衡。
在一定延遲范圍業(yè)務(wù)方可以接受多少延遲,用多少并行度去處理。
追數(shù)據(jù)能力:機(jī)器宕機(jī),從上一個(gè)checkpoint去恢復(fù)數(shù)據(jù)。官方說(shuō)追數(shù)據(jù)能力3-5倍(正常數(shù)據(jù)量的3-5倍)以上。數(shù)據(jù)完整性和數(shù)據(jù)延遲。否則如果數(shù)據(jù)很大需要去掉checkpoint,直接從kafka消費(fèi)數(shù)據(jù)開(kāi)始計(jì)算。所以追數(shù)據(jù)能力不行要做一個(gè)權(quán)衡。
從運(yùn)維角度。
如果用戶說(shuō)丟數(shù)據(jù),需要有可以反駁用戶。也可能是發(fā)送方延遲,構(gòu)筑一個(gè)簡(jiǎn)單的數(shù)據(jù)質(zhì)量體系告訴用戶。
flinkUI上的度量比較簡(jiǎn)單,需要自己構(gòu)建收集flink的度量。
flink的日志在大規(guī)模生產(chǎn)有問(wèn)題,日志比較多會(huì)把flinkUI 搞掛,需要構(gòu)建flink日志的滾動(dòng)。還有用戶會(huì)去看。
要做一些flink平臺(tái)服務(wù)化,應(yīng)用監(jiān)控的質(zhì)量體系。
穩(wěn)定性保證:純流式的,還有很多問(wèn)題,很多都是某一個(gè)組件抖動(dòng),為了保證一致性會(huì)有一些問(wèn)題。
構(gòu)建SQL平臺(tái):SQL給用戶直接寫SQL。
學(xué)習(xí)流式計(jì)算作為一個(gè)函數(shù)式編程語(yǔ)言需要scala,面試必須。
Flink核心的通訊是AKKA也就是scala寫的。
paper:論文。
源碼上的接口上有注釋,官方文檔畢竟不完善。
總結(jié)
以上是生活随笔為你收集整理的Flink 基本原理与生产实践分享【入门必读,概念清晰】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果手表多少钱啊?
- 下一篇: Java线上问题排障:Linux内核bu