一文讓你徹底瞭解大數據實時計算引擎 Flink

来源:https://www.cnblogs.com/zhisheng/archive/2019/11/05/11802233.html
-Advertisement-
Play Games

前言 在上一篇文章 "你公司到底需不需要引入實時計算引擎?" 中我講解了日常中常見的實時需求,然後分析了這些需求的實現方式,接著對比了實時計算和離線計算。隨著這些年大數據的飛速發展,也出現了不少計算的框架(Hadoop、Storm、Spark、Flink)。在網上有人將大數據計算引擎的發展分為四個階 ...


前言

在上一篇文章 你公司到底需不需要引入實時計算引擎? 中我講解了日常中常見的實時需求,然後分析了這些需求的實現方式,接著對比了實時計算和離線計算。隨著這些年大數據的飛速發展,也出現了不少計算的框架(Hadoop、Storm、Spark、Flink)。在網上有人將大數據計算引擎的發展分為四個階段。

  • 第一代:Hadoop 承載的 MapReduce

  • 第二代:支持 DAG(有向無環圖)框架的計算引擎 Tez 和 Oozie,主要還是批處理任務

  • 第三代:支持 Job 內部的 DAG(有向無環圖),以 Spark 為代表

  • 第四代:大數據統一計算引擎,包括流處理、批處理、AI、Machine Learning、圖計算等,以 Flink 為代表

或許會有人不同意以上的分類,我覺得其實這並不重要的,重要的是體會各個框架的差異,以及更適合的場景。併進行理解,沒有哪一個框架可以完美的支持所有的場景,也就不可能有任何一個框架能完全取代另一個。

本文將對 Flink 的整體架構和 Flink 的多種特性做個詳細的介紹!在講 Flink 之前的話,我們先來看看 數據集類型數據運算模型 的種類。

數據集類型

  • 無窮數據集:無窮的持續集成的數據集合

  • 有界數據集:有限不會改變的數據集合

那麼那些常見的無窮數據集有哪些呢?

  • 用戶與客戶端的實時交互數據

  • 應用實時產生的日誌

  • 金融市場的實時交易記錄

數據運算模型

  • 流式:只要數據一直在產生,計算就持續地進行
  • 批處理:在預先定義的時間內運行計算,當計算完成時釋放電腦資源

那麼我們再來看看 Flink 它是什麼呢?

Flink 是一個針對流數據和批數據的分散式處理引擎,代碼主要是由 Java 實現,部分代碼是 Scala。它可以處理有界的批量數據集、也可以處理無界的實時數據集。對 Flink 而言,其所要處理的主要場景就是流數據,批數據只是流數據的一個極限特例而已,所以 Flink 也是一款真正的流批統一的計算引擎。

Flink 提供了 State、Checkpoint、Time、Window 等,它們為 Flink 提供了基石,本篇文章下麵會稍作講解,具體深度分析後面會有專門的文章來講解。

從下至上:

1、部署:Flink 支持本地運行(IDE 中直接運行程式)、能在獨立集群(Standalone 模式)或者在被 YARN、Mesos、K8s 管理的集群上運行,也能部署在雲上。

2、運行:Flink 的核心是分散式流式數據引擎,意味著數據以一次一個事件的形式被處理。

3、API:DataStream、DataSet、Table、SQL API。

4、擴展庫:Flink 還包括用於 CEP(複雜事件處理)、機器學習、圖形處理等場景。

Flink 支持多種模式下的運行。

  • Local:直接在 IDE 中運行 Flink Job 時則會在本地啟動一個 mini Flink 集群

  • Standalone:在 Flink 目錄下執行 bin/start-cluster.sh 腳本則會啟動一個 Standalone 模式的集群

  • YARN:YARN 是 Hadoop 集群的資源管理系統,它可以在群集上運行各種分散式應用程式,Flink 可與其他應用並行於 YARN 中,Flink on YARN 的架構如下:

  • Kubernetes:Kubernetes 是 Google 開源的容器集群管理系統,在 Docker 技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性,Flink 也支持部署在 Kubernetes 上,在 GitHub 看到有下麵這種運行架構的。

通常上面四種居多,另外還支持 AWS、MapR、Aliyun OSS 等。

Flink 作業提交架構流程可見下圖:

1、Program Code:我們編寫的 Flink 應用程式代碼

2、Job Client:Job Client 不是 Flink 程式執行的內部部分,但它是任務執行的起點。 Job Client 負責接受用戶的程式代碼,然後創建數據流,將數據流提交給 Job Manager 以便進一步執行。 執行完成後,Job Client 將結果返回給用戶

