Flink中的一些核心概念
在原始碼解讀前我們有必要先了解一下Flink的一些基本的但卻很關鍵的概念。這有助於幫助我們理解整個架構。在翻譯文件的同時,對於有爭議的或者不是非常適合用中文表達的地方,我儘量保留原始英文單詞。
程式和資料流
Flink程式的基本構建塊是streams
和transformations
(注意,DataSet在內部也是一個stream)。一個stream
可以看成一箇中間結果,而一個transformations
是以一個或多個stream作為輸入的某種operation,該operation利用這些stream進行計算從而產生一個或多個result stream
。
在執行時,Flink上執行的程式會被對映成streaming dataflows
streams
和transformations operators
。每一個dataflow以一個或多個sources開始以一個或多個sinks結束。dataflow類似於任意的有向無環圖(DAG),當然特定形式的環可以通過iteration構建。在大部分情況下,程式中的transformations
跟dataflow中的operator
是一一對應的關係。但有時候,一個transformation
可能對應多個operator
。
並行資料流
程式在Flink內部的執行具有並行
、分散式
的特性。stream被分割成stream partition
,operator被分割成operator subtask
一個特定operator的subtask的個數被稱之為其parallelism
(並行度)。一個stream的並行度總是等同於其producing operator
的並行度。一個程式中,不同的operator可能具有不同的並行度。
Stream在operator之間傳輸資料的形式可以是one-to-one(forwarding)的模式也可以是redistributing的模式。
- One-to-one : strem(比如在source和map operator之間)維護著分割槽以及元素的順序。那意味著map operator的subtask看到的元素的個數以及順序跟source operator的subtask生產的元素的個數、順序相同。
- Redistributing : stream(map()跟keyBy/window之間或者keyBy/window跟sink之間)的分割槽會發生改變。每一個operator subtask依據所選擇的transformation傳送資料到不同的目標subtask。例如,keyBy() (基於hash碼重分割槽),broadcast()或者rebalance()(隨機redistribution)。在一個redistribution的交換中,只有每一個傳送、接收task對的順序才會被維持(比如map()的subtask和keyBy/window的subtask)。
tasks & operator chains
出於分散式執行的目的,Flink將operator的subtask連結在一起形成task。每個task在一個執行緒中執行。將operators連結成task是非常有效的優化:它能減少執行緒之間的切換和基於快取區的資料交換,在減少時延的同時提升吞吐量。連結的行為可以在程式設計API中進行指定。
下面這幅圖,展示了5個subtask以5個並行的執行緒來執行。
分散式執行
Master,Worker,Client
Flink執行時包含了兩種型別的處理器:
- master處理器:也稱之為JobManagers用於協調分散式執行。它們用來排程task,協調檢查點,協調失敗時恢復等。
Flink執行時至少存在一個master處理器。一個高可用的執行模式會存在多個master處理器,它們其中有一個是leader,而其他的都是standby。
- worker處理器:也稱之為TaskManagers用於執行一個dataflow的task(或者特殊的subtask)、資料緩衝和data stream的交換。
Flink執行時至少會存在一個worker處理器。
master和worker處理器可以以如下方式中的任意一種啟動:直接在物理機上啟動,通過容器,或者通過像YARN這樣的資源排程框架。worker連線到master,告知自身的可用性進而獲得任務分配。
客戶端不是執行時和程式執行的一部分。但它用於準備併發送dataflow給master。然後,客戶端斷開連線或者維持連線以等待接收計算結果。客戶端可以以兩種方式執行:要麼作為Java/Scala程式的一部分被程式觸發執行,要麼以命令列./bin/flink run
的方式執行。
Workers,Slots,Resources
每一個worker(TaskManager)是一個JVM程序,它可能會在獨立的執行緒上執行一個或多個subtask。為了控制一個worker能接收多少個task。worker通過task slot來進行控制(一個worker至少有一個task slot)。
每個task slot表示TaskManager擁有資源的一個固定大小的子集。假如一個TaskManager有三個slot,那麼它會將其管理的記憶體分成三份給各個slot。資源slot化意味著一個subtask將不需要跟來自其他job的subtask競爭被管理的記憶體,取而代之的是它將擁有一定數量的記憶體儲備。需要注意的是,這裡不會涉及到CPU的隔離,slot目前僅僅用來隔離task的受管理的記憶體。
通過調整task slot的數量,允許使用者定義subtask之間如何互相隔離。如果一個TaskManager一個slot,那將意味著每個task group執行在獨立的JVM中(該JVM可能是通過一個特定的容器啟動的)。而一個TaskManager多個slot意味著更多的subtask可以共享同一個JVM。而在同一個JVM程序中的task將共享TCP連線(基於多路複用)和心跳訊息。它們也可能共享資料集和資料結構,因此這減少了每個task的負載。
預設,如果subtask是來自相同job,但不是相同的task,Flink允許subtask共享slot。結果是,一個slot可能hold住該job的整個pipeline。允許slot共享有兩個好處:
- Flink叢集確實需要許多task slots來讓Job達到最高的並行度。不需要計算一個程式總共包含多少個task。
- 更容易獲得更好的資源利用。如果沒有slot共享,非密集型的source/map()的subtask將阻塞跟密集型的window的subtask一樣多的佔用資源。而如果有slot共享,基本的併發度通過完整地利用共享的slot資源將獲得2到6倍的提升,同時仍然保證每一個TaskManager會在任務繁重的subtask之間進行合理的slot共享。
slot共享行為可以通過API來控制,以防止不合理的共享。這個機制稱之為resource groups,它定義了subtask可能共享的slot是什麼資源。
作為一個約定俗成的規則,task slot推薦的預設值是CPU的核數。基於超執行緒技術,每個slot佔用兩個或者更多的實際執行緒上下文。
時間和視窗
聚合事件(比如count,sum)工作起來比起批處理略微有些不同。例如,它不能一次完成對流中所有元素的數量統計,然後返回結果。因為流通常都是無限的(無邊界)。取而代之的是,在流上的聚合(count,sum等)被隔離到window域中,比如,“統計最近5分鐘的數量”或“對最近100個元素求和”。
視窗可以是時間驅動的(比如,每30秒)也可以是資料驅動的(比如,每100個元素)。通常我們將視窗劃分為:tumbing windows(不重疊),sliding windows(有重疊)和session windows(有空隙的活動)。
時間
當在流式程式設計中涉及到時間的(比如定義一個視窗),可能會牽扯到時間的不同定義:
- Event Time:指一個事件的建立時間。通常在event中用時間戳來描述,比如,可能是由生產事件的感測器或生產服務來附加。Flink訪問事件時間戳通過時間戳分配器。
- Ingestion time:指一個事件從source operator進入Flink dataflow的時間。
- Processing time:每一個執行一個基於時間操作的operator的本地時間。
狀態和失敗容忍
在dataflow中的許多操作一次只關注一個獨立的事件(比如一個事件解析器),還有一些操作能記住多個獨立事件的資訊(比如,window operator),而這些操作被稱為stateful(有狀態的)。
有狀態的操作,其狀態被維護的地方,可以將其看作是一個內嵌的key/value儲存器。狀態和流一起被嚴格得分割槽和分佈以供有狀態的operator讀取。因此,訪問key/value的狀態僅能在keyed streams中(在執行keyBy()函式之後產生keyed stream),並且只能根據當前事件的鍵來訪問其值。對齊stream的鍵和狀態可以確保所有的狀態更新都是本地操作,在不需要事務開銷的情況下保證一致性。這個對齊機制也允許Flink重新分佈狀態並顯式調整stream的分割槽。
用於失敗容忍的檢查點
Flink實現失敗容忍使用了流重放和檢查點的混合機制。一個檢查點會在流和狀態中定義一個一致點,在該一致點streaming dataflow可以恢復並維持一致性(exactly-once的處理語義)。在最新的檢查點之後的事件或狀態更新將在input stream中被重放。
檢查點的設定間隔意味著在執行時對失敗容忍產生的額外開銷以及恢復時間(也決定了需要被重放的事件數)。
狀態的最終儲存
給key/value構建索引的資料結構最終被儲存的地方取決於狀態最終儲存的選擇。其中一個選擇是在記憶體中基於hash map,另一個是RocksDB。另外用來定義Hold住這些狀態的資料結構,狀態的最終儲存也實現了基於時間點的快照機制,給key/value做快照,並將快照作為檢查點的一部分來儲存。
基於流的批處理
Flink執行批處理程式是將其作為流處理程式的一個特例來看待。它將其看作有界的流(有限數量的元素)。DataSet
在內部被當作一個流資料,因此上面的這些適用於流處理的這些概念在批處理中同樣適用,只有很少的幾個例外:
- DataSet的程式設計API不適用檢查點。恢復機制是通過重放完整的流資料來進行。那是合理的,因為輸入時有界的。它將開銷更多地引入到恢復操作上,但另一方面也使得執行時的常規流程代價更低,因為它規避了檢查點機制。
- DataSet的有狀態的operation API簡單地使用in-memory/out-of-core的資料結構,而不是基於key/value的索引機制
- DataSet的API引進了獨特的同步迭代機制(基於superstep),它僅在有界的流中存在。
微信掃描關注公眾號:Apache_Flink
相關推薦
Flink中的一些核心概念
在原始碼解讀前我們有必要先了解一下Flink的一些基本的但卻很關鍵的概念。這有助於幫助我們理解整個架構。在翻譯文件的同時,對於有爭議的或者不是非常適合用中文表達的地方,我儘量保留原始英文單詞。 程式和資料流 Flink程式的基本構建塊是strea
資料倉庫中的一些核心概念
1、什麼是資料倉庫 資料倉庫技術是隨著人們對大型資料庫系統研究的不斷深入,在傳統資料庫技術基礎之上發展而來的,其主要目的就是為決策提供支援,為OLAP、資料探勘深層次的分析提供平臺。 資料倉庫是一個和實際應用密不可分的研究領域,與傳統資
Hadoop中一些重要概念簡要總結
分享圖片 quest 文件映射 node hadoop 計算機 index hdf 分布式協調 Hadoop是一個利用大規模計算機集群,可處理大量數據的分布式並行框架。 Hadoop 官網 Hadoop的核心設計包括HDFS和MapReduce。 HDFS HDFS(Had
面試中一些基本概念的辨析
第一問 const與#define相比有什麼不同? 答案: 1.const定義的只讀變數在程式執行過程中只有一份拷貝(因為它是全域性的只讀變數,存放在靜態區),而#define定義的巨集常量在記憶體中
RocketMQ 一些核心概念
Topic:主題,是生產者傳送的訊息和消費者拉取的訊息的規類。Topic與生產者和消費者都是非常鬆散的關係,一個topic可以有0個或者1個或者多個生產者向其傳送訊息,換句話說,一個生產者可以同時向不同和topic傳送訊息。從消費者的解度來說,一個topic可能被0個或者一個或者多個消費組訂閱,類似的,一個消
C++中一些重要概念區別
指標和引用的比較(p171)雖然使用引用(reference)和指標都可間接訪問另一個值,但它們之間有兩個重要區別。 第一個區別在於引用總是指向某個物件:定義引用時沒有初始化是錯誤的。 第二個重要區別則是賦值行為的差異:給引用賦值修改的是該引用所關聯的物件的值,而並不是使引
前端開發中一些容易混淆的概念匯總
提交表單 容易 html text bmi blog 技術分享 mit script ★:HTML中,按鈕button與submit區別是什麽? 1,button 定義可點擊按鈕(多數情況下,用於通過 JavaScript 啟動腳本)。 2,submit 定
從經典架構項目中透析微服務架構的核心概念和充血模型
java 架構 微服務 微服務架構和SOA區別 微服務現在辣麽火,業界流行的對比的卻都是所謂的Monolithic單體應用,而大量的系統在十幾年前都是已經是分布式系統了,那麽微服務作為新的理念和原來的分布式系統,或者說SOA(面向服務架構)是什麽區別呢? 我們先看相同點: 需要Registry,實
Elasticsearch中的一些基本概念
索引詞(term) 在Elasticsearch中索引詞(term)是一個能夠被索引的精確值。foo,Foo Foo幾個單詞是不相同的索引詞。索引詞(term)是可以通過term查詢進行準確的搜尋。 文字(text) 文字是一段普通的非結構化文字,通常,文字會被分析稱一個個的索引詞,儲存在E
Jmeter中一些概念的理解——90%響應時間、事務、併發
一、90%響應時間(參考蟲師部落格) 90%Line 一組數由小到大進行排列,找到他的第90%個數(假如是12),那麼這個陣列中有90%的數將小於等於12 。 用在效能測試的響應時間,也就是90%請求響應時間不會超過12 秒。 例如: 某一次測試結果,每個sample
學習深度學習--深度學習中的一些基本概念
人類一直沒有停止過探索世界的腳步,從古至今,我們一直渴望著能夠找到一種方法能夠預測未來,解決人類生存最原始的焦慮,從伏羲八卦到現代自然科學,無不在通過對自然界的觀察和各種資料中提取規則,希望能夠應對各種不確定性。在這過程中出現了數學、統計學、概率論、資訊理論、模式識別等等學科,用來解釋自然的規律,
Python中的面向物件程式設計的一些基本概念總結
一、一些專有詞彙的定義 面對物件程式設計(OOP:object oriented programming): 是一種程式設計範型,同時也是一種程式開發的方法,實現OOP的程式希望能夠在程式中包含各種獨立而又相互呼叫的物件,沒一個物件又都應該能夠接受資料、資料處理並將
C++ 11中的一些典型概念與分析
相比傳統的C++98與C++03, C++11中新提出了很多新的概念,本文根據C++佈道師Scott Meyers 在Youtube上的培訓視訊展開,介紹C++11中的一些典型概念,並進行分析。 1. 左值(lvalue)與右值(rvalue) C++11之前已
CCNA中的一些基礎概念(有待補充)
CCNA中的一些基礎概念(有待補充) 網路:網路是網路連線裝置通過傳輸介質與終端連線進行資訊交換與資源共享的工具。 OSI七層參考模型:物數網傳會表應 應用層:通過人機互動來實現各種各樣的服務 表示層:編碼,解碼 加密解密 會話層:發現 建立維持 終止會話 /以上三層面向用戶服務 傳輸層
機器學習方法中的一些基本概念
輸入空間、特徵空間和輸出空間 監督學習中,將輸入與輸出所有可能取值的集合稱為輸入空間與輸出空間。 輸入與輸出空間可以是有限集合,也可以是整個歐式空間;二者可以是同一個空間,也可以是不同的空間;通常情況下,輸出空間遠小於輸入空間。 每個具體輸入是一個例項,由特徵向量來表示,所有特徵向量存在
網路通訊中的一些基本概念
以下內容摘抄自網路 IP(網際協議) 網際網路協議地址,常見的有IPv4和IPv6兩大類。 IP協議三個定義: 1.IP定義了在TCP/IP網際網路上資料傳送的基本單元和資料格式。 2.IP軟體完成路由選擇功能,選擇資料傳送的路徑。 3.IP包含了一組不可靠分組
Shiro框架中有三個核心概念:Subject ,SecurityManager和Realms。
2.1.2 SecurityManagerSubject的“幕後”推手是SecurityManager。Subject代表了當前使用者的安全操作,SecurityManager則管理所有使用者的安全操作。它是Shiro框架的核心,充當“保護傘”,引用了多個內部巢狀安全元件,它們形成了物件圖。但是,一旦S
5G毫米波通訊中一些量化的概念
1、5G的價值在於它擁有比4G LTE更快的速度(峰值速率可達幾十Gbps)。 2、無線傳輸增加傳輸速率一般有兩種方法,一是增加頻譜利用率,二是增加頻譜頻寬。 5G使用毫米波(26.5~300GHz)就是通過第二種方法來提升速率,以28GHz頻段為例,其可用頻譜頻寬達到了
Apache Flink:流處理中Window的概念
Apache Flink–DataStream–Window 什麼是Window?有哪些用途? 下面我們結合一個現實的例子來說明。 我們先提出一個問題:統計經過某紅綠燈的汽車數量之和? 假設在一個紅綠燈處,我們每隔15秒統計一次通過此紅綠燈的汽車數量,如下圖: 可