Flink 學習系列之一,架構、資料處理
參考
1、官網:
https://
flink。apache。org/
2、GitHub:
https://
github。com/apache/flink
3、
https://
blog。csdn。net/column/de
tails/apacheflink。html
4、
https://
blog。csdn。net/lmalds/ar
ticle/category/6263085
5、
http://
wuchong。me/
6、
https://
blog。csdn。net/liguohuab
igdata/article/category/7279020
Flink 是什麼 ?
從下至上,Flink 整體結構
從下至上:
1、部署:
Flink 支援本地執行、能在獨立叢集或者在被 YARN 或 Mesos 管理的叢集上執行, 也能部署在雲上。
2、執行:Flink 的核心是分散式流式資料引擎,意味著資料以一次一個事件的形式被處理。
3、API:DataStream、DataSet、Table、SQL API。
4、擴充套件庫:Flink 還包括用於複雜事件處理,機器學習,圖形處理和 Apache Storm 相容性的專用程式碼庫。
Flink 資料流程式設計模型
抽象級別
Flink 提供了不同的抽象級別以開發流式或批處理應用。
最底層提供了有狀態流。它將透過 過程函式(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 應用程式結構就是如上圖所示:
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 是一個開源的分散式流式處理框架:
①提供準確的結果,甚至在出現無序或者延遲載入的資料的情況下。
②它是狀態化的容錯的,同時在維護一次完整的的應用狀態時,能無縫修復錯誤。
③大規模執行,在上千個節點執行時有很好的吞吐量和低延遲。
更早的時候,我們討論了資料集型別(有界 vs 無窮)和運算模型(批處理 vs 流式)的匹配。Flink 的流式計算模型啟用了很多功能特性,如狀態管理,處理無序資料,靈活的視窗,這些功能對於得出無窮資料集的精確結果是很重要的。
Flink 保證狀態化計算強一致性。”狀態化“意味著應用可以維護隨著時間推移已經產生的資料聚合或者,並且 Filnk 的檢查點機制在一次失敗的事件中一個應用狀態的強一致性。
Flink 支援流式計算和帶有事件時間語義的視窗。事件時間機制使得那些事件無序到達甚至延遲到達的資料流能夠計算出精確的結果。
除了提供資料驅動的視窗外,Flink 還支援基於時間,計數,session 等的靈活視窗。視窗能夠用靈活的觸發條件定製化從而達到對複雜的流傳輸模式的支援。Flink 的視窗使得模擬真實的建立資料的環境成為可能。
Flink 的容錯能力是輕量級的,允許系統保持高併發,同時在相同時間內提供強一致性保證。Flink 以零資料丟失的方式從故障中恢復,但沒有考慮可靠性和延遲之間的折衷。
Flink 能滿足高併發和低延遲(計算大量資料很快)。下圖顯示了 Apache Flink 與 Apache Storm 在完成流資料清洗的分散式任務的效能對比。
Flink 儲存點提供了一個狀態化的版本機制,使得能以無丟失狀態和最短停機時間的方式更新應用或者回退歷史資料。
Flink 被設計成能用上千個點在大規模叢集上執行。除了支援獨立叢集部署外,Flink 還支援 YARN 和Mesos 方式部署。
Flink 的程式內在是並行和分散式的,資料流可以被分割槽成
stream partitions
,operators 被劃分為operator subtasks; 這些 subtasks 在不同的機器或容器中分不同的執行緒獨立執行;operator subtasks 的數量在具體的 operator 就是平行計算數,程式不同的 operator 階段可能有不同的並行數;如下圖所示,source operator 的並行數為 2,但最後的 sink operator 為1;
自己的記憶體管理
Flink 在 JVM 中提供了自己的記憶體管理,使其獨立於 Java 的預設垃圾收集器。 它透過使用雜湊,索引,快取和排序有效地進行記憶體管理。
豐富的庫
Flink 擁有豐富的庫來進行機器學習,圖形處理,關係資料處理等。 由於其架構,很容易執行復雜的事件處理和警報。
分散式執行
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 上可用的任務槽決定。 每個任務代表分配給任務槽的一組資源。 例如,如果 Task Manager 有四個插槽,那麼它將為每個插槽分配 25% 的記憶體。 可以在任務槽中執行一個或多個執行緒。 同一插槽中的執行緒共享相同的 JVM。 同一 JVM 中的任務共享 TCP 連線和心跳訊息。Task Manager 的一個 Slot 代表一個可用執行緒,該執行緒具有固定的記憶體,注意 Slot 只對記憶體隔離,沒有對 CPU 隔離。預設情況下,Flink 允許子任務共享 Slot,即使它們是不同 task 的 subtask,只要它們來自相同的 job。這種共享可以有更好的資源利用率。
最後
Flink 是未來的趨勢。