3、Job Manager:主進程(也稱為作業管理器)協調和管理程式的執行。 它的主要職責包括安排任務,管理 checkpoint ,故障恢復等。機器集群中至少要有一個 master,master 負責調度 task,協調 checkpoints 和容災,高可用設置的話可以有多個 master,但要保證一個是 leader, 其他是 standby; Job Manager 包含 Actor system、Scheduler、Check pointing 三個重要的組件

4、Task Manager:從 Job Manager 處接收需要部署的 Task。Task Manager 是在 JVM 中的一個或多個線程中執行任務的工作節點。 任務執行的並行性由每個 Task Manager 上可用的任務槽(Slot 個數)決定。 每個任務代表分配給任務槽的一組資源。 例如,如果 Task Manager 有四個插槽,那麼它將為每個插槽分配 25% 的記憶體。 可以在任務槽中運行一個或多個線程。 同一插槽中的線程共用相同的 JVM。
同一 JVM 中的任務共用 TCP 連接和心跳消息。Task Manager 的一個 Slot 代表一個可用線程,該線程具有固定的記憶體,註意 Slot 只對記憶體隔離,沒有對 CPU 隔離。預設情況下,Flink 允許子任務共用 Slot,即使它們是不同 task 的 subtask,只要它們來自相同的 job。這種共用可以有更好的資源利用率。

Flink 提供了不同的抽象級別的 API 以開發流式或批處理應用。

  • 最底層提供了有狀態流。它將通過 Process Function 嵌入到 DataStream API 中。它允許用戶可以自由地處理來自一個或多個流數據的事件,並使用一致性、容錯的狀態。除此之外,用戶可以註冊事件時間和處理事件回調,從而使程式可以實現複雜的計算。

  • DataStream / DataSet API 是 Flink 提供的核心 API ,DataSet 處理有界的數據集,DataStream 處理有界或者無界的數據流。用戶可以通過各種方法(map / flatmap / window / keyby / sum / max / min / avg / join 等)將數據進行轉換或者計算。

  • Table API 是以表為中心的聲明式 DSL,其中表可能會動態變化(在表達流數據時)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起來卻更加簡潔(代碼量更少)。
    你可以在表與 DataStream/DataSet 之間無縫切換,也允許程式將 Table API 與 DataStream 以及 DataSet 混合使用。

  • Flink 提供的最高層級的抽象是 SQL 。這一層抽象在語法與表達能力上與 Table API 類似,但是是以 SQL查詢表達式的形式表現程式。SQL 抽象與 Table API 交互密切,同時 SQL 查詢可以直接在 Table API 定義的表上執行。

一個完整的 Flink 應用程式結構就是如上兩圖所示:

1、Source:數據輸入,Flink 在流處理和批處理上的 source 大概有 4 類:基於本地集合的 source、基於文件的 source、基於網路套接字的 source、自定義的 source。自定義的 source 常見的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,當然你也可以定義自己的 source。

2、Transformation:數據轉換的各種操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操作很多,可以將數據轉換計算成你想要的數據。

3、Sink:數據輸出,Flink 將轉換計算後的數據發送的地點 ,你可能需要存儲下來,Flink 常見的 Sink 大概有如下幾類:寫入文件、列印出來、寫入 socket 、自定義的 sink 。自定義的 sink 常見的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定義自己的 sink。

Flink 擁有豐富的庫來進行機器學習,圖形處理,關係數據處理等。由於其架構,很容易執行複雜的事件處理和警報。

Flink 支持多種 Time,比如 Event time、Ingestion Time、Processing Time,後面的文章 Flink 中 Processing Time、Event Time、Ingestion Time 對比及其使用場景分析 中會很詳細的講解 Flink 中 Time 的概念。

Flink 支持多種 Window,比如 Time Window、Count Window、Session Window,還支持自定義 Window。後面的文章 如何使用 Flink Window 及 Window 基本概念與實現原理 中會很詳細的講解 Flink 中 Window 的概念。

Flink 的程式內在是並行和分散式的,數據流可以被分區成 stream partitions,operators 被劃分為 operator subtasks; 這些 subtasks 在不同的機器或容器中分不同的線程獨立運行;
operator subtasks 的數量在具體的 operator 就是並行計算數,程式不同的 operator 階段可能有不同的並行數;如下圖所示,source operator 的並行數為 2,但最後的 sink operator 為 1:

