<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          聊聊Flink:Flink的基礎(chǔ)架構(gòu)

          共 5593字,需瀏覽 12分鐘

           ·

          2024-03-31 05:00

          一、前言

          哈嘍,大家好,我是微信公眾號(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)

          358c478deeebf28a50a6a353c5cff208.webp

          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è)底了。

          6b8ac03303a361fba3df3638d16fc35b.webp

          三、Flink是什么

          cd6185320ea6a07d0601f495ab254087.webp

          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ú)界流

          f0172b33c64afba0c142a3ebc99e3578.webp
          • 批計(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ì)比

          25dcdb69eb5cd0dc47b2cca595dc0e82.webp

          四、Flink的主要組件

          032827f2733132a88545be09d407fa18.webp
          • 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ā)。

          825348523e96c3b3e2392298d51b06cf.webp

          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。

          74ad973a63b1a4a296636852a78a8a92.webp

          · 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()算子。

          89bcde7460bf1904673e70d14804b12c.webp

          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ǔ)等)。

          1e85118e0d8aba9dd1ab8ebb189cfd3c.webp

          知道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í)分享。


          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女扣逼网站 | 在线观看免费视频黄 | 啪啪啪成人网站 | 午夜福利电影AV | 欧美一级淫片 |