2024-02-29(Flink)

1.Flink原理(角色分工)

2.Flink執行流程

on yarn版:

3.相關概念

1)DataFlow:Flink程序在執行的時候會被映射成一個數據流模型;
2)Operator:數據流模型中的每一個操作被稱作Operator,Operator分為:Source,Transform,Sink;
3)Partition:數據流模型是分布式和并行的,執行中會形成1-n個分區
4)Subtask:多個分區任務可以并行,每一個都是獨立運行在一個線程中的,也就是一個SubTask子任務;
5)Parallelism:并行度,就是可以同時真正執行的子任務數/分區數。

6)Operator傳遞模式
6-1)One to One模式:兩個operator用此模式傳遞的時候,會保持數據的分區數和數據的排序(類似于spark中的窄依賴),多個one to one 的operator可以合并為一個operator chain。

6-2)Redistributing模式:此模式會改變數據的分區數(類似于Spark中的寬依賴
7)TaskSlot and Slot Sharing
7-1)TaskSlot(任務槽)

每個TaskManager是一個JVM進程,為了控制一個TaskManager(worker)能接收多少task,Flink通過Task slot來進行控制。TaskSlot數量是用來限制一個TaskManager工作進程中可以同時運行多少個工作線程,TaskSlot是一個TaskManager中的最小資源分配單位,一個TaskManager中有多少個TaskSlot就意味著能支持多少并發的Task處理。

7-2)Slot Sharing(槽共享)

前面的Task Slot跑完一些線程任務之后,Task Slot可以給其他線程任務使用,這就是槽共享,這樣的好處是可以避免線程的重復創建和銷毀。

8)ExecutionGraph(Flink執行圖)

解釋上圖:

流程化)StreamGraph:最初的程序執行邏輯,也就是算子之間的前后順序 ---- 在Client上生成

優化合并)JobGraph:將One to One的Operator合并為OperatorChain ---- 在Client上生成

并行化)ExecutionGraph:將JobGraph根據代碼中設置的并行度和請求的資源進行并行化規劃 ---- 在JobManager上生成

將任務分配給具體的TaskSlot執行---落實執行線程化)物理執行圖:將ExecutionGraph的并行計劃,落實到具體的TaskManager上,將具體的SubTask落實到具體的TaskSlot內進行運行。

4.Flink流批一體API

前置知識:

{

Flink把流分為:

有邊界的流(bounded Stream):批數據

無邊界的流(unbounded Steam):真正的流數據

流計算和批計算對比:

數據時效性:流式計算實時,批計算非實時,高延遲;

數據特征不同:流式計算的數據一般是動態的,沒有邊界的,而批處理的數據一般則是靜態數據。

應用場景不同:流式計算應用在實時場景,時效性要求比較高的場景,如實時推薦,業務監控等,批處理應用在實時性要求不高,離線計算的場景下,數據分析,離線報表等。

運行方式不同:流式計算的任務持續進行的,批量計算的任務則一次性完成。

}

4-1)Source(數據從哪來)

File-based基于文件:

env.readTextFile(本地/HDFS文件/文件夾);

Socket-based基于Socket連接:

env.socketTextStream(主機名,端口號);

Collection-based基于集合:

env.fromElemnts();
env.fromCollection();
env.generateSequence();
env.fromSequence();

Custom自定義:

Flink還提供了數據源接口,我們實現了這些接口就可以實現自定義數據源獲取數據,不同接口有不同的功能,接口如下:

SourceFunction:非并行數據源(并行度=1)

RichSourceFunction:多功能非并行數據源(并行度=1)

ParallelSourceFunction:并行數據源(并行度可以 > 1)

RichParallelSourceFunction:多功能并行數據源(并行度可以 > 1)--- kafka數據源就使用該接口

---------------------------------------------------------------------------------------------------------------------------------

4-2)Transformation(數據做怎樣的操作處理)

Transformation基本操作

map:j將函數作用在集合中的每一個元素上,并返回作用后的結果。

flat Map:將集合中的每個元素變成一個或者多個元素,并返回扁平化之后的結果