Flink 是一款有狀態的流處理框架,它提供了豐富的狀態訪問介面,按照數據的劃分方式,可以分為 Keyed State 和 Operator State,在 Keyed State 中又提供了多種數據結構:

  • ValueState

  • MapState

  • ListState

  • ReducingState

  • AggregatingState

另外狀態存儲也支持多種方式:

  • MemoryStateBackend:存儲在記憶體中

  • FsStateBackend:存儲在文件中

  • RocksDBStateBackend:存儲在 RocksDB 中

Flink 中支持使用 Checkpoint 來提高程式的可靠性,開啟了 Checkpoint 之後,Flink 會按照一定的時間間隔對程式的運行狀態進行備份,當發生故障時,Flink 會將所有任務的狀態恢復至最後一次發生 Checkpoint 中的狀態,並從那裡開始重新開始執行。

另外 Flink 還支持根據 Savepoint 從已停止作業的運行狀態進行恢復,這種方式需要通過命令進行觸發。

Flink 在 JVM 中提供了自己的記憶體管理,使其獨立於 Java 的預設垃圾收集器。 它通過使用散列,索引,緩存和排序有效地進行記憶體管理。我們在後面的文章 深入探索 Flink 記憶體管理機制 會深入講解 Flink 裡面的記憶體管理機制。

總結

本篇文章對 Flink 做了一個詳細的介紹,將 Flink 的特點一一做了描述,後面文章中我們也會進一步地對這裡面的特點進行原理解析。本文的地址是 http://www.54tianzhisheng.cn/2019/08/19/flink/ ,未經允許禁止任何形式的轉載,違者必究。

最後

GitHub Flink 學習代碼地址:https://github.com/zhisheng17/flink-learning

微信公眾號:zhisheng

另外我自己整理了些 Flink 的學習資料,目前已經全部放到微信公眾號(zhisheng)了,你可以回覆關鍵字:Flink 即可無條件獲取到。另外也可以加我微信 你可以加我的微信:yuanblog_tzs,探討技術!

更多私密資料請加入知識星球!

專欄介紹

掃碼下麵專欄二維碼可以訂閱該專欄

首發地址:http://www.54tianzhisheng.cn/2019/11/15/flink-in-action/

專欄地址:https://gitbook.cn/gitchat/column/5dad4a20669f843a1a37cb4f

博客

1、Flink 從0到1學習 —— Apache Flink 介紹

2、Flink 從0到1學習 —— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程式入門

3、Flink 從0到1學習 —— Flink 配置文件詳解

4、Flink 從0到1學習 —— Data Source 介紹

5、Flink 從0到1學習 —— 如何自定義 Data Source ?

6、Flink 從0到1學習 —— Data Sink 介紹

7、Flink 從0到1學習 —— 如何自定義 Data Sink ?

8、Flink 從0到1學習 —— Flink Data transformation(轉換)

9、Flink 從0到1學習 —— 介紹 Flink 中的 Stream Windows

10、Flink 從0到1學習 —— Flink 中的幾種 Time 詳解

11、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 ElasticSearch

12、Flink 從0到1學習 —— Flink 項目如何運行?

13、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Kafka

14、Flink 從0到1學習 —— Flink JobManager 高可用性配置

15、Flink 從0到1學習 —— Flink parallelism 和 Slot 介紹

16、Flink 從0到1學習 —— Flink 讀取 Kafka 數據批量寫入到 MySQL

17、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 RabbitMQ

18、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 HBase

19、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 HDFS

20、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Redis

21、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Cassandra

22、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 Flume

23、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 InfluxDB

24、Flink 從0到1學習 —— Flink 讀取 Kafka 數據寫入到 RocketMQ

25、Flink 從0到1學習 —— 你上傳的 jar 包藏到哪裡去了

26、Flink 從0到1學習 —— 你的 Flink job 日誌跑到哪裡去了

27、阿裡巴巴開源的 Blink 實時計算框架真香

28、Flink 從0到1學習 —— Flink 中如何管理配置?

29、Flink 從0到1學習—— Flink 不可以連續 Split(分流)?

30、Flink 從0到1學習—— 分享四本 Flink 國外的書和二十多篇 Paper 論文

31、Flink 架構、原理與部署測試

32、為什麼說流處理即未來?

33、OPPO 數據中台之基石:基於 Flink SQL 構建實時數據倉庫

34、流計算框架 Flink 與 Storm 的性能對比

35、Flink狀態管理和容錯機制介紹

36、Apache Flink 結合 Kafka 構建端到端的 Exactly-Once 處理

37、360深度實踐:Flink與Storm協議級對比

