溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Flink的原理和用法

發(fā)布時(shí)間:2021-06-24 11:00:24 來源:億速云 閱讀:319 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“Flink的原理和用法”,在日常操作中,相信很多人在Flink的原理和用法問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Flink的原理和用法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

流式框架,同時(shí)支持低延遲、高吞吐、Exactly-once的只有Apache Flink。

1. Apache Flink介紹

1.1 Apache Flink是什么?

實(shí)時(shí)數(shù)據(jù)處理越來越重要,流式數(shù)據(jù)處理有著更高的處理效率和成本控制能力。Flink在德語中意味著快速和靈敏,用來體現(xiàn)流式數(shù)據(jù)處理器速度快和靈活性強(qiáng)等特點(diǎn)。Apache是流式框架中同時(shí)支持低延遲、高吞吐、Exactly-once的,同時(shí)提供了基于流式計(jì)算引擎處理批量數(shù)據(jù)的計(jì)算能力,真正意義上實(shí)現(xiàn)了批流統(tǒng)一,同時(shí)隨著阿里Blind的開源,極大地增強(qiáng)了Flink對(duì)批量計(jì)算領(lǐng)域的支持,

1.2 數(shù)據(jù)架構(gòu)的演變

傳統(tǒng)的關(guān)系型數(shù)據(jù)存儲(chǔ)架構(gòu),逐步演化為分布式處理和存儲(chǔ)的架構(gòu)。

1.2.1 傳統(tǒng)數(shù)據(jù)基礎(chǔ)架構(gòu)

主要基于集中式的關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)存儲(chǔ),大多數(shù)將架構(gòu)分為計(jì)算層和存儲(chǔ)層。微服務(wù)架構(gòu)將系統(tǒng)數(shù)據(jù)源拆分,解決了業(yè)務(wù)系統(tǒng)擴(kuò)展的問題,但是業(yè)務(wù)數(shù)據(jù)國(guó)語分散在不同的系統(tǒng)中,很難將數(shù)據(jù)進(jìn)行集中化管理,對(duì)于企業(yè)內(nèi)部進(jìn)行數(shù)據(jù)分析或者數(shù)據(jù)挖掘之類的應(yīng)用則需要通過從不同的數(shù)據(jù)庫進(jìn)行數(shù)據(jù)抽取,將數(shù)據(jù)從數(shù)據(jù)庫中周期性同步到數(shù)據(jù)倉庫中,然后再數(shù)據(jù)倉庫中進(jìn)行數(shù)據(jù)的抽取、轉(zhuǎn)換、加載(ETL),從而構(gòu)建成不同的數(shù)據(jù)集和應(yīng)用,提供給業(yè)務(wù)系統(tǒng)使用。

1.2.2 大數(shù)據(jù)數(shù)據(jù)架構(gòu)

                                Flink的原理和用法

                                                              圖-大數(shù)據(jù)實(shí)時(shí)處理架構(gòu)

Lamada架構(gòu)支持處理不同類型的數(shù)據(jù),包含支持批量計(jì)算的Batch Layer和實(shí)時(shí)計(jì)算的Speed Layer,通過在一套平臺(tái)中將批計(jì)算和流計(jì)算整合在一起,但是這種架構(gòu)因?yàn)榭蚣芴嗳匀淮嬖谄脚_(tái)復(fù)雜度和運(yùn)維成本較高的問題。

1.2.3 有狀態(tài)流計(jì)算架構(gòu)

                                                Flink的原理和用法

                                                             圖-有狀態(tài)流計(jì)算架構(gòu)

企業(yè)基于實(shí)時(shí)的流式數(shù)據(jù),維護(hù)所有計(jì)算過程的狀態(tài),所謂狀態(tài)就是計(jì)算過程中產(chǎn)生的中間結(jié)果,每次計(jì)算新的數(shù)據(jù)進(jìn)入到流式系統(tǒng)中都是基于中間狀態(tài)結(jié)果的基礎(chǔ)上進(jìn)行計(jì)算,最終產(chǎn)生正確的中間結(jié)果?;谟袪顟B(tài)計(jì)算方式的最大優(yōu)勢(shì)是不需要將原始數(shù)據(jù)從外部系統(tǒng)中拿出來,避免進(jìn)行全量計(jì)算,對(duì)比批量計(jì)算,實(shí)時(shí)計(jì)算可以在很短的時(shí)間內(nèi)統(tǒng)計(jì)出結(jié)果。

1.2.4 為什么會(huì)是Flink?

可以看出有狀態(tài)流計(jì)算會(huì)逐步成為企業(yè)作為構(gòu)建數(shù)據(jù)平臺(tái)的架構(gòu)模式。Flink通過實(shí)現(xiàn)Google DataFlow流式計(jì)算模型實(shí)現(xiàn)了高吞吐、低延遲、高性能且兼具實(shí)時(shí)流式計(jì)算框架,同時(shí)支持高度容錯(cuò)的狀態(tài)管理。

