前言
在上一篇文章 你公司到底需不需要引入實(shí)時計算引擎够庙? 中我講解了日常中常見的實(shí)時需求匹表,然后分析了這些需求的實(shí)現(xiàn)方式盛杰,接著對比了實(shí)時計算和離線計算藐石。隨著這些年大數(shù)據(jù)的飛速發(fā)展即供,也出現(xiàn)了不少計算的框架(Hadoop、Storm于微、Spark逗嫡、Flink)祸穷。在網(wǎng)上有人將大數(shù)據(jù)計算引擎的發(fā)展分為四個階段。
第一代:Hadoop 承載的 MapReduce
第二代:支持 DAG(有向無環(huán)圖)框架的計算引擎 Tez 和 Oozie勺三,主要還是批處理任務(wù)
第三代:支持 Job 內(nèi)部的 DAG(有向無環(huán)圖),以 Spark 為代表
第四代:大數(shù)據(jù)統(tǒng)一計算引擎,包括流處理商源、批處理车份、AI、Machine Learning牡彻、圖計算等扫沼,以 Flink 為代表
或許會有人不同意以上的分類,我覺得其實(shí)這并不重要的庄吼,重要的是體會各個框架的差異缎除,以及更適合的場景。并進(jìn)行理解总寻,沒有哪一個框架可以完美的支持所有的場景器罐,也就不可能有任何一個框架能完全取代另一個。
本文將對 Flink 的整體架構(gòu)和 Flink 的多種特性做個詳細(xì)的介紹渐行!在講 Flink 之前的話轰坊,我們先來看看 數(shù)據(jù)集類型 和 數(shù)據(jù)運(yùn)算模型 的種類铸董。
數(shù)據(jù)集類型
無窮數(shù)據(jù)集:無窮的持續(xù)集成的數(shù)據(jù)集合
有界數(shù)據(jù)集:有限不會改變的數(shù)據(jù)集合
那么那些常見的無窮數(shù)據(jù)集有哪些呢?
用戶與客戶端的實(shí)時交互數(shù)據(jù)
應(yīng)用實(shí)時產(chǎn)生的日志
金融市場的實(shí)時交易記錄
…
數(shù)據(jù)運(yùn)算模型
- 流式:只要數(shù)據(jù)一直在產(chǎn)生肴沫,計算就持續(xù)地進(jìn)行
- 批處理:在預(yù)先定義的時間內(nèi)運(yùn)行計算粟害,當(dāng)計算完成時釋放計算機(jī)資源
那么我們再來看看 Flink 它是什么呢?
Flink 是什么颤芬?
Flink 是一個針對流數(shù)據(jù)和批數(shù)據(jù)的分布式處理引擎我磁,代碼主要是由 Java 實(shí)現(xiàn),部分代碼是 Scala驻襟。它可以處理有界的批量數(shù)據(jù)集、也可以處理無界的實(shí)時數(shù)據(jù)集芋哭。對 Flink 而言沉衣,其所要處理的主要場景就是流數(shù)據(jù),批數(shù)據(jù)只是流數(shù)據(jù)的一個極限特例而已减牺,所以 Flink 也是一款真正的流批統(tǒng)一的計算引擎豌习。
Flink 提供了 State、Checkpoint拔疚、Time肥隆、Window 等,它們?yōu)?Flink 提供了基石稚失,本篇文章下面會稍作講解栋艳,具體深度分析后面會有專門的文章來講解。
Flink 整體結(jié)構(gòu)
從下至上:
1句各、部署:Flink 支持本地運(yùn)行(IDE 中直接運(yùn)行程序)吸占、能在獨(dú)立集群(Standalone 模式)或者在被 YARN、Mesos凿宾、K8s 管理的集群上運(yùn)行矾屯,也能部署在云上。
2初厚、運(yùn)行:Flink 的核心是分布式流式數(shù)據(jù)引擎件蚕,意味著數(shù)據(jù)以一次一個事件的形式被處理。
3产禾、API:DataStream排作、DataSet、Table下愈、SQL API纽绍。
4、擴(kuò)展庫:Flink 還包括用于 CEP(復(fù)雜事件處理)势似、機(jī)器學(xué)習(xí)拌夏、圖形處理等場景僧著。
Flink 支持多種方式部署
Flink 支持多種模式下的運(yùn)行。
Local:直接在 IDE 中運(yùn)行 Flink Job 時則會在本地啟動一個 mini Flink 集群
Standalone:在 Flink 目錄下執(zhí)行
bin/start-cluster.sh
腳本則會啟動一個 Standalone 模式的集群YARN:YARN 是 Hadoop 集群的資源管理系統(tǒng)障簿,它可以在群集上運(yùn)行各種分布式應(yīng)用程序盹愚,F(xiàn)link 可與其他應(yīng)用并行于 YARN 中,F(xiàn)link on YARN 的架構(gòu)如下:
- Kubernetes:Kubernetes 是 Google 開源的容器集群管理系統(tǒng)站故,在 Docker 技術(shù)的基礎(chǔ)上皆怕,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度西篓、服務(wù)發(fā)現(xiàn)和動態(tài)伸縮等一系列完整功能愈腾,提高了大規(guī)模容器集群管理的便捷性,F(xiàn)link 也支持部署在 Kubernetes 上岂津,在 GitHub 看到有下面這種運(yùn)行架構(gòu)的虱黄。
通常上面四種居多,另外還支持 AWS吮成、MapR橱乱、Aliyun OSS 等。
Flink 分布式運(yùn)行
Flink 作業(yè)提交架構(gòu)流程可見下圖:
1粱甫、Program Code:我們編寫的 Flink 應(yīng)用程序代碼
2泳叠、Job Client:Job Client 不是 Flink 程序執(zhí)行的內(nèi)部部分,但它是任務(wù)執(zhí)行的起點(diǎn)茶宵。 Job Client 負(fù)責(zé)接受用戶的程序代碼危纫,然后創(chuàng)建數(shù)據(jù)流,將數(shù)據(jù)流提交給 Job Manager 以便進(jìn)一步執(zhí)行乌庶。 執(zhí)行完成后叶摄,Job Client 將結(jié)果返回給用戶
3、Job Manager:主進(jìn)程(也稱為作業(yè)管理器)協(xié)調(diào)和管理程序的執(zhí)行安拟。 它的主要職責(zé)包括安排任務(wù)蛤吓,管理 checkpoint ,故障恢復(fù)等糠赦。機(jī)器集群中至少要有一個 master会傲,master 負(fù)責(zé)調(diào)度 task,協(xié)調(diào) checkpoints 和容災(zāi)拙泽,高可用設(shè)置的話可以有多個 master淌山,但要保證一個是 leader, 其他是 standby; Job Manager 包含 Actor system、Scheduler顾瞻、Check pointing 三個重要的組件
4泼疑、Task Manager:從 Job Manager 處接收需要部署的 Task。Task Manager 是在 JVM 中的一個或多個線程中執(zhí)行任務(wù)的工作節(jié)點(diǎn)荷荤。 任務(wù)執(zhí)行的并行性由每個 Task Manager 上可用的任務(wù)槽(Slot 個數(shù))決定退渗。 每個任務(wù)代表分配給任務(wù)槽的一組資源移稳。 例如,如果 Task Manager 有四個插槽会油,那么它將為每個插槽分配 25% 的內(nèi)存个粱。 可以在任務(wù)槽中運(yùn)行一個或多個線程。 同一插槽中的線程共享相同的 JVM翻翩。
同一 JVM 中的任務(wù)共享 TCP 連接和心跳消息都许。Task Manager 的一個 Slot 代表一個可用線程,該線程具有固定的內(nèi)存嫂冻,注意 Slot 只對內(nèi)存隔離胶征,沒有對 CPU 隔離。默認(rèn)情況下桨仿,F(xiàn)link 允許子任務(wù)共享 Slot弧烤,即使它們是不同 task 的 subtask,只要它們來自相同的 job蹬敲。這種共享可以有更好的資源利用率。
Flink API
Flink 提供了不同的抽象級別的 API 以開發(fā)流式或批處理應(yīng)用莺戒。
最底層提供了有狀態(tài)流伴嗡。它將通過 Process Function 嵌入到 DataStream API 中。它允許用戶可以自由地處理來自一個或多個流數(shù)據(jù)的事件从铲,并使用一致性瘪校、容錯的狀態(tài)。除此之外名段,用戶可以注冊事件時間和處理事件回調(diào)阱扬,從而使程序可以實(shí)現(xiàn)復(fù)雜的計算。
DataStream / DataSet API 是 Flink 提供的核心 API 伸辟,DataSet 處理有界的數(shù)據(jù)集麻惶,DataStream 處理有界或者無界的數(shù)據(jù)流。用戶可以通過各種方法(map / flatmap / window / keyby / sum / max / min / avg / join 等)將數(shù)據(jù)進(jìn)行轉(zhuǎn)換或者計算信夫。
Table API 是以表為中心的聲明式 DSL窃蹋,其中表可能會動態(tài)變化(在表達(dá)流數(shù)據(jù)時)。Table API 提供了例如 select静稻、project警没、join、group-by振湾、aggregate 等操作杀迹,使用起來卻更加簡潔(代碼量更少)。
你可以在表與 DataStream/DataSet 之間無縫切換押搪,也允許程序?qū)?Table API 與 DataStream 以及 DataSet 混合使用树酪。Flink 提供的最高層級的抽象是 SQL 浅碾。這一層抽象在語法與表達(dá)能力上與 Table API 類似,但是是以 SQL查詢表達(dá)式的形式表現(xiàn)程序嗅回。SQL 抽象與 Table API 交互密切及穗,同時 SQL 查詢可以直接在 Table API 定義的表上執(zhí)行。
Flink 程序與數(shù)據(jù)流結(jié)構(gòu)
一個完整的 Flink 應(yīng)用程序結(jié)構(gòu)就是如上兩圖所示:
1绵载、Source:數(shù)據(jù)輸入埂陆,F(xiàn)link 在流處理和批處理上的 source 大概有 4 類:基于本地集合的 source、基于文件的 source娃豹、基于網(wǎng)絡(luò)套接字的 source焚虱、自定義的 source。自定義的 source 常見的有 Apache kafka懂版、Amazon Kinesis Streams鹃栽、RabbitMQ、Twitter Streaming API躯畴、Apache NiFi 等民鼓,當(dāng)然你也可以定義自己的 source。
2蓬抄、Transformation:數(shù)據(jù)轉(zhuǎn)換的各種操作丰嘉,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操作很多嚷缭,可以將數(shù)據(jù)轉(zhuǎn)換計算成你想要的數(shù)據(jù)饮亏。
3、Sink:數(shù)據(jù)輸出阅爽,F(xiàn)link 將轉(zhuǎn)換計算后的數(shù)據(jù)發(fā)送的地點(diǎn) 路幸,你可能需要存儲下來,F(xiàn)link 常見的 Sink 大概有如下幾類:寫入文件付翁、打印出來简肴、寫入 socket 、自定義的 sink 百侧。自定義的 sink 常見的有 Apache kafka着帽、RabbitMQ、MySQL移层、ElasticSearch仍翰、Apache Cassandra、Hadoop FileSystem 等观话,同理你也可以定義自己的 sink予借。
Flink 支持多種擴(kuò)展庫
Flink 擁有豐富的庫來進(jìn)行機(jī)器學(xué)習(xí),圖形處理,關(guān)系數(shù)據(jù)處理等灵迫。由于其架構(gòu)秦叛,很容易執(zhí)行復(fù)雜的事件處理和警報。
Flink 提供多種 Time 語義
Flink 支持多種 Time瀑粥,比如 Event time挣跋、Ingestion Time、Processing Time狞换,后面的文章 Flink 中 Processing Time避咆、Event Time、Ingestion Time 對比及其使用場景分析 中會很詳細(xì)的講解 Flink 中 Time 的概念修噪。
Flink 提供靈活的窗口機(jī)制
Flink 支持多種 Window查库,比如 Time Window、Count Window黄琼、Session Window樊销,還支持自定義 Window。后面的文章 如何使用 Flink Window 及 Window 基本概念與實(shí)現(xiàn)原理 中會很詳細(xì)的講解 Flink 中 Window 的概念脏款。
Flink 并行的執(zhí)行任務(wù)
Flink 的程序內(nèi)在是并行和分布式的围苫,數(shù)據(jù)流可以被分區(qū)成 stream partitions,operators 被劃分為 operator subtasks; 這些 subtasks 在不同的機(jī)器或容器中分不同的線程獨(dú)立運(yùn)行撤师;
operator subtasks 的數(shù)量在具體的 operator 就是并行計算數(shù)剂府,程序不同的 operator 階段可能有不同的并行數(shù);如下圖所示丈氓,source operator 的并行數(shù)為 2,但最后的 sink operator 為 1:
Flink 支持狀態(tài)存儲
Flink 是一款有狀態(tài)的流處理框架强法,它提供了豐富的狀態(tài)訪問接口万俗,按照數(shù)據(jù)的劃分方式,可以分為 Keyed State 和 Operator State饮怯,在 Keyed State 中又提供了多種數(shù)據(jù)結(jié)構(gòu):
ValueState
MapState
ListState
ReducingState
AggregatingState
另外狀態(tài)存儲也支持多種方式:
MemoryStateBackend:存儲在內(nèi)存中
FsStateBackend:存儲在文件中
RocksDBStateBackend:存儲在 RocksDB 中
Flink 支持容錯機(jī)制
Flink 中支持使用 Checkpoint 來提高程序的可靠性闰歪,開啟了 Checkpoint 之后,F(xiàn)link 會按照一定的時間間隔對程序的運(yùn)行狀態(tài)進(jìn)行備份蓖墅,當(dāng)發(fā)生故障時库倘,F(xiàn)link 會將所有任務(wù)的狀態(tài)恢復(fù)至最后一次發(fā)生 Checkpoint 中的狀態(tài),并從那里開始重新開始執(zhí)行论矾。
另外 Flink 還支持根據(jù) Savepoint 從已停止作業(yè)的運(yùn)行狀態(tài)進(jìn)行恢復(fù)教翩,這種方式需要通過命令進(jìn)行觸發(fā)。
Flink 實(shí)現(xiàn)了自己的內(nèi)存管理機(jī)制
Flink 在 JVM 中提供了自己的內(nèi)存管理贪壳,使其獨(dú)立于 Java 的默認(rèn)垃圾收集器饱亿。 它通過使用散列,索引,緩存和排序有效地進(jìn)行內(nèi)存管理彪笼。我們在后面的文章 深入探索 Flink 內(nèi)存管理機(jī)制 會深入講解 Flink 里面的內(nèi)存管理機(jī)制钻注。
總結(jié)
本篇文章對 Flink 做了一個詳細(xì)的介紹,將 Flink 的特點(diǎn)一一做了描述配猫,后面文章中我們也會進(jìn)一步地對這里面的特點(diǎn)進(jìn)行原理解析幅恋。本文的地址是 http://www.54tianzhisheng.cn/2019/08/19/flink/ ,未經(jīng)允許禁止任何形式的轉(zhuǎn)載泵肄,違者必究捆交。
最后
GitHub Flink 學(xué)習(xí)代碼地址:https://github.com/zhisheng17/flink-learning
微信公眾號:zhisheng
另外我自己整理了些 Flink 的學(xué)習(xí)資料,目前已經(jīng)全部放到微信公眾號(zhisheng)了凡伊,你可以回復(fù)關(guān)鍵字:Flink 即可無條件獲取到零渐。另外也可以加我微信 你可以加我的微信:yuanblog_tzs,探討技術(shù)系忙!
更多私密資料請加入知識星球诵盼!
專欄介紹
掃碼下面專欄二維碼可以訂閱該專欄
首發(fā)地址:http://www.54tianzhisheng.cn/2019/11/15/flink-in-action/
專欄地址:https://gitbook.cn/gitchat/column/5dad4a20669f843a1a37cb4f
博客
1、Flink 從0到1學(xué)習(xí) —— Apache Flink 介紹
2银还、Flink 從0到1學(xué)習(xí) —— Mac 上搭建 Flink 1.6.0 環(huán)境并構(gòu)建運(yùn)行簡單程序入門
3风宁、Flink 從0到1學(xué)習(xí) —— Flink 配置文件詳解
4、Flink 從0到1學(xué)習(xí) —— Data Source 介紹
5蛹疯、Flink 從0到1學(xué)習(xí) —— 如何自定義 Data Source 戒财?
6、Flink 從0到1學(xué)習(xí) —— Data Sink 介紹
7捺弦、Flink 從0到1學(xué)習(xí) —— 如何自定義 Data Sink 饮寞?
8、Flink 從0到1學(xué)習(xí) —— Flink Data transformation(轉(zhuǎn)換)
9列吼、Flink 從0到1學(xué)習(xí) —— 介紹 Flink 中的 Stream Windows
10幽崩、Flink 從0到1學(xué)習(xí) —— Flink 中的幾種 Time 詳解
11、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 ElasticSearch
12寞钥、Flink 從0到1學(xué)習(xí) —— Flink 項(xiàng)目如何運(yùn)行慌申?
13、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 Kafka
14理郑、Flink 從0到1學(xué)習(xí) —— Flink JobManager 高可用性配置
15蹄溉、Flink 從0到1學(xué)習(xí) —— Flink parallelism 和 Slot 介紹
16、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)批量寫入到 MySQL
17您炉、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 RabbitMQ
18柒爵、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 HBase
19、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 HDFS
20赚爵、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 Redis
21餐弱、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 Cassandra
22宴霸、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 Flume
23、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 InfluxDB
24膏蚓、Flink 從0到1學(xué)習(xí) —— Flink 讀取 Kafka 數(shù)據(jù)寫入到 RocketMQ
25瓢谢、Flink 從0到1學(xué)習(xí) —— 你上傳的 jar 包藏到哪里去了
26、Flink 從0到1學(xué)習(xí) —— 你的 Flink job 日志跑到哪里去了
27驮瞧、阿里巴巴開源的 Blink 實(shí)時計算框架真香
28氓扛、Flink 從0到1學(xué)習(xí) —— Flink 中如何管理配置?
29论笔、Flink 從0到1學(xué)習(xí)—— Flink 不可以連續(xù) Split(分流)采郎?
30、Flink 從0到1學(xué)習(xí)—— 分享四本 Flink 國外的書和二十多篇 Paper 論文
33整份、OPPO 數(shù)據(jù)中臺之基石:基于 Flink SQL 構(gòu)建實(shí)時數(shù)據(jù)倉庫
35籽孙、Flink狀態(tài)管理和容錯機(jī)制介紹
36烈评、Apache Flink 結(jié)合 Kafka 構(gòu)建端到端的 Exactly-Once 處理
37、360深度實(shí)踐:Flink與Storm協(xié)議級對比
38犯建、如何基于Flink+TensorFlow打造實(shí)時智能異常檢測平臺讲冠?只看這一篇就夠了
40适瓦、Flink 全網(wǎng)最全資源(視頻竿开、博客、PPT玻熙、入門否彩、原理、實(shí)戰(zhàn)揭芍、性能調(diào)優(yōu)胳搞、源碼解析卸例、問答等持續(xù)更新)
41称杨、Flink 靈魂兩百問增蹭,這誰頂?shù)米云挟。?/a>
42、Flink 從0到1學(xué)習(xí) —— 如何使用 Side Output 來分流函喉?
43呜舒、你公司到底需不需要引入實(shí)時計算引擎锭汛?
44、一文讓你徹底了解大數(shù)據(jù)實(shí)時計算引擎 Flink
源碼解析
2唤殴、Flink 源碼解析 —— 項(xiàng)目結(jié)構(gòu)一覽
4、Flink 源碼解析 —— standalone session 模式啟動流程
5朵逝、Flink 源碼解析 —— Standalone Session Cluster 啟動流程深度分析之 Job Manager 啟動
6蔚袍、Flink 源碼解析 —— Standalone Session Cluster 啟動流程深度分析之 Task Manager 啟動
7、Flink 源碼解析 —— 分析 Batch WordCount 程序的執(zhí)行過程
8配名、Flink 源碼解析 —— 分析 Streaming WordCount 程序的執(zhí)行過程
9啤咽、Flink 源碼解析 —— 如何獲取 JobGraph?
10渠脉、Flink 源碼解析 —— 如何獲取 StreamGraph宇整?
11、Flink 源碼解析 —— Flink JobManager 有什么作用芋膘?
12鳞青、Flink 源碼解析 —— Flink TaskManager 有什么作用?
13索赏、Flink 源碼解析 —— JobManager 處理 SubmitJob 的過程
14盼玄、Flink 源碼解析 —— TaskManager 處理 SubmitJob 的過程
15、Flink 源碼解析 —— 深度解析 Flink Checkpoint 機(jī)制
16潜腻、Flink 源碼解析 —— 深度解析 Flink 序列化機(jī)制
17埃儿、Flink 源碼解析 —— 深度解析 Flink 是如何管理好內(nèi)存的?
18融涣、Flink Metrics 源碼解析 —— Flink-metrics-core
19童番、Flink Metrics 源碼解析 —— Flink-metrics-datadog
20、Flink Metrics 源碼解析 —— Flink-metrics-dropwizard
21威鹿、Flink Metrics 源碼解析 —— Flink-metrics-graphite
22剃斧、Flink Metrics 源碼解析 —— Flink-metrics-influxdb
23、Flink Metrics 源碼解析 —— Flink-metrics-jmx
24忽你、Flink Metrics 源碼解析 —— Flink-metrics-slf4j
25幼东、Flink Metrics 源碼解析 —— Flink-metrics-statsd
26、Flink Metrics 源碼解析 —— Flink-metrics-prometheus
27根蟹、Flink 源碼解析 —— 如何獲取 ExecutionGraph ?
28糟秘、大數(shù)據(jù)重磅炸彈——實(shí)時計算框架 Flink
29简逮、Flink Checkpoint-?輕量級分布式快照
30、Flink Clients 源碼解析
原文出處:zhisheng的博客尿赚,歡迎關(guān)注我的公眾號:zhisheng