38、如何基於Flink+TensorFlow打造實時智能異常檢測平臺?只看這一篇就夠了

39、Apache Flink 1.9 重大特性提前解讀

40、Flink 全網最全資源(視頻、博客、PPT、入門、原理、實戰、性能調優、源碼解析、問答等持續更新)

41、Flink 靈魂兩百問,這誰頂得住?

42、Flink 從0到1學習 —— 如何使用 Side Output 來分流?

43、你公司到底需不需要引入實時計算引擎?

44、一文讓你徹底瞭解大數據實時計算引擎 Flink

源碼解析

1、Flink 源碼解析 —— 源碼編譯運行

2、Flink 源碼解析 —— 項目結構一覽

3、Flink 源碼解析—— local 模式啟動流程

4、Flink 源碼解析 —— standalone session 模式啟動流程

5、Flink 源碼解析 —— Standalone Session Cluster 啟動流程深度分析之 Job Manager 啟動

6、Flink 源碼解析 —— Standalone Session Cluster 啟動流程深度分析之 Task Manager 啟動

7、Flink 源碼解析 —— 分析 Batch WordCount 程式的執行過程

8、Flink 源碼解析 —— 分析 Streaming WordCount 程式的執行過程

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 機制

16、Flink 源碼解析 —— 深度解析 Flink 序列化機制

17、Flink 源碼解析 —— 深度解析 Flink 是如何管理好記憶體的?

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

26、Flink Annotations 源碼解析

27、Flink 源碼解析 —— 如何獲取 ExecutionGraph ?

28、大數據重磅炸彈——實時計算框架 Flink

29、Flink Checkpoint-輕量級分散式快照

30、Flink Clients 源碼解析
原文出處:zhisheng的博客,歡迎關註我的公眾號:zhisheng


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發環境: Windows操作系統 開發工具:MyEclipse/Eclipse + JDK+ Tomcat + MySQL 資料庫 項目簡介: 系統前段頁面採用jsp + JavaScript + css的組合技術開發,其中JavaScript使用了jQuery和bootstrap框架,這兩個前段 ...
  • 1.緩存雪崩和緩存穿透問題 1.1緩存雪崩 簡介:緩存同一時間大面積的失效,所以,後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。 解決辦法:  事前:儘量保證整個 redis 集群的高可用性,發現機器宕機儘快補上。選擇合適的記憶體淘汰策略。  事中:本地 ehcache 緩存 ...
  • 一、基礎類介紹 1、工作簿類Workbook簡介: import xlwt class Workbook(object0): ''' 工作簿類,使用xlwt創建excel文件時,首先要實例化此類的對象 ''' def __init__(self, encoding='ascii', style_co ...
  • 在項目開發過程中經常遇到時間處理,但是你真的用對了嗎,理解阿裡巴巴開發手冊中禁用static修飾SimpleDateFormat嗎 通過閱讀本篇文章你將瞭解到: 為什麼需要LocalDate、LocalTime、LocalDateTime【java8新提供的類】 java8新的時間API的使用方式, ...
  • 1. 樂觀鎖 樂觀鎖顧名思義就是在操作時很樂觀,認為操作不會產生併發問題(不會有其他線程對數據進行修改),因此不會上鎖。但是在更新時會判斷其他線程在這之前有沒有對數據進行修改,一般會使用版本號機制或CAS(compare and swap)演算法實現。簡單理解:這裡的數據,別想太多,你儘管用,出問題了 ...
  • start方法和run方法比較 很多人包括我自己也以前也認為run和start方法都可以啟動一個線程,並且兩者的功能都差不多,然後在學習的過程中認識到這是錯誤的,他們之間是 截然不同 的。先來看一段演示代碼: 輸出結果: 可以看到, 執行run方法的線程是主線程,而執行start方法的才是一個新的子 ...
  • 獲取 在刷機之前,需要在電腦上下載 Android Preview 包,一般我都是到 安卓中國 ,這裡可以下載最新的包。 手機 相對下載包的獲取,比較難的是有一部支持最新的安卓系統的手機,一般 Preview 版的系統都是預設支持 Google 自己的手機的。 主要有面向的是 Pixel 系列的手機 ...
  • 一、為什麼 物理地址=段地址x16+偏移地址? PS:剛開始學時,我都笨到不明白為什麼是2的N次方,咱把物理地址就當數字,電腦中數字是由很多位0或1自由組合的, 而每一位上要麼是0要麼是1,只有這兩種情況,所以N位就可以組成2的N次方個編號地址了 8086CPU的地址匯流排是20條(位),因此就可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...