Flink之一 Flink基本原理介紹

Flink介紹:

很多人可能都是在 2015 年才聽到 Flink 這個詞,其實早在 2008 年,F(xiàn)link 的前身已經(jīng)是柏林理工大學(xué)一個研究性項目, 在 2014 被 Apache 孵化器所接受,然后迅速地成為了 ASF(Apache Software Foundation)的頂級項目之一。Flink 的最新版本目前已經(jīng)更新到了 0.10.0 了,在很多人感慨 Spark 的快速發(fā)展的同時,或許我們也該為 Flink 的發(fā)展速度點個贊。

Flink 是一個針對流數(shù)據(jù)和批數(shù)據(jù)的分布式處理引擎。它主要是由 Java 代碼實現(xiàn)。目前主要還是依靠開源社區(qū)的貢獻而發(fā)展。對 Flink 而言,其所要處理的主要場景就是流數(shù)據(jù),批數(shù)據(jù)只是流數(shù)據(jù)的一個極限特例而已。再換句話說,F(xiàn)link 會把所有任務(wù)當(dāng)成流來處理,這也是其最大的特點。Flink 可以支持本地的快速迭代,以及一些環(huán)形的迭代任務(wù)。

Flink的特性:

Flink是個分布式流處理開源框架:

1: 即使數(shù)據(jù)源是無序的或者晚到達的數(shù)據(jù),也能保持結(jié)果準(zhǔn)確性

2:有狀態(tài)并且容錯,可以無縫的從失敗中恢復(fù),并可以保持exactly-once

3:大規(guī)模分布式

Flink可以確保僅一次語義狀態(tài)計算;Flink有狀態(tài)意味著,程序可以保持已經(jīng)處理過的數(shù)據(jù);

Flink支持流處理和窗口事件時間語義,F(xiàn)link支持靈活的基于時間窗口,計數(shù),或會話數(shù)據(jù)驅(qū)動的窗戶;

Flink容錯是輕量級和在同一時間允許系統(tǒng)維持高吞吐率和提供僅一次的一致性保證,F(xiàn)link從失敗中恢復(fù),零數(shù)據(jù)丟失;

Flink能夠高吞吐量和低延遲;

Flink保存點提供版本控制機制,從而能夠更新應(yīng)用程序或再加工歷史數(shù)據(jù)沒有丟失并在最小的停機時間。

Flink相關(guān)概念:

Parallel Dataflows

Flink中把整個流處理過程叫做Stream Dataflow,從數(shù)據(jù)源提取數(shù)據(jù)的操作叫做Source Operator,中間的map(),聚合、統(tǒng)計等操作可以統(tǒng)稱為Tranformation Operators,最后結(jié)果數(shù)據(jù)的流出被稱為sink operators,具體可以見下方圖示:

Flink的程序內(nèi)在是并行和分布式的,數(shù)據(jù)流可以被分區(qū)成stream partitions,operators被劃分為operator subtasks;這些subtasks在不同的機器或容器中分不同的線程獨立運行;operator subtasks的數(shù)量在具體的operator就是并行計算數(shù),程序不同的operator階段可能有不同的并行數(shù);如下圖所示,source operator的并行數(shù)為2,但最后的sink operator為1;

數(shù)據(jù)在兩個operator之間傳遞的時候有兩種模式:

一:one-to-one 模式:兩個operator用此模式傳遞的時候,會保持?jǐn)?shù)據(jù)的分區(qū)數(shù)和數(shù)據(jù)的排序;

二:Redistributing 模式:這種模式會改變數(shù)據(jù)的分區(qū)數(shù);每個一個operator subtask會根據(jù)選擇transformation把數(shù)據(jù)發(fā)送到不同的目標(biāo)subtasks,比如keyBy()會通過hashcode重新分區(qū),broadcast()和rebalance()方法會隨機重新分區(qū);

Tasks & Operator Chains

對于分布式計算,F(xiàn)link封裝operator subtasks 鏈化為tasks;每個task由一個線程執(zhí)行;把tasks鏈化有助于優(yōu)化,它減少了開銷線程和線程之間的交接和緩沖;增加了吞吐量和減少延遲時間;鏈化的作用可以見下圖:在沒有鏈化之前,source operator和map operator 是兩個線程運行的兩個task,也就是說下面的dataflow 最初應(yīng)該有7個subtasks;

但經(jīng)過優(yōu)化鏈化后,source和map合并為一個task,有一個線程執(zhí)行,這樣優(yōu)化可以減少source operator 和map operator兩個線程之間的交接和緩存開銷;鏈化后只有5個task;對于鏈化這個優(yōu)化,筆者也有疑問:是否是operator之間數(shù)據(jù)傳遞模式相同才能鏈化?

Distributed Execution

Flink runTime 包括兩種類型進程(類似于第一代hadoop架構(gòu)):

master進程;也叫作JobManager,協(xié)調(diào)各個節(jié)點工作;master調(diào)度task,協(xié)調(diào)checkpoints和容災(zāi);機器群中至少有一個master,高可用機器中可以有多個master,但要保證一個是leader,其他是standby;

work 類型進程;也叫taskManagers;具體執(zhí)行tasks;

client 雖然不是運行和程序的一部分,但是客戶端常被用作準(zhǔn)備和發(fā)送dataflow給master;

flink作業(yè)提交架構(gòu)流程可見下圖:

Workers, Slots, Resources