Apache Flink同時(shí)支持以下特性:

  • 同時(shí)支持高吞吐、低延遲、高性能,且目前唯一支持,Storm不支持高吞吐的要求

  • 支持事件時(shí)間(Event time)的概念,使用事件產(chǎn)生的時(shí)間,使得即使亂序,流系統(tǒng)也能計(jì)算出正確的結(jié)果,保持事件原本產(chǎn)生時(shí)的有序性,盡可能避免網(wǎng)絡(luò)傳輸或者硬件系統(tǒng)的影響

  • 支持有狀態(tài)流式計(jì)算,將算子中間結(jié)果保存在內(nèi)存或者文件系統(tǒng)中,極大提升系統(tǒng)性能,降低資源消耗

  • 支持高度靈活的窗口(Window)機(jī)制,通過窗口的方式對(duì)流數(shù)據(jù)進(jìn)行一定范圍的聚合計(jì)算

  • 基于輕量級(jí)分布式快照(Snapshot)實(shí)現(xiàn)的容錯(cuò),基于分布式快照技術(shù)的Checkpoints,將執(zhí)行過程中的狀態(tài)信息進(jìn)行持久化存儲(chǔ),支持任務(wù)異常時(shí)候的自動(dòng)恢復(fù),確保數(shù)據(jù)在處理過程中的一致性

  • 基于JVM實(shí)現(xiàn)獨(dú)立的內(nèi)存管理,序列化/反序列化方式減少數(shù)據(jù)存儲(chǔ)大小,降低GC帶來的性能影響

  • 支持保存點(diǎn)(Save Points),將任務(wù)執(zhí)行的快照保存在存儲(chǔ)介質(zhì)上,便于更好的管理和運(yùn)維流式應(yīng)用

1.3 Flink運(yùn)用場(chǎng)景

  • 實(shí)時(shí)智能推薦,通過Flink流計(jì)算構(gòu)建更加實(shí)時(shí)的智能推薦系統(tǒng),對(duì)用戶行為指標(biāo)進(jìn)行實(shí)時(shí)計(jì)算,對(duì)模型進(jìn)行實(shí)時(shí)更新,對(duì)用戶指標(biāo)進(jìn)行實(shí)時(shí)預(yù)測(cè),并將預(yù)測(cè)的信息推送到Web/App端。

  • 復(fù)雜事件處理,借助Flink CEP(復(fù)雜事件處理)

  • 實(shí)時(shí)欺詐檢測(cè)

  • 實(shí)時(shí)數(shù)倉和ETL

  • 流數(shù)據(jù)分析

  • 實(shí)時(shí)報(bào)表分析,天貓雙十一大屏

1.4 Flink基本架構(gòu)

                                                  Flink的原理和用法

                                                                         圖-Flink分層架構(gòu)

2. 環(huán)境準(zhǔn)備

3. Flink編程模型

3.1 數(shù)據(jù)集類型

有界數(shù)據(jù)集,具有時(shí)間邊界,批計(jì)算處理;無界數(shù)據(jù)集,沒有邊界,持續(xù)不斷產(chǎn)生新的數(shù)據(jù),流式數(shù)據(jù)處理。二者是相對(duì)概念,主要根據(jù)時(shí)間的范圍而定,可以認(rèn)為一段時(shí)間內(nèi)的無界數(shù)據(jù)集其實(shí)是有界數(shù)據(jù)集,同時(shí)有界數(shù)據(jù)也可以通過一些方法轉(zhuǎn)換為無界數(shù)據(jù),有界數(shù)據(jù)和無界數(shù)據(jù)其實(shí)是可以相互轉(zhuǎn)換的,對(duì)于不同的數(shù)據(jù)類型可以進(jìn)行統(tǒng)一的處理,Apache Spark和Flink同時(shí)支持流式計(jì)算和批量計(jì)算。

3.2 Flink編程接口

核心數(shù)據(jù)處理接口,支持批計(jì)算的接口DataSet API,支持流計(jì)算的DataStream API

                                                      Flink的原理和用法

                                                                       圖-Flink接口分層與抽象

3.3 Flink程序結(jié)構(gòu)

設(shè)定Flink執(zhí)行環(huán)境、創(chuàng)建和加載數(shù)據(jù)集、對(duì)數(shù)據(jù)集指定轉(zhuǎn)換操作邏輯、指定計(jì)算結(jié)果輸出位置、調(diào)用execute方法觸發(fā)程序執(zhí)行。

                                       Flink的原理和用法

                                                                圖-示例Flink程序WordCount

3.4 Flink數(shù)據(jù)類型

3.4.1 數(shù)據(jù)類型支持

數(shù)據(jù)類型的描述信息都是由TypeInformation定義,比較常用的有BasicTypeInfo、TupleTypeInfo、CaseClassTypeInfo、PojoTypeInfo