keyBy:按照指定的key來對流中的數據進行分組。注意:流中沒有groupBy,而是keyBy

filter:按照指定的條件對集合中的元素進行過濾,過濾出返回true/符合條件的元素

sum:按照指定的字段對集合中的元素進行求和

reduce:對集合中的元素進行聚合

Transformation合并和拆分:

union:union算子可以合并多個同類型的數據流,并生成同類型的數據流,即可以將多個DataStream[T]合并成為一個新的DataStream[T]。數據按照先進先出FIFO的模式合并。

connect:

和union類似,用來連接兩個數據流,區別在于:connect只可以連接兩個數據流,union可以連接多個;connect所連接的兩個數據流的數據類型可以不一樣,unions所連接的兩個數據流的數據類型必須一樣

split(已廢除),select,side output:

split就是將一個流分成多個流;

select就是獲取分流后對應的數據;

side output:可以使用process方法對流中的數據進行處理,并針對不同的處理結果將數據收集到不同的OuputTag中。

rebalance(重平衡分區):

類似于Spark中的repartition算子,功能更強,可以直接解決數據傾斜(Flink也有數據傾斜的情況,如下圖),在內部使用round robin方法將數據均勻打散。

其他分區API:

dataStream.global();   全部發往第一個Task
dataStream.broadcast();   廣播
dataStream.forward();   上下游并發度一樣時一對一發送
dataStream.shuffle();   隨即均勻分配
dataStream.rebalance();   輪流分配
dataStream.recale();   本地輪流分配
dataStream.partitionCustom();   自定義單播

--------------------------------------------------------------------------------------------------------------------------------?

4-3)Sink(數據做怎樣的輸出)

基于控制臺和文件的Sink

ds.print(); 直接輸出到控制臺

ds.printErr(); 直接輸出到控制臺,用紅色

ds.writeAsText().setParallelism(); 以多少并行度輸出到某個文件路徑?

自定義的Sink

--------------------------------------------------------------------------------------------------------------------------------

4-4)Connectors(連接外部的工具)

Connectors-JDBC

Flink內已經提供了一些綁定的Connector,例如Kafka source和sink,Es sink等。讀寫Kafka,es,rabiitMQ時可以直接使用相應的connector的API就可以了。

同樣Flink內也提供了專門操作redis的RedisSink。查詢接口文檔使用就行了。

5.Flink高級API

Flink四大基石

Flink流行的原因,就是這四大基石:CheckPoint,State,Time,Window。

a.Flink-Windows操作

使用場景:在流式處理中,數據是源源不斷的,有時候我們需要做一些聚合類的處理。例如,在過去一分鐘內有多少用戶點擊了網頁。此時我們可以定義一個窗口/window,用來收集1分鐘內的數據,并對這個窗口內的數據進行計算。

Flink支持按照

(用的多)時間time:每xx分鐘統計最近xx分鐘的數據

數量count:每xx個數據統計最近xx個數據

兩種類型的窗口形式

按照窗口的形式進行組合有四種窗口:

基于時間的滑動窗口,基于時間的滾動窗口,基于數量的滑動窗口,基于數量的滾動窗口。

---------------------------------------------------------------------------------------------------------------------------------

b.Flink-Time和Watermark

在Flink的流式處理中,會涉及到時間的不同概念

事件時間EventTime:事件真真正正發生/產生的時間(重點關注事件時間)

攝入時間IngestionTime:事件到達Flink的事件

處理時間ProcessingTime:事件真正被處理/計算的時間

事件時間能夠真正反映/代表事件的本質!所以一般在實際開發中會以事件時間作為計算標準

總結

????????實際開發中我們希望基于事件時間來處理數據,但因為數據可能因為網絡延遲等原因,出現了亂序或延遲到達,那么可能處理的結果不是我們想要的甚至出現數據丟失的情況,所以需要一種機制來解決一定程度上的數據亂序或延遲到底的問題!也就是Watermaker水印機制/水位線機制

什么是Watermark?

就是給數據額外的加的一個時間列,也就是個時間戳。

