Flink-初識(特點、與sparkstreaming的比較) 阿新 • • 發佈:2022-05-18 1.初識 Flink 起源於 Stratosphere 專案,Stratosphere 是在 2010~2014 年由 3 所地處柏林的大學和歐洲的一些其他的大學共同進行的研究專案,2014 年 4 月 Stratosphere 的代 碼 被 復 制 並 捐 贈 給 了 Apache 軟 件 基 金 會 , 參 加 這 個 孵 化 項 目 的 初 始 成 員 是Stratosphere 系統的核心開發人員,2014 年 12 月,Flink 一躍成為 Apache 軟體基金會的頂級專案。 在德語中,Flink 一詞表示快速和靈巧,專案採用一隻松鼠的彩色圖案作為 logo,這不僅是因為松鼠具有快速和靈巧的特點,還因為柏林的松鼠有一種迷人的紅棕色,而 Flink 的松鼠 logo 擁有可愛的尾巴,尾巴的顏色與 Apache 軟體基金會的 logo 顏色相呼應,也就是說,這是一隻 Apache 風格的松鼠。 Flink 專案的理念是:“Apache Flink 是為分散式、高效能、隨時可用以及準確的流處理應用程式打造的開源流處理框架”。 Apache Flink 是一個框架和分散式處理引擎,用於對無界和有界資料流進行有狀態計算。Flink 被設計在所有常見的叢集環境中執行,以記憶體執行速度和任意規模來執行計算。 Flink熱度圖 為什麼選擇Flink? 流資料更真實的反映了我們的生活方式 傳統的資料架構是基於有限資料集的 目標:低延遲、高吞吐、結果的準確性和良好的容錯性 第二代:lambda架構 用兩套系統,同時保證低延遲和結構正確 第三代:Flink 2.Flink的重要特點 2.1 事件驅動型(Event-driven) 事件驅動型應用是一類具有狀態的應用,它從一個或多個事件流提取資料,並根據到來的事件觸發計算、狀態更新或其他外部動作。比較典型的就是以 kafka 為代表的訊息佇列幾乎都是事件驅動型應用。 與之不同的就是 SparkStreaming 微批次,如圖: 2.2 流與批的世界觀 批處理的特點是有界、持久、大量,非常適合需要訪問全套記錄才能完成的計算工作,一般用於離線統計。 流處理的特點是無界、實時, 無需針對整個資料集執行操作,而是對通過系統傳輸的每個資料項執行操作,一般用於實時統計。 在 spark 的世界觀中,一切都是由批次組成的,離線資料是一個大批次,而實時資料是由一個一個無限的小批次組成的。 而在 flink 的世界觀中,一切都是由流組成的,離線資料是有界限的流,實時資料是一個沒有界限的流,這就是所謂的有界流和無界流。 無界資料流:無界資料流有一個開始但是沒有結束,它們不會在生成時終止並提供資料,必須連續處理無界流,也就是說必須在獲取後立即處理 event。對於無界資料流我們無法等待所有資料都到達,因為輸入是無界的,並且在任何時間點都不會完成。處理無界資料通常要求以特定順序(例如事件發生的順序)獲取 event,以便能夠推斷結果完整性。 有界資料流:有界資料流有明確定義的開始和結束,可以在執行任何計算之前通過獲取所有資料來處理有界流,處理有界流不需要有序獲取,因為可以始終對有界資料集進行排序,有界流的處理也稱為批處理。 2.3 分層API 最底層級的抽象僅僅提供了有狀態流,它將通過過程函式(Process Function)被嵌入到 DataStream API 中。底層過程函式(Process Function) 與 DataStream API相整合,使其可以對某些特定的操作進行底層的抽象,它允許使用者可以自由地處理來自一個或多個數據流的事件,並使用一致的容錯的狀態。除此之外,使用者可以註冊事件時間並處理時間回撥,從而使程式可以處理複雜的計算。 實際上,大多數應用並不需要上述的底層抽象,而是針對核心 API(Core APIs)進行程式設計,比如 DataStream API(有界或無界流資料)以及 DataSet API(有界資料集)。這些 API 為資料處理提供了通用的構建模組,比如由使用者定義的多種形式的轉換(transformations),連線(joins),聚合(aggregations),視窗操作(windows)等等。DataSet API 為有界資料集提供了額外的支援,例如迴圈與迭代。這些 API處理的資料型別以類(classes)的形式由各自的程式語言所表示。 Table API 是以表為中心的宣告式程式設計,其中表可能會動態變化(在表達流資料時)。Table API 遵循(擴充套件的)關係模型:表有二維資料結構(schema)(類似於關係資料庫中的表),同時 API 提供可比較的操作,例如 select、project、join、group-by、aggregate 等。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(複雜事件處理) 2.4其它 支援事件時間(event-time)和處理時間(processing-time)語義 精確一次(exactly-once)的狀態一致性保證 低延遲,每秒處理數百萬個事件,毫秒級延遲 與眾多常用儲存系統的連線 高可用,動態擴充套件,實現7*24小時全天候執行 3.Flink vs Spark Streaming 3.1 流(stream)和微批(micro-batching) 3.2 資料模型 spark採用RDD模型,spark streaming的DStream實際上也就是一組組小批資料RDD的集合 flink基本資料模型是資料流,以及事件(event)序列 3.3 執行時架構 spark是批計算,將DAG劃分為不同的stage,一個完成後才可以計算下一個 flink是標準的流執行模式,一個事件在一個節點處理完後可以直接發往下一個節點進行處理