大數據(二)flink 1 概念介紹

Flink介紹:

Apache Flink是一個框架和分佈式處理引擎,用於對無界和有界數據流進行有狀態計算。

2015年升級爲Apache的頂級項目,然後突然爆發,之後被阿里收購。

基本上國內說得出名字的大廠都在用flink。

Flink特點:

1,事件驅動:

     根據數據的到來觸發一系列的計算,輸出等。

2,流處理和批處理

     批處理的特點就是 有界,持久,量大,非常適合做離線計算

     流處理的特點就是 無界,實時,無需針對整個數據集執行操作,而是對傳輸過來的

每個數據項執行操作,一般用戶實時計算

 

無界數據流無界數據流有一個開始但是沒有結束,它們不會在生成時終止並提供數據,必須連續處理無界流,也就是說必須在獲取後立即處理event。對於無界數據流我們無法等待所有數據都到達,因爲輸入是無界的,並且在任何時間點都不會完成。處理無界數據通常要求以特定順序(例如事件發生的順序)獲取event,以便能夠推斷結果完整性。

有界數據流有界數據流有明確定義的開始和結束,可以在執行任何計算之前通過獲取所有數據來處理有界流,處理有界流不需要有序獲取,因爲可以始終對有界數據集進行排序,有界流的處理也稱爲批處理。

 

Flink分層api

分別是ProcessFunction,DataStream Api,SQL/Table Api,

最底層的是ProcessFunction,功能最強大,但也最複雜。

一般我們操作的都是DataStream這一層來處理數據,實在不行就嵌入ProcessFunction層。

DataStream Api提供了很多模塊因子,比如由用戶定義的多種形式的轉換(transformations),連接(joins),聚合(aggregations),窗口操作(windows)

Table API 是以表爲中心的聲明式編程,其中表可能會動態變化(在表達流數據時)

像阿里Flink的分支 blink 就是往這方面發展,Blink比起Flink的優勢就是對SQL語法的更完善的支持以及執行SQL的性能提升。

未來以後可能大量的開發就落在Table API 這層咯。

支持exactly-once語義

這個特性就是確保一條數據,收並且只能收到一次。這個就能保證結果的準確性。

Flink架構組成

Flink其實跟flume差不多,主要是是3部分,flume是 source -> channal -> sink

             flink 也是 source -> operator -> sick

   flink通過source 接受數據,source 可以是配多種多樣,不過生成上大部分都是用kafka.

  因爲前面說了,flink是事件驅動型,當source監聽kafka的數據後,會向flink的jobManager

提交job,jobManage會根據job等資源優化後就會分配Taskmanager,Taskmanager是真正計算的地方,它會通過一系列的

計算因子,最後將結果返回給jobManage,再返回給flink客戶端。

 

Worker與Slots

每一個worker(TaskManager)是一個JVM進程,它可能會在獨立的線程上執行一個或多個subtask。爲了控制一個worker能接收多少個task,worker通過task slot來進行控制(一個worker至少有一個task slot)。·

每個task slot表示TaskManager擁有資源的一個固定大小的子集。假如一個TaskManager有三個slot,那麼它會將其管理的內存分成三份給各個slot。資源slot化意味着一個subtask將不需要跟來自其他jobsubtask競爭被管理的內存,取而代之的是它將擁有一定數量的內存儲備。需要注意的是,這裏不會涉及到CPU的隔離,slot目前僅僅用來隔離task的受管理的內存。

通過調整task slot的數量,允許用戶定義subtask之間如何互相隔離。如果一個TaskManager一個slot,那將意味着每個task group運行在獨立的JVM中(該JVM可能是通過一個特定的容器啓動的),而一個TaskManager多個slot意味着更多的subtask可以共享同一個JVM。而在同一個JVM進程中的task將共享TCP連接(基於多路複用)和心跳消息。它們也可能共享數據集和數據結構,因此這減少了每個task的負載。

圖 TaskManager與Slot

Task Slot是靜態的概念,是指TaskManager具有的併發執行能力,可以通過參數taskmanager.numberOfTaskSlots進行配置,而並行度parallelism是動態概念,即TaskManager運行程序時實際使用的併發能力,可以通過參數parallelism.default進行配置。

也就是說,假設一共有3個TaskManager,每一個TaskManager中的分配3個TaskSlot,也就是每個TaskManager可以接收3個task,一共9個TaskSlot,如果我們設置parallelism.default=1,即運行程序默認的並行度爲1,9個TaskSlot只用了1個,有8個空閒,因此,設置合適的並行度才能提高效率

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章