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

前言

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

  • 第一代:Hadoop 承載的 MapReduce
  • 第二代:支持 DAG(有向無環圖)框架的計算引擎 Tez 和 Oozie,主要仍是批處理任務
  • 第三代:支持 Job 內部的 DAG(有向無環圖),以 Spark 爲表明
  • 第四代:大數據統一計算引擎,包括流處理、批處理、AI、Machine Learning、圖計算等,以 Flink 爲表明

或許會有人不一樣意以上的分類,我以爲其實這並不重要的,重要的是體會各個框架的差別,以及更適合的場景。並進行理解,沒有哪個框架能夠完美的支持全部的場景,也就不可能有任何一個框架能徹底取代另外一個。github

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

數據集類型

  • 無窮數據集:無窮的持續集成的數據集合
  • 有界數據集:有限不會改變的數據集合

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

  • 用戶與客戶端的實時交互數據
  • 應用實時產生的日誌
  • 金融市場的實時交易記錄

數據運算模型

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

那麼咱們再來看看 Flink 它是什麼呢?微信

Flink 是什麼?

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

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

Flink 總體結構

從下至上:數據結構

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

二、運行:Flink 的核心是分佈式流式數據引擎,意味着數據以一次一個事件的形式被處理。框架

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

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

Flink 支持多種方式部署

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 分佈式運行

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

一、Program Code:咱們編寫的 Flink 應用程序代碼

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

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

四、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

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 程序與數據流結構

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

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

二、Transformation:數據轉換的各類操做,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操做不少,能夠將數據轉換計算成你想要的數據。

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

Flink 支持多種擴展庫

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

Flink 提供多種 Time 語義

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

Flink 提供靈活的窗口機制

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

Flink 並行的執行任務

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

Flink 支持狀態存儲

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

  • ValueState
  • MapState
  • ListState
  • ReducingState
  • AggregatingState

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

  • MemoryStateBackend:存儲在內存中
  • FsStateBackend:存儲在文件中
  • RocksDBStateBackend:存儲在 RocksDB 中

Flink 支持容錯機制

Flink 中支持使用 Checkpoint 來提升程序的可靠性,開啓了 Checkpoint 以後,Flink 會按照必定的時間間隔對程序的運行狀態進行備份,當發生故障時,Flink 會將全部任務的狀態恢復至最後一次發生 Checkpoint 中的狀態,並從那裏開始從新開始執行。

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

Flink 實現了本身的內存管理機制

Flink 在 JVM 中提供了本身的內存管理,使其獨立於 Java 的默認垃圾收集器。 它經過使用散列,索引,緩存和排序有效地進行內存管理。咱們在後面的文章 深刻探索 Flink 內存管理機制 會深刻講解 Flink 裏面的內存管理機制。

總結

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

最後

GitHub Flink 學習代碼地址:github.com/zhisheng17/…

微信公衆號:zhisheng

另外我本身整理了些 Flink 的學習資料,目前已經所有放到微信公衆號(zhisheng)了,你能夠回覆關鍵字:Flink 便可無條件獲取到。另外也能夠加我微信 你能夠加個人微信:yuanblog_tzs,探討技術!

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

專欄介紹

掃碼下面專欄二維碼能夠訂閱該專欄

首發地址:www.54tianzhisheng.cn/2019/11/15/…

專欄地址:gitbook.cn/gitchat/col…

博客

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2五、Flink 從0到1學習 —— 你上傳的 jar 包藏到哪裏去了

2六、Flink 從0到1學習 —— 你的 Flink job 日誌跑到哪裏去了

2七、阿里巴巴開源的 Blink 實時計算框架真香

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

2九、Flink 從0到1學習—— Flink 不能夠連續 Split(分流)?

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

3一、Flink 架構、原理與部署測試

3二、爲何說流處理即將來?

3三、OPPO 數據中臺之基石:基於 Flink SQL 構建實時數據倉庫

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

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

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

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

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

3九、Apache Flink 1.9 重大特性提早解讀

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

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

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

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

4四、一文讓你完全瞭解大數據實時計算引擎 Flink

源碼解析

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

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

三、Flink 源碼解析—— local 模式啓動流程

四、Flink 源碼解析 —— standalone session 模式啓動流程

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

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

七、Flink 源碼解析 —— 分析 Batch WordCount 程序的執行過程

八、Flink 源碼解析 —— 分析 Streaming WordCount 程序的執行過程

九、Flink 源碼解析 —— 如何獲取 JobGraph?

十、Flink 源碼解析 —— 如何獲取 StreamGraph?

十一、Flink 源碼解析 —— Flink JobManager 有什麼做用?

十二、Flink 源碼解析 —— Flink TaskManager 有什麼做用?

1三、Flink 源碼解析 —— JobManager 處理 SubmitJob 的過程

1四、Flink 源碼解析 —— TaskManager 處理 SubmitJob 的過程

1五、Flink 源碼解析 —— 深度解析 Flink Checkpoint 機制

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

1七、Flink 源碼解析 —— 深度解析 Flink 是如何管理好內存的?

1八、Flink Metrics 源碼解析 —— Flink-metrics-core

1九、Flink Metrics 源碼解析 —— Flink-metrics-datadog

20、Flink Metrics 源碼解析 —— Flink-metrics-dropwizard

2一、Flink Metrics 源碼解析 —— Flink-metrics-graphite

2二、Flink Metrics 源碼解析 —— Flink-metrics-influxdb

2三、Flink Metrics 源碼解析 —— Flink-metrics-jmx

2四、Flink Metrics 源碼解析 —— Flink-metrics-slf4j

2五、Flink Metrics 源碼解析 —— Flink-metrics-statsd

2六、Flink Metrics 源碼解析 —— Flink-metrics-prometheus

2六、Flink Annotations 源碼解析

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

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

2九、Flink Checkpoint-輕量級分佈式快照

30、Flink Clients 源碼解析原文出處:zhisheng的博客,歡迎關注個人公衆號:zhisheng

相關文章
相關標籤/搜索