《Flink 從0到1》- 1- 異軍突起的流式計算框架Flink

異軍突起的流式計算框架Flink


Flink 專欄文章
1- 異軍突起的流式計算框架Flink
2- Flink下載安裝&運行

Flink 基本介紹

Flink 是一個有狀態計算分佈式處理框架,支持有界的數據計算和無界數據計算

Flink被設計爲在所有常見的集羣環境中運行,以內存中的速度和任何規模執行計算

Flink 相關術語

流 Stream

流

  • 無界數據Unbounded streams : 有開始,但是沒有結束點
  • 有界數據Bounded streams: 有明確的開始和結束點

Flink 支持無界數據和有界數據的處理

Flink 支持實時數據和已經保存的數據(所有的數據都是已流的方式體現)

狀態

在這裏插入圖片描述

  • stateless 無狀態: 數據來一條寫一條出去,無前後依賴關係
  • stateful 有狀態: 需要依賴之前的數據

Flink 基本架構

在這裏插入圖片描述
Flink 支持特性

  • 能夠處理有界數據和無界數據
  • 支持多種方式部署,包含YARN,Mesos,K8s, stand-alone cluster
  • 高伸縮方式
  • 極致流式處理性能

在這裏插入圖片描述
任務狀態始終在內存中維護,如果狀態大小超過可用內存,則在訪問高效的磁盤數據結構中維護。

因此,任務通過訪問本地(通常在內存中)狀態來執行所有計算,從而產生非常低的處理延遲。通過週期性和異步地將本地狀態檢查點指向持久存儲,Flink確保了故障發生時的一次狀態一致性。

Flink API

Flink提供了三個分層的api。每個API在簡潔性和表達性之間提供了不同的平衡,並針對不同的用例。

在這裏插入圖片描述
從上往下表達能力越靈活,但是抽象能力逐漸降低

  • Process Functions: 底層的流處理模塊,靈活度較高
  • DataStream API: 提供常用的流處理操作,比如Window, 轉換之類的,支持JAVA 和 Scala 語言
  • SQL/Table API: 支持SQL 和 table API, 降低了Flink使用門檻

Flink 提供了不同維度,不同層次,研發時需要根據自己的業務場景進行選擇。 這裏沒有必須要使用哪個API, 只有合適自己研發場景的API

Flink 編程模型

Flink程序的基本構建塊是流和轉換, 完整的Flink 處理包含 數據源Source轉換操作Transformation,接收結果Sink

  • Source : 數據的來源,支持MQ,文件系統,DB 等
  • Transformation : 拿到數據需要做哪些操作,比如過濾,聚合等操作
  • Sink : 處理過後數據輸出,輸出到控制檯(打印),MQ,文件系統,Redis, 數據庫等
    Flink編程模型
數據源-Source

數據源 DataStreamDataSet,一個流處理可以有一個或者多個數據源 常見調用方式爲

 // 獲取執行環境
StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment();
// 添加數據源
environment.addSource(new RandomSource());

Flink 同時內置了常見的數據格式的讀取入,如文件,socket

environment.readFile("文件路徑"); //讀取文件
environment.readTextFile("文件路徑"); // 讀取文本文件
environment.socketTextStream("127.0.0.1",9090); // 讀取socket
數據轉換-Transformation

主要做轉換相關的操作,入min,max, count,聚合之類的操作

結果數據接收器-Data sink

sink 表示輸出,輸出可以輸出到Redis, Hbase, 文件,數據庫,也可以用打印出來, 一個流處理可以有一個或者多個數據

dataStream.addSink(new PrintSinkFunction());

同時也是預置了常見的輸出

writeAsText() // 輸出到txt文件
writeAsCsv() // 輸出到csv文件,只能用於元組(Tuple)的DataStream
print() //打印
writeToSocket() // 輸出到sockit

Flink 應用場景

數據管道應用

數據管道

提取-轉換-加載(ETL)是一種在存儲系統之間進行數據轉換和遷移的常用方法。ETL 作業通常會週期性地觸發,將數據從事務型數據庫拷貝到分析型數據庫或數據倉庫。

數據管道和 ETL 作業的用途相似,都可以轉換、豐富數據,並將其從某個存儲系統移動到另一個。但數據管道是以持續流模式運行,而非週期性觸發。因此它支持從一個不斷生成數據的源頭讀取記錄,並將它們以低延遲移動到終點。例如:數據管道可以用來監控文件系統目錄中的新文件,並將其數據寫入事件日誌;另一個應用可能會將事件流物化到數據庫或增量構建和優化查詢索引。

事件驅動型應用

事件驅動型應用是一類具有狀態的應用,它從一個或多個事件流提取數據,並根據到來的事件觸發計算、狀態更新或其他外部動作。

事件驅動型應用是在計算存儲分離的傳統應用基礎上進化而來。在傳統架構中,應用需要讀寫遠程事務型數據庫。

相反,事件驅動型應用是基於狀態化流處理來完成。在該設計中,數據和計算不會分離,應用只需訪問本地(內存或磁盤)即可獲取數據。系統容錯性的實現依賴於定期向遠程持久化存儲寫入 checkpoint。下圖描述了傳統應用和事件驅動型應用架構的區別。
時間驅動應用

數據分析應用

數據分析任務需要從原始數據中提取有價值的信息和指標。傳統的分析方式通常是利用批查詢,或將事件記錄下來並基於此有限數據集構建應用來完成。爲了得到最新數據的分析結果,必須先將它們加入分析數據集並重新執行查詢或運行應用,隨後將結果寫入存儲系統或生成報告
數據分析應用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章