Watermark = 當前窗口的最大事件事件 - 最大允許的延遲時間或者亂序時間

這樣可以保證Watermaker水位線會一直上升(變大),不會下降。

Watermark的作用:用來觸發窗口計算,通過改變觸發窗口計算的時機,從而在一定程度上解決數據亂序的問題

---------------------------------------------------------------------------------------------------------------------------------

c.Fink-狀態管理

Flink支持狀態的自動管理。在絕大多數情況下使用Flink提供的自動管理就行了,極少數使用手動的狀態管理。

無狀態計算是什么意思:就是不需要考慮歷史的數據,相同的輸入得到相同的輸出。

有狀態計算(Flink有自動狀態管理了,就少手動去維護狀態管理了吧)就是要考慮歷史的數據,相同而輸入不一定得到相同的輸出。

---------------------------------------------------------------------------------------------------------------------------------

d.Flink-容錯機制

State和CheckPoint的區別:

State

維護/存儲的是某一個Operator的運行的狀態/歷史值,是維護在內存中!

一般指一個具體的Operator的狀態(operator的狀態表示一些算子在運行的過程中會產生的一些歷史結果如前面的maxBy底層會維護當前的最大值,也就是會維護一個keyedOperator,這個State里面存放就是maxBy這個Operator中的最大值)

CheckPoint

某一時刻,Flink中所有的Operator的當前State的全局快照,一般存在磁盤上(一般放HDFS上)。

表示了一個Flink Job在一個特定時刻的一份全局狀態快照,即包含了所有Operator的狀態可以理解為Checkpoint是把State數據定時持久化存儲了。

比如KafkaConsumer算子中維護的Offset狀態,當任務重新恢復的時候可以從Checkpoint中獲取。

6.狀態恢復和重啟策略

重啟策略分類:

默認重啟策略:配置了Checkpoint的情況下不做任務配置,默認是無限重啟并自動恢復,可以解決小問題,但是可能會隱藏掉真正的bug。

無重啟策略:使用API配置不重啟即可。

固定延遲重啟策略(開發中使用):調用API,配置固定時間or多少次數重啟

失敗率重啟策略(開發偶爾使用):調用API,可以選擇每個測量階段內最大失敗次數;失敗率測量的時間間隔;兩次連續重啟的時間間隔來重啟。

7.SavePoint(本質就是手動的CheckPoint)

實際開發中,如果要對集群進行停機維護/擴容,這個時候需要執行一次SavePoint,也就是執行一次手動的CheckPoint,那么這樣的話,程序所有的狀態都會被執行快照并保存。當擴容/維護完畢后,可以從上一次的checkpoint的目錄中恢復。

8.Flink Table API 和 SQL(重點)

和Hive,Spark SQL一樣,Flink也選擇用SQL語言來進行業務程序的編寫,為什么?

因為Java,Scala等開發語言難度較高,SQL語言簡單,能迅速上手,因此Flink也是將Flink Table API & SQL作為未來的核心API。

Flink Table API & SQL的特點:

聲明式 --- 用戶只關心做什么,不用關心怎么去做

高性能 --- 支持查詢優化,可以獲取更好的執行性能

流批統一 --- 相同的統計邏輯,既可以支持流模式運行,也可以支持批模式運行

標準穩定 --- 語音遵循SQL標準,不易變動

易理解 --- 語義明確,所見即所得

9.動態表和連續查詢

動態表:就是源源不斷地數據不斷地添加到表的末尾

連續查詢:連續查詢需要借助state狀態管理

10.Spark vs Flink

1)應用場景

Spark主要做離線批處理,對延時要求不高的實時處理(微批)

Flink主要用于實時處理,Flink 1.12支持流批一體

2)API上

Spark:RDD(不推薦)/ DSteam(不推薦)/? DataFrame和DataSet

Flink:DataSet(軟棄用)和DataSteam / Tabel API & SQL

3)核心角色和原理

Spark:

Flink:

4)時間機制

Spark:SparkSteaming只支持處理時間,StructuredSteaming開始支持事件時間