BasicTypeInfo:支持任意Java原生數(shù)據(jù)類型,數(shù)組BasicTypeInfo

Java Tuples類型:固定長(zhǎng)度固定類型,不支持空值存儲(chǔ)

POJO類型:復(fù)雜數(shù)據(jù)結(jié)構(gòu)的定義

Flink Value類型:序列化與反序列化

特殊數(shù)據(jù)類型:Types Hmt

3.4.2 TypeInformation信息獲取

通常情況下Flink都能正常進(jìn)行數(shù)據(jù)類型判斷,并選擇合適的serializers以及comparators,但是在某些情況下無法獲取,例如JVM泛型擦除。

反射機(jī)制盡可能重構(gòu)類型信息,類型提示(Ctype Himts),TypeHint指定輸出參數(shù)類型

自定義TypeInformation

4. DataStream API介紹與使用

4.1 DataStream編程模型

基于Google提出的DataFlow模型,實(shí)現(xiàn)了支持原生數(shù)據(jù)流處理的計(jì)算引擎。API主要分為三個(gè)部分:

DataSourc模塊,數(shù)據(jù)接入功能,主要是將各種外部數(shù)據(jù)接入到Flink系統(tǒng),并將接入的數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的DataStream數(shù)據(jù)集

Transformation模塊,定義了對(duì)DataStream數(shù)據(jù)集的各種轉(zhuǎn)換操作,例如map、reduce、windows等操作

DataSink模塊,將結(jié)果數(shù)據(jù)寫出到外部存儲(chǔ)介質(zhì)中,如文件或者Kafka中間件

4.1.1 DataSources數(shù)據(jù)輸入

內(nèi)置數(shù)據(jù)源,包括文件、Socket網(wǎng)絡(luò)端口以及集合類型數(shù)據(jù);第三方數(shù)據(jù)源,定義了Flink和外部系統(tǒng)數(shù)據(jù)交互的邏輯,包括數(shù)據(jù)的讀寫接口,F(xiàn)link定義了豐富的第三方數(shù)據(jù)源連接器(Connector),例如Kafka Connector、ES Connector以及自定義第三方數(shù)據(jù)源Connector。

  • 內(nèi)置文件數(shù)據(jù)源

  • 內(nèi)置Socket數(shù)據(jù)源

  • 內(nèi)置集合數(shù)據(jù)源,集合類Collection,將本地集合中的數(shù)據(jù)分發(fā)到遠(yuǎn)端并行執(zhí)行的節(jié)點(diǎn)中

  • 外部數(shù)據(jù)源連接器,如Kafka

  • 外部自定義數(shù)據(jù)源連接器,實(shí)現(xiàn)SourceFunction等

4.1.2 DataStream轉(zhuǎn)換操作

即通過一個(gè)或多個(gè)DataStream生成新的DataStream的過程稱為Transformation,在轉(zhuǎn)換過程中,每種操作類型被定義為不同的Operator,F(xiàn)link能夠?qū)⒍鄠€(gè)Transformation組成一個(gè)DataFlow的拓?fù)?。DataStream的轉(zhuǎn)換操作可以分為Single-DataStream、Multi-DataStream、物理分區(qū)三類類型。

  • Single-DataStream

Map(DataStream->DataStream)、FlatMap(DataStream->DataStream)、Filter(DataStream->DataStream)、KeyBy(DataStream->KeyedStream)、Reduce(KeyedStream->DataStream)、Aggregations(KeyedStream->DataStream)

  • Multi-DataStream

Union(DataStream->DataStream)、Connect/CoMap/CoFlatMap(DataStream->DataStream)、Split(DataStream->SplitStream)、Select(SplitStream->DataStream)、Iterate(DataStream->IterativeStream->DataStream)

  • 物理分區(qū)操作

根據(jù)指定的分區(qū)策略將數(shù)據(jù)重新分配到不同節(jié)點(diǎn)的task案例上執(zhí)行,隨機(jī)分區(qū)、平衡分區(qū)、按比例分區(qū)等

4.1.3 DataSinks數(shù)據(jù)輸出

  • 基本數(shù)據(jù)輸出

文件輸出、客戶端輸出、Socket網(wǎng)絡(luò)端口、

  • 第三方數(shù)據(jù)輸出

如Kafka、Cassandra、Kinesis、ES、HDFS、NIFI等。DataSink類操作算子專門處理數(shù)據(jù)的輸出,所有的數(shù)據(jù)輸出都可以基于實(shí)現(xiàn)SinkFunction完成定義,如FlinkKafkaProducer。

4.2 時(shí)間概率與WaterMark

三種時(shí)間概念:

事件生成時(shí)間(Event time)、時(shí)間接入時(shí)間(Ingestion Time)和事件處理時(shí)間(Processing Time)

到此,關(guān)于“Flink的原理和用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI