Flink原理、實戰與性能優化

流式框架,同時支持低延遲、高吞吐、Exactly-once的只有Apache Flink。數據庫

1. Apache Flink介紹

1.1 Apache Flink是什麼?

實時數據處理愈來愈重要,流式數據處理有着更高的處理效率和成本控制能力。Flink在德語中意味着快速和靈敏,用來體現流式數據處理器速度快和靈活性強等特色。Apache是流式框架中同時支持低延遲、高吞吐、Exactly-once的,同時提供了基於流式計算引擎處理批量數據的計算能力,真正意義上實現了批流統一,同時隨着阿里Blind的開源,極大地加強了Flink對批量計算領域的支持,編程

1.2 數據架構的演變

傳統的關係型數據存儲架構,逐步演化爲分佈式處理和存儲的架構。windows

1.2.1 傳統數據基礎架構

主要基於集中式的關係型數據庫實現存儲,大多數將架構分爲計算層和存儲層。微服務架構將系統數據源拆分,解決了業務系統擴展的問題,可是業務數據國語分散在不一樣的系統中,很難將數據進行集中化管理,對於企業內部進行數據分析或者數據挖掘之類的應用則須要經過從不一樣的數據庫進行數據抽取,將數據從數據庫中週期性同步到數據倉庫中,而後再數據倉庫中進行數據的抽取、轉換、加載(ETL),從而構建成不一樣的數據集和應用,提供給業務系統使用。數組

1.2.2 大數據數據架構

                                

                                                              圖-大數據實時處理架構網絡

Lamada架構支持處理不一樣類型的數據,包含支持批量計算的Batch Layer和實時計算的Speed Layer,經過在一套平臺中將批計算和流計算整合在一塊兒,可是這種架構由於框架太多仍然存在平臺複雜度和運維成本較高的問題。數據結構

1.2.3 有狀態流計算架構

                                                

                                                             圖-有狀態流計算架構架構

企業基於實時的流式數據,維護全部計算過程的狀態,所謂狀態就是計算過程當中產生的中間結果,每次計算新的數據進入到流式系統中都是基於中間狀態結果的基礎上進行計算,最終產生正確的中間結果。基於有狀態計算方式的最大優點是不須要將原始數據從外部系統中拿出來,避免進行全量計算,對比批量計算,實時計算能夠在很短的時間內統計出結果。框架

1.2.4 爲何會是Flink?

能夠看出有狀態流計算會逐步成爲企業做爲構建數據平臺的架構模式。Flink經過實現Google DataFlow流式計算模型實現了高吞吐、低延遲、高性能且兼具實時流式計算框架,同時支持高度容錯的狀態管理。運維

Apache Flink同時支持如下特性:分佈式

  • 同時支持高吞吐、低延遲、高性能,且目前惟一支持,Storm不支持高吞吐的要求
  • 支持事件時間(Event time)的概念,使用事件產生的時間,使得即便亂序,流系統也能計算出正確的結果,保持事件本來產生時的有序性,儘量避免網絡傳輸或者硬件系統的影響
  • 支持有狀態流式計算,將算子中間結果保存在內存或者文件系統中,極大提高系統性能,下降資源消耗
  • 支持高度靈活的窗口(Window)機制,經過窗口的方式對流數據進行必定範圍的聚合計算
  • 基於輕量級分佈式快照(Snapshot)實現的容錯,基於分佈式快照技術的Checkpoints,將執行過程當中的狀態信息進行持久化存儲,支持任務異常時候的自動恢復,確保數據在處理過程當中的一致性
  • 基於JVM實現獨立的內存管理,序列化/反序列化方式減小數據存儲大小,下降GC帶來的性能影響
  • 支持保存點(Save Points),將任務執行的快照保存在存儲介質上,便於更好的管理和運維流式應用

1.3 Flink運用場景

  • 實時智能推薦,經過Flink流計算構建更加實時的智能推薦系統,對用戶行爲指標進行實時計算,對模型進行實時更新,對用戶指標進行實時預測,並將預測的信息推送到Web/App端。
  • 復瑣事件處理,藉助Flink CEP(復瑣事件處理)
  • 實時欺詐檢測
  • 實時數倉和ETL
  • 流數據分析
  • 實時報表分析,天貓雙十一大屏

1.4 Flink基本架構

                                                  

                                                                         圖-Flink分層架構

2. 環境準備

3. Flink編程模型

3.1 數據集類型

有界數據集,具備時間邊界,批計算處理;無界數據集,沒有邊界,持續不斷產生新的數據,流式數據處理。兩者是相對概念,主要根據時間的範圍而定,能夠認爲一段時間內的無界數據集實際上是有界數據集,同時有界數據也能夠經過一些方法轉換爲無界數據,有界數據和無界數據實際上是能夠相互轉換的,對於不一樣的數據類型能夠進行統一的處理,Apache Spark和Flink同時支持流式計算和批量計算。

3.2 Flink編程接口

核心數據處理接口,支持批計算的接口DataSet API,支持流計算的DataStream API

                                                      

                                                                       圖-Flink接口分層與抽象

3.3 Flink程序結構

設定Flink執行環境、建立和加載數據集、對數據集指定轉換操做邏輯、指定計算結果輸出位置、調用execute方法觸發程序執行。

                                       

                                                                圖-示例Flink程序WordCount

3.4 Flink數據類型

3.4.1 數據類型支持

數據類型的描述信息都是由TypeInformation定義,比較經常使用的有BasicTypeInfo、TupleTypeInfo、CaseClassTypeInfo、PojoTypeInfo

BasicTypeInfo:支持任意Java原生數據類型,數組BasicTypeInfo

Java Tuples類型:固定長度固定類型,不支持空值存儲

POJO類型:複雜數據結構的定義

Flink Value類型:序列化與反序列化

特殊數據類型:Types Hmt

3.4.2 TypeInformation信息獲取

一般狀況下Flink都能正常進行數據類型判斷,並選擇合適的serializers以及comparators,可是在某些狀況下沒法獲取,例如JVM泛型擦除。

反射機制儘量重構類型信息,類型提示(Ctype Himts),TypeHint指定輸出參數類型

自定義TypeInformation

4. DataStream API介紹與使用

4.1 DataStream編程模型

基於Google提出的DataFlow模型,實現了支持原生數據流處理的計算引擎。API主要分爲三個部分:

DataSourc模塊,數據接入功能,主要是將各類外部數據接入到Flink系統,並將接入的數據轉換成對應的DataStream數據集

Transformation模塊,定義了對DataStream數據集的各類轉換操做,例如map、reduce、windows等操做

DataSink模塊,將結果數據寫出到外部存儲介質中,如文件或者Kafka中間件

4.1.1 DataSources數據輸入

內置數據源,包括文件、Socket網絡端口以及集合類型數據;第三方數據源,定義了Flink和外部系統數據交互的邏輯,包括數據的讀寫接口,Flink定義了豐富的第三方數據源鏈接器(Connector),例如Kafka Connector、ES Connector以及自定義第三方數據源Connector。

  • 內置文件數據源
  • 內置Socket數據源
  • 內置集合數據源,集合類Collection,將本地集合中的數據分發到遠端並行執行的節點中
  • 外部數據源鏈接器,如Kafka
  • 外部自定義數據源鏈接器,實現SourceFunction等

4.1.2 DataStream轉換操做

即經過一個或多個DataStream生成新的DataStream的過程稱爲Transformation,在轉換過程當中,每種操做類型被定義爲不一樣的Operator,Flink可以將多個Transformation組成一個DataFlow的拓撲。DataStream的轉換操做能夠分爲Single-DataStream、Multi-DataStream、物理分區三類類型。

  • Single-DataStream

Map(DataStream->DataStream)、FlatMap(DataStream->DataStream)、Filter(DataStream->DataStream)、KeyBy(DataStream->KeyedStream)、Reduce(KeyedStream->DataStream)、Aggregations(KeyedStream->DataStream)

  • Multi-DataStream

Union(DataStream->DataStream)、Connect/CoMap/CoFlatMap(DataStream->DataStream)、Split(DataStream->SplitStream)、Select(SplitStream->DataStream)、Iterate(DataStream->IterativeStream->DataStream)

  • 物理分區操做

根據指定的分區策略將數據從新分配到不一樣節點的task案例上執行,隨機分區、平衡分區、按比例分區等

4.1.3 DataSinks數據輸出

  • 基本數據輸出

文件輸出、客戶端輸出、Socket網絡端口、

  • 第三方數據輸出

如Kafka、Cassandra、Kinesis、ES、HDFS、NIFI等。DataSink類操做算子專門處理數據的輸出,全部的數據輸出均可以基於實現SinkFunction完成定義,如FlinkKafkaProducer。

4.2 時間機率與WaterMark

三種時間概念:

事件生成時間(Event time)、時間接入時間(Ingestion Time)和事件處理時間(Processing Time)

相關文章
相關標籤/搜索