Flink:直接支持事件時間/處理時間/攝入時間

5)容錯機制

Spark:緩存/ 持久化+ checkpoint(應用級別)

Flink:State + CheckPoint(Operator級別,顆粒度更小) + 自動重啟策略 + SavePoint

6)窗口

Spark中支持時間,數量的滑動和滾動窗口,要求windowDuration和SlideDuration必須是batchDuration的倍數

Flink中的窗口機制更加靈活/功能更多,支持基于時間/數量的滑動/滾動 和 會話窗口

Flink保姆級教程,超全五萬字,學習與面試收藏這一篇就夠了_flink 教程-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710706.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710706.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710706.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 高級實踐探索:深度解讀與實戰演練

隨著開發者對Spring Boot框架的基礎運用日漸嫻熟,邁向更深層次的技術探究和應用場景拓展顯得尤為重要。本文將帶領讀者深入研究Spring Boot的若干核心進階特性,并結合實際項目案例,涵蓋自動化測試策略的深化應用、高級配置管理機制的巧妙運用…

Redis 之四:Redis 事務和樂觀鎖

事務特點 Redis 事務可以一次執行多個命令, 并且帶有以下三個重要的保證: 批量操作在發送 EXEC 命令前被放入隊列緩存。 收到 EXEC 命令后進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行。不具備原子性。 在事務執…

通訊錄——C語言實現

頭文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一個人的信息 //struct…

npm使用國內淘寶鏡像的方法整理

命令配置安裝&#xff1a; 淘寶鏡像&#xff1a; npm config set registry https://registry.npm.taobao.org/ 官方鏡像&#xff1a; npm config set registry https://registry.npmjs.org 通過cnpm安裝&#xff1a; npm install -g cnpm --registryhttps://registry.npm.…

PTA L2-003 月餅 (附坑點說明)

月餅是中國人在中秋佳節時吃的一種傳統食品&#xff0c;不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量&#xff0c;請你計算可以獲得的最大收益是多少。 注意&#xff1a;銷售時允許取出一部分庫存。樣例給出的情形是這樣的&#…

如何在Java中反轉字符串?

目錄 1. 使用StringBuilder的reverse方法&#xff1a; 2. 使用for循環和字符數組&#xff1a; 3. 使用遞歸&#xff1a; 4. 使用Java 8的Stream API&#xff1a; More Java中&#xff0c;反轉字符串可以通過多種方式實現。以下是一些常見的方法&#xff1a; 1. Java中使用…

【Python】PyGameUI控件

哈里前段時間寫了一個windows平板上自娛自樂&#xff08;春節和家人一起玩&#xff09;基于pygame的大富翁游戲。 pygame沒有按鈕之類的UI控件&#xff0c;寫起來不怎么順手。就自己寫一個簡單的框架。 倉庫地址 哈里PygameUi: pygame ui封裝自用 (gitee.com) 使用示例 示…

上海亞商投顧:滬指終結月線6連陰 北向資金凈買入超160億

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 三大指數昨日低開高走&#xff0c;滬指重新站上3000點&#xff0c;深成指、創業板指大漲超3%。半導體產業鏈全…

實時聊天系統PHP

實時聊天系統可以讓用戶在網站上實時交流&#xff0c;這對社交平臺、在線客服等網站非常有幫助。以下是一個簡單的基于 PHP 和 WebSocket 的實時聊天系統示例&#xff1a; 1. 首先創建一個 HTML 文件 index.html 來顯示聊天界面和發送消息的表單&#xff1a; html <!DOCTYP…

【C#】 List.Sort 方法

【C#】 List.Sort 方法 在C#中&#xff0c;List.Sort()不僅為系統自帶的變量(int, float, double …)類型的集合提供默認排序&#xff0c;還提供了自定義的排序方法。 List自帶排序 List<int> list new List<int>(); list.Add(5); list.Add(3); list.Add(4); l…

探索那些能喚起情感共鳴的壁紙