每一個TaskManager是個jvm,每個jvm中可以執(zhí)行一個或者多個subtasks,jvm中taskSlot的數(shù)量決定了接受多少個task;每個tasksolt都有固定的資源,比如TaskManager有三個task solts,taskManager把平均把管理的內(nèi)存分配到三個task slot中,這樣solt中的task不會跟其他的job競爭資源;默認(rèn)上Flink許可subtasks去分享同一個是slots;但要保證這些subtask是不同的task,并且來自相同的Job;極端情況下,一個slot中執(zhí)行整個job的task;solt分享有兩個重要的好處:

1:flink 機群中可以用到的最高的并行計算數(shù),就是taskSolt的數(shù)量

2:可以容易的達到資源利用;

solt 資源共享是可以在api中設(shè)置種控制;resource group機制可以設(shè)置哪些tasks 共享slots;

Configuring TaskManager processing slots

slot的數(shù)量通常設(shè)置是成正比的每個TaskManager可用CPU核的數(shù)量;一般建議,可用CPU核的數(shù)量正好是taskmanager.numberOfTaskSlots的數(shù)量,當(dāng)開始Flink應(yīng)用程序中,用戶可以提供slot的數(shù)量,可以在命令中加入-p(for paralleism)參數(shù)指定;另外也可以在API中設(shè)置;例如taskManager有三臺機器,并在flink-config.yaml中設(shè)置 taskmanager.numberOfTaskSlots:3(建議是cpu的核數(shù));這樣每臺機器有3個slot,機器中共有9個processing taskslots,見下圖所示:

當(dāng)設(shè)置parallelism.default:2 或者啟動的時候指定-p參數(shù)-./bin/flink -p2 或者代碼中設(shè)置env.setParallelism(2),那邊task分配如下圖所示:

當(dāng)然也可以把某個operator的并行度另外設(shè)置,比如把sink的并行度設(shè)置為1,那多task分配就會如下圖:

Flink從入門到實踐學(xué)習(xí)路線展示

第一章:初識Flink

1.1課程目錄

1.2Flink概述

1.3flink layered api

1.4Flink運行多樣化

1.5業(yè)界流處理框架對比

1.6flink use cases

1.7flink發(fā)展趨勢

1.8如何以正確的姿勢來學(xué)習(xí)flink

第二章:快速上手開發(fā)第一個flink程序

2.1開發(fā)環(huán)境準(zhǔn)備之jdk安裝

2.2開發(fā)環(huán)境準(zhǔn)備之maven安裝

2.3開發(fā)環(huán)境準(zhǔn)備之idea安裝

2.4flink批處理應(yīng)用開發(fā)之需求描述

2.5開發(fā)過程中依賴的注意事項

第三章:編程模型及核心概念

3.1核心概念概述

3.2dataset和datastream

3.3flink編程模型

3.4延遲執(zhí)行

3.5flink支持的數(shù)據(jù)類型

第四章:DataSet API編程

4.1dataset api開發(fā)概述

4.2flink綜合java和scala開發(fā)的項目構(gòu)建creenflow

4.3data source宏觀概述

4.4從集合創(chuàng)建dataset之scala實現(xiàn)

4.5基于flink的分布式緩存功能的java實現(xiàn)

第五章:DataStream API編程

5.1datastream api編程概述

5.2從socket創(chuàng)建datastream之java實現(xiàn)

5.3從socket創(chuàng)建datastream之scala實現(xiàn)

5.4自定義sink之需求描述及表創(chuàng)建-

5.5datastream api開發(fā)小結(jié)

第六章:Flink Table API & SQL編程

6.1什么是flink關(guān)系型

6.2table api&sql概述

6.3使用scala完成table api&sql功能的開發(fā)

6.4使用java完成table api&sql功能的開發(fā)

6.5table api&sql其他功能介紹

第七章:Flink中的Time及Windows的使用

7.1processing time詳解

7.2event time詳解

7.3ingestion time詳解-

7.4如何在flink中指定time的類型

7.5flink watermark概述

第八章:Flink Connectors

8.1connectors概述

8.2hdfs connector的使用

8.3kafka connector概述

8.4ootb環(huán)境的使用

8.5flink整合kafka的checkpoint常用參數(shù)設(shè)置梳理

第九章:Flink部署及作業(yè)提交

9.1flink部署準(zhǔn)備及源碼編譯-

9.2單機模式部署及代碼提交測試

9.3flink standalone模式部署及參數(shù)詳解

9.4如何查找需要配置的flink參數(shù)及ui對應(yīng)關(guān)系介紹

9.5flink scala shell的使用

第十章:Flink監(jiān)控及調(diào)優(yōu)

10.1historyserver概述及配置-

10.2historyserver的使用

10.3monitoring rest ap

10.4flink metric

10.5flink常用優(yōu)化策略

第十一章:基于Flink的互聯(lián)網(wǎng)直播平臺日志分析項目實戰(zhàn)

11.1項目功能需求描述

11.2mock數(shù)據(jù)之kafka生產(chǎn)者代碼主流程開發(fā)

11.3使用flink消費kafka生產(chǎn)的數(shù)據(jù)

11.4自定義mysql數(shù)據(jù)源讀

11.5完成兩個流關(guān)聯(lián)的數(shù)據(jù)清洗功能

Flink項目實踐視頻

Flink視頻教程筆記

基于Flink流處理的動態(tài)實時電商實時分析系統(tǒng)視頻


上面是小編給大家整理的IT從業(yè)20年大佬講解Flink從入門到實踐的文檔與視頻,(這些資料往期文章有包含的,但是需要的人很多,擔(dān)心有很多人沒有拿到,所以又來跟大家分享一次)小編都為大家準(zhǔn)備好了,如果大家伙需要的話,可以轉(zhuǎn)發(fā)此文關(guān)注小編,+wx:衣五九三衣領(lǐng)巴六三巴六(數(shù)字協(xié)議)來免費獲取吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容