Apache Flink
Flink以數據並行和流水線方式執行任意流數據程序,Flink的流水線運行時系統可以執行批處理和流處理程序。
Flink框架的主要特徵包括:
- 高吞吐&低延時(真·流處理)
- 高可靠性(狀態存儲)
- 支持流處理、批處理,還提供CEP(複合事件處理)、ML(機器學習)、SQL的API(All in One)
Flink組件棧
API支持
- 對Streaming數據類應用,提供DataStream API
- 對批處理類應用,提供DataSet API(支持Java/Scala)
整合支持
- 支持Flink on YARN
- 支持HDFS
- 支持來自Kafka的輸入數據
- 支持Apache HBase
- 支持Hadoop程序
- 支持Tachyon
- 支持ElasticSearch
- 支持RabbitMQ
- 支持Apache Storm
- 支持S3
- 支持XtreemFS
Spark與Flink擁有類似功能,兩者主要區別包括:
Spark處理數據的單位是一批而不是單條,而數據採集卻是逐條進行的,本質上是micro-batch的處理方式。因此 Spark Streaming系統需要設置間隔使得數據彙總到一定的量後再一併操作,這個間隔就是批處理間隔。
Flink 的基本數據模型是數據流,及事件(Event) 的序列。數據流作爲數據的基本模型可能沒有表或者數據塊直觀熟悉,但是可以證明是完全等效的。流可以是無邊界的無限流,即一般意義上的流處理。也可以是有邊界的有限流,這樣就是批處理。
基於不同的底層數據模型,Flink能提供毫秒級的實時處理,Spark能提供秒級的實時處理。
Flink Streaming特性
高吞吐率和低延遲
Flink 的流處理引擎只需要很少配置就能實現高吞吐率和低延遲。下圖展示了一個分佈式計數的任務的性能,包括了流數據 shuffle 過程。
支持 Event Time 和亂序事件
Flink 支持了流處理和 Event Time 語義的窗口機制,Event time 使得計算亂序到達的事件或可能延遲到達的事件更加簡單。Event Time的時間包括:
- Processing Time
- Event Time
- Ingestion Time
狀態計算的Exactly-once
流程序可以在計算過程中維護自定義狀態,Flink 的 checkpointing 機制保證了即時在故障發生下也能保障狀態的 exactly once 語義。
靈活的時間窗口
Flink 支持在時間窗口,統計窗口,session 窗口,以及數據驅動的窗口,窗口可以通過靈活的觸發條件來定製,以支持複雜的流計算模式。
帶反壓的連續流模型
數據流應用執行的是不間斷的(常駐)operators。
Flink streaming 在運行時有着天然的流控:慢的數據 sink 節點會反壓(backpressure)快的數據源(sources)。
容錯性
Flink 的容錯機制是基於 Chandy-Lamport distributed snapshots 來實現的。
這種機制是非常輕量級的,允許系統擁有高吞吐率的同時還能提供強一致性的保障
Batch 和 Streaming 一個系統流處理和批處理共用一個引擎
Flink 爲流處理和批處理應用公用一個通用的引擎。批處理應用可以以一種特殊的流處理應用高效地運行。
內存管理
Flink 在 JVM 中實現了自己的內存管理。
應用可以超出主內存的大小限制,並且承受更少的垃圾收集的開銷
迭代和增量迭代
Flink 具有迭代計算的專門支持(比如在機器學習和圖計算中)。
增量迭代可以利用依賴計算來更快地收斂。
自動調優
批處理程序會自動地優化一些場景,比如避免一些昂貴的操作(如 shuffles 和 sorts),還有緩存一些中間數據。