流式框架,同時支持低延遲、高吞吐、Exactly-once的只有Apache Flink。數據庫
實時數據處理愈來愈重要,流式數據處理有着更高的處理效率和成本控制能力。Flink在德語中意味着快速和靈敏,用來體現流式數據處理器速度快和靈活性強等特色。Apache是流式框架中同時支持低延遲、高吞吐、Exactly-once的,同時提供了基於流式計算引擎處理批量數據的計算能力,真正意義上實現了批流統一,同時隨着阿里Blind的開源,極大地加強了Flink對批量計算領域的支持,編程
傳統的關係型數據存儲架構,逐步演化爲分佈式處理和存儲的架構。windows
主要基於集中式的關係型數據庫實現存儲,大多數將架構分爲計算層和存儲層。微服務架構將系統數據源拆分,解決了業務系統擴展的問題,可是業務數據國語分散在不一樣的系統中,很難將數據進行集中化管理,對於企業內部進行數據分析或者數據挖掘之類的應用則須要經過從不一樣的數據庫進行數據抽取,將數據從數據庫中週期性同步到數據倉庫中,而後再數據倉庫中進行數據的抽取、轉換、加載(ETL),從而構建成不一樣的數據集和應用,提供給業務系統使用。數組
圖-大數據實時處理架構網絡
Lamada架構支持處理不一樣類型的數據,包含支持批量計算的Batch Layer和實時計算的Speed Layer,經過在一套平臺中將批計算和流計算整合在一塊兒,可是這種架構由於框架太多仍然存在平臺複雜度和運維成本較高的問題。數據結構
圖-有狀態流計算架構架構
企業基於實時的流式數據,維護全部計算過程的狀態,所謂狀態就是計算過程當中產生的中間結果,每次計算新的數據進入到流式系統中都是基於中間狀態結果的基礎上進行計算,最終產生正確的中間結果。基於有狀態計算方式的最大優點是不須要將原始數據從外部系統中拿出來,避免進行全量計算,對比批量計算,實時計算能夠在很短的時間內統計出結果。框架
能夠看出有狀態流計算會逐步成爲企業做爲構建數據平臺的架構模式。Flink經過實現Google DataFlow流式計算模型實現了高吞吐、低延遲、高性能且兼具實時流式計算框架,同時支持高度容錯的狀態管理。運維
Apache Flink同時支持如下特性:分佈式
圖-Flink分層架構
有界數據集,具備時間邊界,批計算處理;無界數據集,沒有邊界,持續不斷產生新的數據,流式數據處理。兩者是相對概念,主要根據時間的範圍而定,能夠認爲一段時間內的無界數據集實際上是有界數據集,同時有界數據也能夠經過一些方法轉換爲無界數據,有界數據和無界數據實際上是能夠相互轉換的,對於不一樣的數據類型能夠進行統一的處理,Apache Spark和Flink同時支持流式計算和批量計算。
核心數據處理接口,支持批計算的接口DataSet API,支持流計算的DataStream API
圖-Flink接口分層與抽象
設定Flink執行環境、建立和加載數據集、對數據集指定轉換操做邏輯、指定計算結果輸出位置、調用execute方法觸發程序執行。
圖-示例Flink程序WordCount
數據類型的描述信息都是由TypeInformation定義,比較經常使用的有BasicTypeInfo、TupleTypeInfo、CaseClassTypeInfo、PojoTypeInfo
BasicTypeInfo:支持任意Java原生數據類型,數組BasicTypeInfo
Java Tuples類型:固定長度固定類型,不支持空值存儲
POJO類型:複雜數據結構的定義
Flink Value類型:序列化與反序列化
特殊數據類型:Types Hmt
一般狀況下Flink都能正常進行數據類型判斷,並選擇合適的serializers以及comparators,可是在某些狀況下沒法獲取,例如JVM泛型擦除。
反射機制儘量重構類型信息,類型提示(Ctype Himts),TypeHint指定輸出參數類型
自定義TypeInformation
基於Google提出的DataFlow模型,實現了支持原生數據流處理的計算引擎。API主要分爲三個部分:
DataSourc模塊,數據接入功能,主要是將各類外部數據接入到Flink系統,並將接入的數據轉換成對應的DataStream數據集
Transformation模塊,定義了對DataStream數據集的各類轉換操做,例如map、reduce、windows等操做
DataSink模塊,將結果數據寫出到外部存儲介質中,如文件或者Kafka中間件
內置數據源,包括文件、Socket網絡端口以及集合類型數據;第三方數據源,定義了Flink和外部系統數據交互的邏輯,包括數據的讀寫接口,Flink定義了豐富的第三方數據源鏈接器(Connector),例如Kafka Connector、ES Connector以及自定義第三方數據源Connector。
即經過一個或多個DataStream生成新的DataStream的過程稱爲Transformation,在轉換過程當中,每種操做類型被定義爲不一樣的Operator,Flink可以將多個Transformation組成一個DataFlow的拓撲。DataStream的轉換操做能夠分爲Single-DataStream、Multi-DataStream、物理分區三類類型。
Map(DataStream->DataStream)、FlatMap(DataStream->DataStream)、Filter(DataStream->DataStream)、KeyBy(DataStream->KeyedStream)、Reduce(KeyedStream->DataStream)、Aggregations(KeyedStream->DataStream)
Union(DataStream->DataStream)、Connect/CoMap/CoFlatMap(DataStream->DataStream)、Split(DataStream->SplitStream)、Select(SplitStream->DataStream)、Iterate(DataStream->IterativeStream->DataStream)
根據指定的分區策略將數據從新分配到不一樣節點的task案例上執行,隨機分區、平衡分區、按比例分區等
文件輸出、客戶端輸出、Socket網絡端口、
如Kafka、Cassandra、Kinesis、ES、HDFS、NIFI等。DataSink類操做算子專門處理數據的輸出,全部的數據輸出均可以基於實現SinkFunction完成定義,如FlinkKafkaProducer。
三種時間概念:
事件生成時間(Event time)、時間接入時間(Ingestion Time)和事件處理時間(Processing Time)