Flink 概述
什麼是 Flink
Apache Apache Flink 是一個開源的流處理框架,應用於分佈式、高性能、高可用的數據流應用程序。可以處理有限數據流和無限數據,即能夠處理有邊界和無邊界的數據流。無邊界的數據流就是真正意義上的流數據,所以 Flink 是支持流計算的。有邊界的數據流就是批數據,所以也支持批處理的。不過 Flink 在流處理上的應用比在批處理上的應用更加廣泛,統一批處理和流處理也是 Flink 目標之一。Flink 可以部署在各種集羣環境,可以對各種大小規模的數據進行快速計算。
- 2010~2014Flink 起源於柏林理工大學的研究性項目 Stratosphere
- 2014 年該項目被捐贈給 Apache 軟件基金會
- 2014 年 12 月 Flink 一躍成爲 Apache 軟件基金會的頂級項目之一
在德語中,Flink 一詞表示快速和靈巧,項目採用一隻松鼠的彩色圖案作爲 logo,這不僅是因爲松鼠具有快速和靈巧的特點,還因爲柏林的松鼠有一種迷人的紅棕色,而 Flink 的松鼠 logo 擁有可愛的尾巴,尾巴的顏色與 Apache 軟件基金會的 logo 顏色相呼應,也就是說,這是一隻 Apache 風格的松鼠
Flink 的特點
Flink 有如下特點:
- 批流一體:統一批處理和流處理
- 分佈式:Flink 程序可以運行在分佈式環境下
- 高性能
- 高可用
- 準確性:Flink 可以保證數據處理的準確性
Flink 應用場景
Flink 主要應用於流式數據分析場景
- 實時 ETL
Extraction-Transformation-Loading 的縮寫,中文名稱爲數據抽取、轉換和加載.
集成流計算現有的諸多數據通道和 SQL 靈活的加工能力,對流式數據進行實時清晰、歸併和結構化處理;同時,對離線數倉進行有效的補充和優化,併爲數據實時傳輸提供可計算通道。
- 實時報表
實時化採集,加工流式數據存儲;實時監控和展現業務、客戶各類指標,讓數據化運營實時化。
- 監控預警
對系統和用戶行爲進行實時監測和分析,以便及時發現危險行爲。
- 在線系統
實時計算各類數據指標,並利用實時結果及時調整在線系統的相關策略,並應用於內容投放、智能推送領域。
Flink 核心組成及生態發展
Flink 核心組成
- Deploy 層:
Flink 支持本地運行、能在獨立集羣或者在被 YARN 或 Mesos 管理的集羣上運行,也能部署在雲上 - Core 層:
Flink 的核心是分佈式流式數據引擎,意味着數據以一次一個事件的形式被處理 - API 層:
DataStream、DataSet、Table、SQL API - 擴展庫:Flink 還包括了用於複雜事件處理、機器學習、圖像處理和 Apache Storm 兼容的專用代碼庫
Flink 生態發展
-
輸入 Connectors(左側部分)
-
流處理方式:包含 Kafka、AWS kinesis(實時數據流服務)、RabbitMQ、NIFI(數據管道)、Twitter(API)
-
批處理方式:包含 HDFS、HBase、Amazon S3(文件系統)、MapR FS(文件系統)、ALLuxio(基於內存的分佈式文件系統)
-
-
中間是 Flink 核心部分
-
輸出 Connectors(右側部分)
-
流處理方式:包含 Kafka、AWS kinesis(實時數據流服務)、RabbitMQ、NIFI(數據管道)、Cassandra(NoSQL 數據庫)、ES、HDFS rolling file(滾動文件)
-
批處理方式:包含 HBase、HDFS
-
流處理引擎的技術選型
計算框架對比圖:
產品 | 模型 | API | 保證次數 | 容錯機制 | 狀態管理 | 延時 | 吞吐量 |
---|---|---|---|---|---|---|---|
storm | Native(數據進入立即處理) | 組合式 | At-least-once | Record ACKS | 無 | Low | Low |
Trident | mirco-batching(劃分爲小批處理) | 組合式 | Exectly-once | Record ACKs | 基於操作(每次操作由一個狀態) | Medium | Medium |
Spark streaming | mirco-batching | 聲明式(提供封裝後的高階函數) | Exectly-once | RDD Checkpoint | 基於 DStream | Medium | High |
Flink | Native | 聲明式 | Exectly-once | Checkpoint | 基於操作 | Low | Hign |
市面上的流處理引擎不止 Flink 一種,其他的比如 Storm、SparkStreaming、Trident 等,如何進行選型,給大家一些建議:
- 流數據要進行狀態管理,選擇使用 Trident、Spark Streaming 或者 Flink
- 消息傳遞需要保證 At-least-once(至少一次)或者 Exacly-once(僅一次)不能選擇 Storm
- 對於小型獨立項目,有低延遲要求,可以選擇使用 Storm,更簡單
- 如果項目已經引入了 Spark,實時處理需求可以滿足的話,建議直接使用 Spark 中的 Spark Streaming
- 消息投遞要滿足 Exactly-once(僅一次),數據量大、有高吞吐、低延遲要求,要進行狀態管理或窗口統計,建議使用 Flink