什麼是Flink數據庫
Apache Flink是一個分佈式大數據處理引擎,能夠對有限數據流和無限數據流進行有狀態計算。可部署在各類集羣環境,對各類大小的數據規模進行快速計算。編程
Flink特性緩存
Flink體系架構網絡
Flink運行時主要由JobManager和TaskManager兩個組件組成,Flink架構也遵循主從架構設計原則,JobManager爲Master節點,TaskManager爲Worker節點。全部組件之間的通訊是經過Akka完成,包括任務的狀態以及Checkpoint觸發等信息。架構
JobManager app
JobManager是Flink主從架構中的Master。框架
JobManager負責分佈式任務管理,如任務調度、檢查點、故障恢復等。在高可用分佈式部署時,系統中能夠有多個JobManager,可是隻有一個Leader,其餘都是Standby。機器學習
TaskManager 分佈式
TaskManager是Flink主從架構中的worker。性能
TaskManager負責具體的任務執行和對應任務在每一個節點上的資源申請與管理。Flink在運行時至少會存在一個TaskManager。每一個TaskManager負責管理其所在節點上的資源信息,如內存、磁盤、網絡,在啓動的時候會將資源的狀態彙報給JobManager。
TaskManager是在JVM中的一個或多個線程中執行任務的工做節點。任務執行的並行度由每一個TaskManager上可用的任務槽決定。每一個任務表明分給任務槽的一組資源。能夠在任務槽中運行一個或多個線程。同一個插槽中的線程共享相同的JVM。同一JVM中的任務共享TCP鏈接和心跳消息。TaskManager的一個slot表明一個可用線程,該線程具備固定的內存。Flink容許子任務共享Slot,即便它們是不一樣的task的subtask,只要它們來自相同的job就能夠。這種共享能夠更好的利用資源。
Client
當用戶提交一個Flink程序時,會首先建立一個Client,該Client首先會對用戶提交的Flink程序進行預處理,並提交到Flink集羣中處理,因此Client須要從用戶提交的Flink程序配置中獲取JobManager的地址,並創建到JobManager的鏈接,將Flink Job提交給JobManager,Client會將用戶提交的Flink程序組裝成一個JobGraph,而且是以JobGraph的形式提交。一個JobGraph是一個Flink Dataflow,它是由多個JobVertex組成的DAG。其中,一個JobGraph包含了一個Flink程序的以下信息:JobID、Job名稱、配置信息、一組JobVertex等。
客戶端經過將編寫好的Flink應用編譯打包,提交到JobManager,而後JobManager會根據已經註冊在JobManager中TaskManager的資源狀況,將任務分配給有資源的TaskManager節點,而後啓動並與運行任務。TaskManager從JobManager接收須要部署的任務,而後使用Slot資源啓動Task,創建數據接入的網絡鏈接,接收數據並開始數據處理。同時TaskManager之間的數據交互都是經過數據流的方式進行的。
Flink組件棧
Flink是一個分層架構的系統,每一層所包含的組件都提供了特定的抽象,用來服務於上層組件。Flink分層的組件棧以下圖所示:
Deployment層
Deployment層主要涉及了Flink的部署模式,Flink支持多種部署模式:
Runtime層
Runtime層提供了支持Flink計算的所有核心實現,如:
API層
API層主要實現了面向無界Stream的流出來和麪向Batch的批處理API。
其中面向流處理對應DataStream API,面向批處理對應DataSet API。
Libraries層
Libraries層也能夠稱爲Flink應用框架層,根據API層的劃分,在API層上構建的知足特定應用的實現計算框架,也分別對應於面向流處理和麪向批處理兩類。
Flink編程模型
流處理與批處理
在大數據領域,批處理任務與流處理任務通常被認爲是兩種不一樣的任務,一個大數據框架通常會被設計爲只能處理其中一種任務。例如Storm只支持流處理任務,而MapReduce、Spark支持吃批處理任務。Spark Streaming是Spark之上支持流處理任務的子系統,看似是一個特例,其實Spark Streaming採用的是micro-batch的架構,即把輸入的數據流切分紅細粒度的batch,併爲每個batch數據提交一個批處理的Spark任務,因此Spark Streaming本質上仍是基於Spark批處理系統對流式數據進行處理,和Storm等徹底流式的數據處理方式徹底不一樣。
Flink經過靈活的執行引擎,可以同時支持批處理和流處理任務。
在執行引擎這一層,流處理系統與批處理系統最大的不一樣在於節點間的數據傳輸方式。
這兩種數據傳輸模式是兩個極端,對應的是流處理系統對低延遲的要求和批處理系統對高吞吐的要求。
Flink的執行引擎採用了一種十分靈活的方式,同時支持了這兩種數據傳輸模型。
Flink以固定的緩存塊爲單位進行網絡數據傳輸,用戶能夠經過設置緩存塊超時值指定緩存塊的傳輸時機。
Flink編程接口
Flink根據數據及類型的不一樣將數據處理結構分爲兩大類:
Flink將數據處理接口抽象成四層:
Flink程序結構
下面看下scala寫的Flink wordcount例子:
// 配置執行環境
val env = ExecutionEnvironment.getExecutionEnvironment
// 指定數據源地址,讀取輸入數據
val text = env.readTextFile("/path/to/file")
// 對數據集指定轉換操做邏輯
val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }
.map { (_, 1) }
.groupBy(0)
.sum(1)
// 指定計算結果輸出位置
counts.writeAsCsv(outputPath, "\n", " ")
// 指定名稱並處罰流式任務
env.execute("Flink WordCount")
從上面能夠看出,Flink應用程序基本包含如下5個步驟:
Flink程序與數據流
Flink程序是由Stream和Transformation這兩個基本構建塊組成,其中Stream是一箇中間結果數據,而Transformation是一個操做,它對一個或多個輸出Stream進行計算處理,輸出一個或多個結果Stream。
當一個Flink程序被執行的時候,它會映射爲Streaming Dataflow。
一個Streaming Dataflow是由一組Stream和Transformation Operator組成,相似一個DAG圖,在啓動的時候從一個或多個Source Operator開始,結束於一個或多個Sink Operator。
一個由Flink程序映射爲Streaming Dataflow的示意圖,以下所示:
FlinkKafkaConsumer是一個Source Operator
map、keyBy、timeWindow、apply是Transformation Operator
RollingSink是一個Sink Operator
Flink應用場景分析