聊聊Flink:Flink的基礎(chǔ)架構(gòu)
一、前言
哈嘍,大家好,我是微信公眾號(hào)【老周聊架構(gòu)】的作者老周,老周這次給大家分享下Flink系列的知識(shí)。作為Flink系列的開(kāi)篇之作,我腦海中想著有沒(méi)有一種很好的方式來(lái)讓大家通俗易懂的了解Flink。因?yàn)槟阋簧蟻?lái)就介紹Flink的一些概念和核心思想,初學(xué)的小伙伴不是那么容易接受這么生疏的東西。所以,老周想從大數(shù)據(jù)的開(kāi)發(fā)總體架構(gòu)來(lái)說(shuō),讓大家知道Flink在大數(shù)據(jù)領(lǐng)域處于一個(gè)什么位置,先有個(gè)整體的概念,再對(duì)Flink娓娓道來(lái),初始、進(jìn)階、高級(jí),一步一步認(rèn)清Flink,只有對(duì)Flink的原理掌握了,那么在開(kāi)發(fā)中也會(huì)得心應(yīng)手些。
二、大數(shù)據(jù)開(kāi)發(fā)整體架構(gòu)
2.1 數(shù)據(jù)來(lái)源層
在大數(shù)據(jù)領(lǐng)域,數(shù)據(jù)的來(lái)源往往是關(guān)系型數(shù)據(jù)庫(kù)、日志文件(用戶在Web網(wǎng)站和手機(jī)App中瀏覽相關(guān)內(nèi)容時(shí),服務(wù)器端會(huì)生成大量的日志文件)、其他非結(jié)構(gòu)化數(shù)據(jù)等。要想對(duì)這些大量的數(shù)據(jù)進(jìn)行離線或?qū)崟r(shí)分析,需要使用數(shù)據(jù)傳輸工具將其導(dǎo)入Hadoop平臺(tái)或其他大數(shù)據(jù)集群中。
2.2 數(shù)據(jù)傳輸層
常用的數(shù)據(jù)傳輸工具有Flume、Sqoop、Kafka。Flume是一個(gè)日志收集系統(tǒng),用于將大量日志數(shù)據(jù)從不同的源進(jìn)行收集、聚合,最終移動(dòng)到一個(gè)集中的數(shù)據(jù)中心進(jìn)行存儲(chǔ)。Sqoop主要用于將數(shù)據(jù)在關(guān)系型數(shù)據(jù)庫(kù)和Hadoop平臺(tái)之間進(jìn)行相互轉(zhuǎn)移。Kafka是一個(gè)分布式消息引擎,它可以實(shí)時(shí)處理大量消息數(shù)據(jù)以滿足各種需求,相當(dāng)于數(shù)據(jù)中轉(zhuǎn)站。
2.3 數(shù)據(jù)存儲(chǔ)層
數(shù)據(jù)可以存儲(chǔ)于分布式文件系統(tǒng)HDFS中,也可以存儲(chǔ)于分布式數(shù)據(jù)庫(kù)HBase中,而HBase的底層實(shí)際上還是將數(shù)據(jù)存儲(chǔ)于HDFS中。此外,為了滿足對(duì)大量數(shù)據(jù)的快速檢索與統(tǒng)計(jì),可以使用Elasticsearch作為全文檢索引擎。
2.4 資源管理層
YARN是大數(shù)據(jù)開(kāi)發(fā)中常用的資源管理器,它是一個(gè)通用資源(內(nèi)存、CPU)管理系統(tǒng),不僅可以集成于Hadoop中,也可以集成于Flink、Spark等其他大數(shù)據(jù)框架中。
2.5 數(shù)據(jù)計(jì)算層
MapReduce是Hadoop的核心組成部分,可以結(jié)合Hive通過(guò)SQL的方式進(jìn)行數(shù)據(jù)的離線計(jì)算,當(dāng)然也可以單獨(dú)編寫(xiě)MapReduce應(yīng)用程序進(jìn)行計(jì)算。Storm用于進(jìn)行數(shù)據(jù)的實(shí)時(shí)計(jì)算,可以非常容易地實(shí)時(shí)處理無(wú)限的流數(shù)據(jù)。Flink提供了離線計(jì)算庫(kù)和實(shí)時(shí)計(jì)算庫(kù)兩種,離線計(jì)算庫(kù)支持FlinkML(機(jī)器學(xué)習(xí))、Gelly(圖計(jì)算)、基于Table的關(guān)系操作,實(shí)時(shí)計(jì)算庫(kù)支持CEP(復(fù)雜事件處理),同時(shí)也支持基于Table的關(guān)系操作。
2.6 任務(wù)調(diào)度層
Oozie是一個(gè)用于Hadoop平臺(tái)的工作流調(diào)度引擎,可以使用工作流的方式對(duì)編寫(xiě)好的大數(shù)據(jù)任務(wù)進(jìn)行調(diào)度。若任務(wù)不復(fù)雜,則可以使用Linux系統(tǒng)自帶的Crontab定時(shí)任務(wù)進(jìn)行調(diào)度。
2.7 業(yè)務(wù)模型層
對(duì)大量數(shù)據(jù)的處理結(jié)果最終需要通過(guò)可視化的方式進(jìn)行展示??梢允褂肑ava、PHP等處理業(yè)務(wù)邏輯,查詢結(jié)果數(shù)據(jù)庫(kù),最終結(jié)合ECharts等前端可視化框架展示處理結(jié)果。
我們從另一個(gè)角度來(lái)看看Flink在大數(shù)據(jù)開(kāi)發(fā)整體架構(gòu)中位置,看完估計(jì)你心里有個(gè)底了。
三、Flink是什么
Apache Flink是一個(gè)框架和分布式處理引擎,用于對(duì)無(wú)邊界和有邊界的數(shù)據(jù)流進(jìn)行有狀態(tài)的計(jì)算。Flink被設(shè)計(jì)為可以在所有常見(jiàn)集群環(huán)境中運(yùn)行,并能以內(nèi)存速度和任意規(guī)模執(zhí)行計(jì)算。
Flink在實(shí)現(xiàn)流處理和批處理時(shí),與傳統(tǒng)的一些方案完全不同,它從另一個(gè)視角看待流處理和批處理,將二者統(tǒng)一起來(lái):Flink 是完全支持流處理,也就是說(shuō)作為流處理看待時(shí)輸入數(shù)據(jù)流是無(wú)界的;批處理被作為一種特殊的流處理,只是它的輸入數(shù)據(jù)流被定義為有界的?;?于同一個(gè)Flink運(yùn)行時(shí)(Flink Runtime),分別提供了流處理和批處理API,而這兩種API也是實(shí)現(xiàn)上層面向流處理、批處理類型應(yīng)用框架的基礎(chǔ)。
我們?cè)賮?lái)看離線批計(jì)算與實(shí)時(shí)流計(jì)算:
批計(jì)算:有界流
流式計(jì)算:無(wú)界流
-
批計(jì)算:針對(duì)有界流,在計(jì)算結(jié)果前可以看到整個(gè)數(shù)據(jù)集。
-
流計(jì)算:針對(duì)無(wú)界流,永遠(yuǎn)無(wú)法看到輸入數(shù)據(jù)的整體,數(shù)據(jù)的輸入無(wú)法看到結(jié)束,數(shù)據(jù)到達(dá)就計(jì)算,輸出當(dāng)時(shí)(實(shí)時(shí))的計(jì)算結(jié)果;輸出結(jié)果也是一個(gè)無(wú)界流;數(shù)據(jù)到達(dá)也可以理解為可以把無(wú)界流變成有界流在計(jì)算,比如時(shí)間劃分,數(shù)據(jù)量劃分。
這里Flink把流計(jì)算和批計(jì)算進(jìn)行了API層面的統(tǒng)一,是一個(gè)流批一體的計(jì)算框架。
3.1 Flink的特性
3.1.1 Flink核心特性
-
支持高吞吐、低延遲、高性能的流處理
-
支持帶有事件時(shí)間的窗口(Window)操作
-
支持有狀態(tài)計(jì)算的 Exactly-once 語(yǔ)義
-
支持高度靈活的窗口(time/count/session)Window 操作,以及 data-driven 驅(qū)動(dòng)
-
支持具有 BackPressure 功能的持續(xù)流模型
-
支持基于輕量級(jí)分布式快照(Snapshot)實(shí)現(xiàn)的容錯(cuò)
-
一個(gè)運(yùn)行時(shí)同時(shí)支持 Batch on Streaming 處理和 Streaming 處理
-
Flink 在 JVM 內(nèi)部實(shí)現(xiàn)了自己的內(nèi)存管理
-
支持迭代計(jì)算
-
支持程序自動(dòng)優(yōu)化:避免特定情況下 Shuffle、排序等昂貴操作,中間結(jié)果進(jìn)行緩存。
3.1.2 Flink特點(diǎn)
-
Correctness guarantees: 恰好一次狀態(tài)一致性、事件時(shí)間處理、復(fù)雜的后期數(shù)據(jù)處理
-
Layered APIs: 流式和批量數(shù)據(jù)上的 SQL、數(shù)據(jù)流 API 和數(shù)據(jù)集 API、ProcessFunction(時(shí)間和狀態(tài))
-
Operational focus: 靈活部署、可靠性、checkpoint
-
Scalability: 橫向擴(kuò)展架構(gòu)、支持非常大的狀態(tài)、增量檢查點(diǎn)
-
Performance: 低延遲、高吞吐量、內(nèi)存計(jì)算
3.1.3 Flink關(guān)鍵特性
-
低延時(shí):提供 ms 級(jí)時(shí)延的處理能力
-
Exactly Once:提供異步快照機(jī)制,保證所有數(shù)據(jù)真正處理一次
-
HA:JobManager 支持主備模式,保證無(wú)單點(diǎn)故障
-
水平擴(kuò)展能力:TaskManager 支持手動(dòng)水平擴(kuò)展
3.2 流計(jì)算框架對(duì)比
四、Flink的主要組件
-
Deploy層:該層主要涉及了Flink的部署模式,F(xiàn)link支持多種部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2),Standalone部署模式與Spark類似。
-
Runtime層:Runtime層提供了支持Flink計(jì)算的全部核心實(shí)現(xiàn),比如:支持分布式Stream處理、Job Graph到Execution Graph的映射、調(diào)度 等,為上層API層提供基礎(chǔ)服務(wù)。
-
API層:API層主要實(shí)現(xiàn)了面向無(wú)界Stream的流處理和面向Batch的批處理API,其中面向流處理對(duì)應(yīng)DataStream API,面向批處理對(duì)應(yīng)DataSet API。
-
Libraries層:該層也可以稱為Flink應(yīng)用框架層,根據(jù)API層的劃分,在API層之上構(gòu)建的滿足特定應(yīng)用的實(shí)時(shí)計(jì)算框架,也分別對(duì)應(yīng)于面向流處理和面向批處理兩類。面向流處理支持:CEP(復(fù)雜事件處理)、SQL-like的操作(基于Table的關(guān)系操作);面向批處理支持:FlinkML(機(jī)器學(xué)習(xí)庫(kù))、Gelly(圖處理)。
五、編程接口
Flink提供了豐富的數(shù)據(jù)處理接口,并將接口抽象成3層,由下向上分別為Stateful Stream Processing API、DataStream/DataSet API、SQL/Table API,開(kāi)發(fā)者可以根據(jù)具體需求選擇任意一層接口進(jìn)行應(yīng)用開(kāi)發(fā)。
5.1 Stateful Stream Processing API
Flink中處理有狀態(tài)流最底層的接口,它通過(guò)Process Function(低階API,F(xiàn)link提供的最具表達(dá)力的底層接口)嵌入DataStream API中,允許用戶自由地處理一個(gè)或多個(gè)流中的事件,并使用一致的容錯(cuò)狀態(tài)。此外,用戶可以注冊(cè)事件時(shí)間和處理時(shí)間回調(diào),從而允許程序?qū)崿F(xiàn)復(fù)雜的計(jì)算。用戶可以通過(guò)這個(gè)API接口操作狀態(tài)、時(shí)間等底層數(shù)據(jù)。
使用Stateful Stream Process API接口可以實(shí)現(xiàn)非常復(fù)雜的流式計(jì)算邏輯,開(kāi)發(fā)靈活性非常強(qiáng),但是用戶使用成本也相對(duì)較高。
5.2 DataStream/DataSet API
實(shí)際上,大多數(shù)應(yīng)用程序不需要上述低級(jí)抽象,而是針對(duì)核心API進(jìn)行編程的,例如DataStream API和DataSet API。DataStream API用于處理無(wú)界數(shù)據(jù)集,即流處理;DataSet API用于處理有界數(shù)據(jù)集,即批處理。這兩種API都提供了用于數(shù)據(jù)處理的通用操作,例如各種形式的轉(zhuǎn)換、連接、聚合等。
低級(jí)Process Function與DataStream API集成在一起,從而使得僅對(duì)某些操作進(jìn)行低級(jí)抽象成為可能。DataSet API在有限的數(shù)據(jù)集上提供了其他原語(yǔ),例如循環(huán)/迭代。
5.3 SQL/Table API
Table API作為批處理和流處理統(tǒng)一的關(guān)系型API,即查詢?cè)跓o(wú)界實(shí)時(shí)流或有界批數(shù)據(jù)集上以相同的語(yǔ)義執(zhí)行,并產(chǎn)生相同的結(jié)果。Flink中的Table API通常用于簡(jiǎn)化數(shù)據(jù)分析、數(shù)據(jù)流水線和ETL應(yīng)用程序的定義。
Table API構(gòu)建在DataStream/DataSet API之上,提供了大量編程接口,例如GroupByKey、Join等操作,是批處理和流處理統(tǒng)一的關(guān)系型API,使用起來(lái)更加簡(jiǎn)潔。使用Table API允許在表與DataStream/DataSet數(shù)據(jù)集之間無(wú)縫切換,并且可以將Table API與DataStream/DataSet API混合使用。
Table API的原理是將內(nèi)存中的DataStream/DataSet數(shù)據(jù)集在原有的基礎(chǔ)上增加Schema信息,將數(shù)據(jù)類型統(tǒng)一抽象成表結(jié)構(gòu),然后通過(guò)Table API提供的接口處理對(duì)應(yīng)的數(shù)據(jù)集,從而簡(jiǎn)化數(shù)據(jù)分析。
此外,Table API程序還會(huì)通過(guò)優(yōu)化規(guī)則在數(shù)據(jù)處理過(guò)程中對(duì)處理邏輯進(jìn)行大量?jī)?yōu)化。
Flink提供的最高級(jí)別的抽象是SQL API。這種抽象在語(yǔ)義和表達(dá)方式上均類似于Table API,但是將程序表示為SQL查詢表達(dá)式。SQL抽象與Table API緊密交互,并且可以對(duì)Table API中定義的表執(zhí)行SQL查詢。此外,SQL語(yǔ)言具有比較低的學(xué)習(xí)成本,能夠讓數(shù)據(jù)分析人員和開(kāi)發(fā)人員快速上手。
六、程序結(jié)構(gòu)
在Hadoop中,實(shí)現(xiàn)一個(gè)MapReduce應(yīng)用程序需要編寫(xiě)Map和Reduce兩部分;在Storm中,實(shí)現(xiàn)一個(gè)Topology需要編寫(xiě)Spout和Bolt兩部分;同樣,實(shí)現(xiàn)一個(gè)Flink應(yīng)用程序也需要同樣的邏輯。
一個(gè)Flink應(yīng)用程序由3部分構(gòu)成,或者說(shuō)將Flink的操作算子可以分成3部分,分別為Source、Transformation和Sink。
· Source:數(shù)據(jù)源部分。負(fù)責(zé)讀取指定存儲(chǔ)介質(zhì)中的數(shù)據(jù),轉(zhuǎn)為分布式數(shù)據(jù)流或數(shù)據(jù)集,例如readTextFile()、socketTextStream()等算子。Flink在流處理和批處理上的Source主要有4種:基于本地集合、基于文件、基于網(wǎng)絡(luò)套接字Socket和自定義Source。
· Transformation:數(shù)據(jù)轉(zhuǎn)換部分。負(fù)責(zé)對(duì)一個(gè)或多個(gè)數(shù)據(jù)流或數(shù)據(jù)集進(jìn)行各種轉(zhuǎn)換操作,并產(chǎn)生一個(gè)或多個(gè)輸出數(shù)據(jù)流或數(shù)據(jù)集,例如map()、flatMap()、keyBy()等算子。
· Sink:數(shù)據(jù)輸出部分。負(fù)責(zé)將轉(zhuǎn)換后的結(jié)果數(shù)據(jù)發(fā)送到HDFS、文本文件、MySQL、Elasticsearch等目的地,例如writeAsText()算子。
Flink應(yīng)用程序可以消費(fèi)來(lái)自消息隊(duì)列或分布式日志這類流式數(shù)據(jù)源(例如Apache Kafka或Kinesis)的實(shí)時(shí)數(shù)據(jù),也可以從各種數(shù)據(jù)源中消費(fèi)有界的歷史數(shù)據(jù)。同樣,F(xiàn)link應(yīng)用程序生成的結(jié)果流也可以發(fā)送到各種數(shù)據(jù)存儲(chǔ)系統(tǒng)中(例如數(shù)據(jù)庫(kù)、對(duì)象存儲(chǔ)等)。
知道Flink的程序結(jié)構(gòu)至關(guān)重要,知道了結(jié)構(gòu)后才是深入Flink的第一步。說(shuō)實(shí)話,F(xiàn)link難也難,你說(shuō)簡(jiǎn)單也簡(jiǎn)單,你看它的程序結(jié)構(gòu),就是圍繞Source、Transformation和Sink這三種類型的算子在玩。
歡 迎 大 家 關(guān) 注 我 的 公 眾 號(hào) 【 老 周 聊 架 構(gòu) 】 ,AI 、大數(shù)據(jù)、云原生、物聯(lián)網(wǎng)等相關(guān)領(lǐng)域的技術(shù)知識(shí)分享。