1、方小童在線工具集 網址&#xff1a; 方小童 該網站是一款在線工具集合的網站&#xff0c;目前包含PDF文件在線轉換、隨機生成美女圖片、精美壁紙、電子書搜索等功能&#xff0c;喜歡的可以趕緊去試試&#xff01;

Python:關于數據服務中的Web API的設計

搭建類似joinquant、tushare類似的私有數據服務應用&#xff0c;有以下一些點需要注意&#xff1a; 需要說明的是&#xff0c;這里討論的是web api前后端&#xff0c;當然還有其它方案&#xff0c;thrift&#xff0c;grpc等。因為要考慮到一魚兩吃&#xff0c;本文只探討web ap…

高項軟考電子版論文答題紙(附下載)

24年軟考又要來了&#xff0c;作為高項軟考的攔路虎&#xff0c;論文你準備好了嗎&#xff1f;&#xff01;記住在開始考試之前一定要用論文答題紙上把準備好的論文&#xff0c;在規定的時間內寫上幾遍&#xff0c;一是現在很少動筆寫字了。二是、熟悉一下論文考試的感覺。 準備…

UniApp Vue 3 中的網絡請求封裝詳解及用法

在UniApp中&#xff0c;結合Vue 3的強大特性&#xff0c;進行網絡請求的封裝是項目中常見的需求。這樣的封裝不僅提高了代碼的可維護性&#xff0c;還使得在組件中使用網絡請求更加簡潔。本文將詳細介紹UniApp Vue 3中的網絡請求封裝&#xff0c;并提供一個簡單的用法示例。 1…

索引使用規則4——覆蓋索引回表查詢

覆蓋索引&#xff1a;查詢使用了索引&#xff0c;并且需要返回的列&#xff0c;在索引里面都可以找到&#xff0c;減少select*的使用 1、using index condition Extra 為using index condition 表明查找使用了索引&#xff0c;但是需要回表查詢&#xff08;也就是先二級索引&…

第十八屆全國大學生智能汽車競賽——攝像頭算法(附帶個人經驗)

文章目錄 前言一、攝像頭圖像處理1、攝像頭圖像采集2、圖像二值化與大津算法 二、左右邊界&#xff0c;中線掃描 前言 參加了第十六&#xff0c;十七和第十八屆全國大學生智能車競賽&#xff0c;對攝像頭的學習有部分心得&#xff0c;分享給大家&#xff0c;三屆車賽&#xff…

【C語言基礎】:深入理解指針(一)

文章目錄 一、內存和地址1. 內存2. 如何理解編址 二、指針變量和地址2.1 取地址操作符(&)2.2 指針變量和解引用操作符(*)2.2.1 指針變量2.2.2 如何拆解指針變量2.2.3 解引用操作符 2.3 指針變量的大小 三、指針變量類型的意義3.1 指針的解引用3.2 指針 - 整數3.3 void*指針…

HCIA-HarmonyOS設備開發認證V2.0-習題

目錄 習題一習題二&#xff08;待續...&#xff09;堅持就有收獲 習題一 # HarmonyOS簡介 1. 以下哪幾項屬于OpenHarmony的技術特性&#xff1f;&#xff08;&#xff09;A. 統一OS&#xff0c;彈性部署B. 一次開發&#xff0c;多端部署C. 硬件互助&#xff0c;資源共享2. Ope…

從零開始的Java知識(下)

從零開始的Java知識 雙列數據集合&#xff08;Day1&#xff09;Map 雙列數據集合&#xff08;Day1&#xff09; Map 注意點&#xff1a; Map一次加入一個key-value一個key對應一個valuekey與key之間是不重復的key-value被稱為鍵值對&#xff0c;鍵值對對象或者是entry對象 …

離散數學

(理解大于識記, 這么多公式我是記不住) 命題邏輯 P P P Q Q Q P \neg P P 否定/非 P ∧ Q P \wedge Q P∧Q 合取/與 P ∨ Q P \vee Q P∨Q 析取/或 P → Q P \to Q P→Q 蘊含 P ? Q P \leftrightarrow Q P?Q 等價0010011011011010001001101111 P → Q P\to Q P→Q 的自然語…