大數據框架 — Flink_01(簡介、數據處理架構、Flink與Spark的不同、Flink分層API簡介)


歡迎訪問筆者個人技術博客:http://rukihuang.xyz/

1 Flink簡介

  • Flink 項目的理念是:“Apache Flink 是爲分佈式、高性能、隨時可用以及準確的流處理應用程序打造的開源流處理框架”。
  • Apache Flink 是一個框架和分佈式處理引擎,用於對無界和有界數據流進行有狀態計算。Flink 被設計在所有常見的集羣環境中運行,以內存執行速度和任意規模來執行計算。

在這裏插入圖片描述

2 爲什麼選擇Flink

  1. 流數據更真實地反映生活方式
  2. 傳統的數據架構是基於優先數據集
  3. 優點:
    1. 低延遲
    2. 高吞吐
    3. 結果的準確性和良好的容錯性

3 數據處理架構

3.1 傳統數據處理架構

3.1.1 事務處理

在這裏插入圖片描述

3.1.2 分析處理

  • 先將數據從業務數據庫複製到數倉,再進行分析和查詢

在這裏插入圖片描述

3.2 流處理

3.2.1 有狀態的流式處理

  • 處理過程中在本地設置狀態
  • 定時備份存儲

在這裏插入圖片描述

3.2.2 事件驅動

  • 事件驅動型應用是一類據由狀態的應用,它從一個或多個時間流提取數據,並根據到來的事件觸發計算、狀態更新或其他外部東顧總。典型是以kafka爲代表的休息隊列,幾乎都是事件驅動型應用。

在這裏插入圖片描述

  • 與事件驅動不同的是SparkStreaming微批次。如圖

在這裏插入圖片描述

3.2.3 流vs批

  • 批處理:有界、持久、大量,非常適合需要訪問全套記錄才能完成的計算工作,一般用於離線計算。

  • 流處理:無界、實時,無需針對整個數據集執行操作,而是通過對系統傳輸的每個數據執行操作,一般用於實時統計。

  • 在spark的世界觀中,一切都是由批次組成的,離線數據是一個大批此,而實時數據是由一個一個五無限的小批次組成的。

  • 在Flink的世界觀中,一切都是由流組成的,離線數據是有界限的流,實時數據是一個沒有界限的流。

    • 無界數據流:無界數據流有開始但是沒有結束,它們不會在生成時終止並提供數據,必須連續處理無界流,必須在獲取後立即處理event。對於無界數據流我們無法等待所有數據都到達,因爲流入是無界的,並且在任何時間點都不會完成。處理無界數據通常要求以特定順序獲取event,以便能夠推斷結果的完整性。
    • 有界數據流:遊街數據流有明確定義的開始和結束,可以在執行人格計算之前通過獲取所有數據來處理有界流,處理有界流不需要有序獲取,因爲可以始終對有界數據集進行排序,有界流的處理也成爲批處理。

在這裏插入圖片描述

3.2.4 Flink vs Spark

3.2.4.1 數據模型

  • spark採用RDD模型,spark streaming的DStream實際上就是一組組小批數據RDD的集合
  • Flink基本數據模型是數據流,以及事件序列(event)

3.2.4.2 運行時架構

  • spark是批計算,將DAG劃分爲不同的stage,一個完成後纔可以計算下一個
  • Flink是標準的流執行模式,一個事件在一個節點處理完後可以直接發往下一個節點進行處理

4 Flink分層API

  • 越頂層越抽象,表達含義越簡明,使用越方便
  • 月底層越具體,表達能力越豐富,使用越靈活

在這裏插入圖片描述

4.1 過程函數 ProcessFunction

  • 最底層級的抽象僅僅提供了有狀態流,它將通過函數(Process Function)被嵌入到DataStream API中。底層過程函數(Process Function)與DataStream API相集成,使其可以對某些特定的操作進行底層的抽象,它允許用戶可以自由地處理來自一個或多個數據流的事件,並使用一致的容錯的狀態。除此之外,用戶可以註冊事件事件並處理事件回調,從而使程序可以處理複雜的計算。

4.2 DataStream API

  • 實際上,大多數應用並不需要上述的底層抽象,而是針對核心API進行編程,比如DataStream API(有界或無界流數據)以及DataSet API(有界數據集)。這些API爲數據處理提供了通用的構建模塊,比如由用戶定義的多種形式的轉換(transformation)、連接(join)、聚合(aggregations)、窗口操作(windows)等。DataSet API 爲有界數據集提供了額外的支持,例如循環與迭代。這些 API處理的數據類型以類(classes)的形式由各自的編程語言所表示。

4.3 SQL/Table API

  • Table API 是以表爲中心的聲明式編程,其中表可能會動態變化(在表達流數據時)。Table API 遵循(擴展的)關係模型:表有二維數據結構(schema)(類似於關係數據庫中的表),同時 API 提供可比較的操作,例如 selectprojectjoingroup-byaggregate 等。Table API 程序聲明式地定義了什麼邏輯操作應該執行,而不是準確地確定這些操作代碼的看上去如何。

  • 儘管 Table API 可以通過多種類型的用戶自定義函數(UDF)進行擴展,其仍不如核心 API 更具表達能力,但是使用起來卻更加簡潔(代碼量更少)。除此之外,Table API 程序在執行之前會經過內置優化器進行優化。你可以在表與 DataStream/DataSet 之間無縫切換,以允許程序將 Table API 與DataStream 以及 DataSet 混合使用。

  • Flink 提供的最高層級的抽象是 SQL 。這一層抽象在語法與表達能力上與Table API 類似,但是是以 SQL 查詢表達式的形式表現程序。SQL 抽象與 Table API交互密切,同時 SQL 查詢可以直接在 Table API 定義的表上執行。

  • 目前 Flink 作爲批處理還不是主流,不如 Spark 成熟,所以 DataSet 使用的並不是很多。Flink Table API 和 Flink SQL 也並不完善,大多都由各大廠商自己定製。所以我們主要學習 DataStream API 的使用。實際上 Flink 作爲最接近 Google DataFlow模型的實現,是流批統一的觀點,所以基本上使用 DataStream 就可以了。

  • Flink 幾大模塊

    • Flink Table & SQL(還沒開發完)
    • Flink Gelly(圖計算)
    • Flink CEP(複雜事件處理)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章