主要內容來自zhisheng大佬的課程,作為學習記錄
一、實時計算的相關背景
實時計算應用

實時計算場景

離線計算 vs 實時計算
- 離線計算

- 數據量大且時間周期長(一天、一星期、一個月、半年、一年)
- 在大量數據上進行復雜的批量運算
- 數據在計算之前已經固定,不再會發(fā)生變化
- 能夠方便的查詢批量計算的結果
- 實時計算

- 數據實時到達
- 數據到達次序獨立,不受應用系統(tǒng)所控制
- 數據規(guī)模大且無法預知容量
- 原始數據一經處理,除非特意保存,否則不能被再次取出處理,或者再次提取數據代價昂貴
實時計算中的流處理 vs 批處理

二、Flink基本概念
Apache Flink 是一個框架和分布式處理引擎,用于在無邊界和有邊界數據流上進行有狀態(tài)的計算。Flink 能在所有常見集群環(huán)境中運行,并能以內存速度和任意規(guī)模進行計算。
1. 數據集類型
任何類型的數據都可以形成一種事件流。信用卡交易、傳感器測量、機器日志、網站或移動應用程序上的用戶交互記錄,所有這些數據都形成一種流(無界或者有界流)。
無界數據流
無界數據流就是指有始無終的數據,數據一旦開始生成就會持續(xù)不斷的產生新的數據,即數據沒有時間邊界。無界數據流需要持續(xù)不斷地處理。處理無界數據流通常要求以特定順序攝取事件,例如事件發(fā)生的順序,以便能夠推斷結果的完整性。有界數據流
有界數據流就是指輸入的數據有始有終,有界數據流可以在攝取所有數據后再進行計算。有界數據流所有數據可以被排序,所以并不需要有序攝取。處理這種有界數據流的方式也被稱之為批處理。
Flink中定義了兩個特殊類DataSet和DataStream來表示上述兩種數據,DataSet數據是有界數據流,而DataStream是無界數據流。
2. Flink數據處理方式
Apache Flink是一個面向數據流處理和批量數據處理的可分布式的開源計算框架,它基于同一個Flink流式執(zhí)行模型(streaming execution model)。Flink進行流處理時認為輸入數據流是無界的,批處理則被作為一種特殊的流處理,輸入數據流被定義為有界。

3. Flink作業(yè)提交架構流程

Flink的架構總體來說分為以下幾個部分:
Job Client
Job Manager
Task Manager

Job Client:Job Client 不是 Flink 程序執(zhí)行的內部部分,但它是任務執(zhí)行的起點。Job Client 負責接受用戶的程序代碼,然后創(chuàng)建數據流,將數據流提交給 Job Manager 以便進一步執(zhí)行。執(zhí)行完成后,Job Client 將結果返回給用戶
Job Manager:主進程(也稱為作業(yè)管理器)協(xié)調和管理程序的執(zhí)行。它的主要職責包括安排任務、管理 checkpoint 、故障恢復等。機器集群中至少要有一個 master,master 負責調度 task、協(xié)調 checkpoints 和容災,高可用設置的話可以有多個 master,但要保證一個是 leader,其他是 standby。Job Manager 包含 Actor system、Scheduler、Check pointing 三個重要的組件。
Task Manager:從 Job Manager 處接收需要部署的 Task。Task Manager 是在 JVM 中的一個或多個線程中執(zhí)行任務的工作節(jié)點。任務執(zhí)行的并行性由每個 Task Manager 上可用的任務槽(Slot 個數)決定。每個任務代表分配給任務槽的一組資源。例如,如果 Task Manager 有四個插槽,那么它將為每個插槽分配 25% 的內存。可以在任務槽中運行一個或多個線程。同一插槽中的線程共享相同的 JVM。
4. Flink API

ProcessFunctions
Process Function允許用戶可以自由地處理來自一個或多個流數據的事件,并使用一致性、容錯的狀態(tài)。除此之外,用戶可以注冊事件時間和處理事件回調,從而使程序可以實現復雜的計算。DataStream/DataSet API
DataStream API為很多常用的流式計算操作提供了基元,比如窗口、記錄的轉換,并且通過查詢外部存儲來豐富event。DataSet 處理有界的數據集,DataStream 處理有界或者無界的數據流。用戶可以通過各種方法將數據進行轉換或者計算。Table API
Table API 是以表為中心的聲明式 DSL,其中表可能會動態(tài)變化(在表達流數據時)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起來卻更加簡潔(代碼量更少)。 你可以在表與 DataStream/DataSet 之間無縫切換,也允許程序將 Table API 與 DataStream 以及 DataSet 混合使用SQL API
SQL API在語法與表達能力上與 Table API 類似,但是是以 SQL查詢表達式的形式表現程序。SQL 抽象與 Table API 交互密切,同時 SQL 查詢可以直接在 Table API 定義的表上執(zhí)行。
5. Flink 代碼邏輯

-
Source
數據輸入,Flink 在流處理和批處理上的 source 大概有 4 類:基于本地集合的 source
基于文件的 source
基于網絡套接字的 source
自定義的 source( 常見的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等)
Transformation
數據轉換的各種操作,有 Map/FlatMap/Filter/KeyBy/Reduce/Fold/ Aggregations/Window/WindowAll/Union/Window join/Split/Select/Project 等,操作很多,可以將數據轉換計算成你想要的數據。Sink
數據輸出,Flink 將轉換計算后的數據發(fā)送的地點,Flink 常見的 Sink 大概有如下幾類:寫入文件、打印出來、寫入 socket、自定義的 sink 。自定義的 Sink 常見的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等。

6. Flink 部署

Flink 是支持以 Standalone、YARN、Kubernetes、Mesos、AWS、MapR、Aliyun OSS 等形式部署的。