Apache Flink系列-②什麼是Apache Flink?

来源:https://www.cnblogs.com/suprising/archive/2022/04/19/16154827.html
-Advertisement-
Play Games

Apache Flink是一個在無界和有界數據流上進行有狀態計算的框架。Flink提供了不同抽象級別的多個API,併為常見用例提供了專用庫。 在這裡,我們介紹Flink易於使用且富有表現力的API和庫。 流媒體應用的構建塊 流處理框架可以構建和執行的應用程式類型取決於該框架對流、狀態和時間的控製程度 ...


Apache Flink是一個在無界和有界數據流上進行有狀態計算的框架。Flink提供了不同抽象級別的多個API,併為常見用例提供了專用庫。

在這裡,我們介紹Flink易於使用且富有表現力的API和庫。

流媒體應用的構建塊

流處理框架可以構建和執行的應用程式類型取決於該框架對流、狀態和時間的控製程度。在下麵,我們將描述流處理應用程式的這些構建塊,並解釋Flink處理它們的方法。

Streams

顯然,流是流處理的一個基本方面。然而,流可以具有不同的特性,這些特性會影響流的處理方式。Flink是一個通用的處理框架,可以處理任何類型的流。

  • 有界和無界流:流可以是無界或有界的,即固定大小的數據集。Flink具有處理無限流的複雜功能,但也有專門的操作員來高效處理有界流。
  • 實時和記錄流:所有數據都以流的形式生成。有兩種方法來處理數據。在生成流時實時處理它,或將流持久化到存儲系統(例如,文件系統或對象存儲),然後進行處理。Flink應用程式可以處理記錄或實時流。

state

每個非平凡的流應用程式都是有狀態的,也就是說,只有對單個事件應用轉換的應用程式不需要狀態。任何運行基本業務邏輯的應用程式都需要記住事件或中間結果,以便在稍後的時間點訪問它們,例如,當接收到下一個事件時或在特定的持續時間之後。

Apache Flink系列-②什麼是Apache Flink?

 

應用狀態是Flink中最重要的一個特征。通過查看Flink在狀態處理上下文中提供的所有特性,可以看出這一點。

 

  • Flink為不同的數據結構(如原子值、列表或映射)提供狀態原語。開發人員可以根據函數的訪問模式選擇最有效的狀態原語。
  • 可插拔狀態後端:應用程式狀態由可插拔狀態後端管理和檢查。Flink具有不同的狀態後端,將狀態存儲在記憶體或RocksDB中,RocksDB是一種高效的嵌入式磁碟數據存儲。自定義狀態後端也可以插入。
  • 精確一次狀態一致性:Flink的檢查點和恢復演算法保證了在出現故障時應用程式狀態的一致性。因此,故障的處理是透明的,不會影響應用程式的正確性。
  • 超大狀態:由於其非同步和增量檢查點演算法,Flink能夠保持數TB大小的應用程式狀態。
  • 可擴展應用程式:Flink通過將狀態重新分配給更多或更少的工作人員,支持有狀態應用程式的擴展。

時間

時間是流媒體應用程式的另一個重要組成部分。大多數事件流都有內在的時間語義,因為每個事件都是在特定的時間點生成的。此外,許多常見的流計算都是基於時間的,例如windows聚合、會話、模式檢測和基於時間的連接。流處理的一個重要方面是應用程式如何測量時間,即事件時間和處理時間的差異。

Flink提供了一系列豐富的與時間相關的功能。

事件時間模式:使用事件時間語義處理流的應用程式根據事件的時間戳計算結果。因此,無論是處理記錄的還是實時的事件,事件時間處理都允許獲得準確且一致的結果。

水印支持:Flink在事件時間應用程式中使用水印來推理時間。水印也是一種靈活的機制,可以權衡結果的延遲和完整性。

延遲數據處理:在使用水印以事件時間模式處理流時,可能會發生在所有相關事件到達之前計算已經完成的情況。這種事件稱為遲發事件。Flink提供了多個選項來處理延遲事件,例如通過側輸出重新路由事件,以及更新之前完成的結果。

處理時間模式:除了事件時間模式外,Flink還支持處理時間語義,該語義執行由處理器的掛鐘時間觸發的計算。處理時間模式可以適用於某些具有嚴格低延遲要求的應用程式,這些應用程式可以容忍近似的結果。

分層 API

Flink 根據抽象程度分層,提供了三種不同的 API。每一種 API 在簡潔性和表達力上有著不同的側重,並且針對不同的應用場景。

Apache Flink系列-②什麼是Apache Flink?

 

下文中,我們將簡要描述每一種 API 及其應用,並提供相關的代碼示例。

/**


* 將相鄰的 keyed START 和 END 事件相匹配並計算兩者的時間間隔 * 輸入數據為 Tuple2<String, String> 類型,第一個欄位為 key 值,  * 第二個欄位標記 START 和 END 事件。    */public static class StartEndDuration
    extends KeyedProcessFunction<String, Tuple2<String, String>, Tuple2<String, Long>> {


  private ValueState<Long> startTime;


  @Override
  public void open(Configuration conf) {
    // obtain state handle
    startTime = getRuntimeContext()
      .getState(new ValueStateDescriptor<Long>("startTime", Long.class));
  }


  /** Called for each processed event. */
  @Override
  public void processElement(
      Tuple2<String, String> in,
      Context ctx,
      Collector<Tuple2<String, Long>> out) throws Exception {


    switch (in.f1) {
      case "START":
        // set the start time if we receive a start event.
        startTime.update(ctx.timestamp());
        // register a timer in four hours from the start event.
        ctx.timerService()
          .registerEventTimeTimer(ctx.timestamp() + 4 * 60 * 60 * 1000);
        break;
      case "END":
        // emit the duration between start and end event
        Long sTime = startTime.value();
        if (sTime != null) {
          out.collect(Tuple2.of(in.f0, ctx.timestamp() - sTime));
          // clear the state
          startTime.clear();
        }
      default:
        // do nothing
    }
  }


  /** Called when a timer fires. */
  @Override
  public void onTimer(
      long timestamp,
      OnTimerContext ctx,
      Collector<Tuple2<String, Long>> out) {


    // Timeout interval exceeded. Cleaning up the state.
    startTime.clear();
  }}

這個例子充分展現了 KeyedProcessFunction 強大的表達力,也因此是一個實現相當複雜的介面。

DataStream API

DataStream API 為許多通用的流處理操作提供了處理原語。這些操作包括視窗、逐條記錄的轉換操作,在處理事件時進行外部資料庫查詢等。DataStream API 支持 Java 和 Scala 語言,預先定義了例如map()、reduce()、aggregate() 等函數。你可以通過擴展實現預定義介面或使用 Java、Scala 的 lambda 表達式實現自定義的函數。

下麵的代碼示例展示瞭如何捕獲會話時間範圍內所有的點擊流事件,並對每一次會話的點擊量進行計數。

// 網站點擊 Click 的數據流DataStream<Click> clicks = 


DataStream<Tuple2<String, Long>> result = clicks
  // 將網站點擊映射為 (userId, 1) 以便計數
  .map(
    // 實現 MapFunction 介面定義函數
    new MapFunction<Click, Tuple2<String, Long>>() {
      @Override
      public Tuple2<String, Long> map(Click click) {
        return Tuple2.of(click.userId, 1L);
      }
    })
  // 以 userId (field 0) 作為 key
  .keyBy(0)
  // 定義 30 分鐘超時的會話視窗
  .window(EventTimeSessionWindows.withGap(Time.minutes(30L)))
  // 對每個會話視窗的點擊進行計數,使用 lambda 表達式定義 reduce 函數
  .reduce((a, b) -> Tuple2.of(a.f0, a.f1 + b.f1));

SQL & Table API

Flink 支持兩種關係型的 API,Table API 和 SQL。這兩個 API 都是批處理和流處理統一的 API,這意味著在無邊界的實時數據流和有邊界的歷史記錄數據流上,關係型 API 會以相同的語義執行查詢,並產生相同的結果。Table API 和 SQL 藉助了 Apache Calcite 來進行查詢的解析,校驗以及優化。它們可以與 DataStream 和 DataSet API 無縫集成,並支持用戶自定義的標量函數,聚合函數以及表值函數。

Flink 的關係型 API 旨在簡化數據分析、數據流水線和 ETL 應用的定義。

下麵的代碼示例展示瞭如何使用 SQL 語句查詢捕獲會話時間範圍內所有的點擊流事件,並對每一次會話的點擊量進行計數。此示例與上述 DataStream API 中的示例有著相同的邏輯。

SELECT userId, COUNT(*)FROM clicksGROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId

Flink 具有數個適用於常見數據處理應用場景的擴展庫。這些庫通常嵌入在 API 中,且並不完全獨立於其它 API。它們也因此可以受益於 API 的所有特性,並與其他庫集成。

  • 複雜事件處理(CEP):模式檢測是事件流處理中的一個非常常見的用例。Flink 的 CEP 庫提供了 API,使用戶能夠以例如正則表達式或狀態機的方式指定事件模式。CEP 庫與 Flink 的 DataStream API 集成,以便在 DataStream 上評估模式。CEP 庫的應用包括網路入侵檢測,業務流程監控和欺詐檢測。
  • DataSet API:DataSet API 是 Flink 用於批處理應用程式的核心 API。DataSet API 所提供的基礎運算元包括mapreduce(outer) joinco-groupiterate等。所有運算元都有相應的演算法和數據結構支持,對記憶體中的序列化數據進行操作。如果數據大小超過預留記憶體,則過量數據將存儲到磁碟。Flink 的 DataSet API 的數據處理演算法借鑒了傳統資料庫演算法的實現,例如混合散列連接(hybrid hash-join)和外部歸併排序(external merge-sort)。
  • Gelly: Gelly 是一個可擴展的圖形處理和分析庫。Gelly 是在 DataSet API 之上實現的,並與 DataSet API 集成。因此,它能夠受益於其可擴展且健壯的操作符。Gelly 提供了內置演算法,如 label propagation、triangle enumeration 和 page rank 演算法,也提供了一個簡化自定義圖演算法實現的 Graph API。
Apache Flink系列-②什麼是Apache Flink?
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、起因 最近在使用Umi進行React的前端開發,有一個數據表格分頁的功能需求,由於後端還沒完成所以考慮前端先使用Mock先來進行模擬數據測試。 Mock的介紹這裡就不做贅述,大家感興趣的可自行前往官網學習--Mock.js。 由於是分頁功能,必然少不了當前頁碼、分頁大小、過濾條件等請求參數,但是 ...
  • 講基礎不容易,本文通過 7個demo、6張圖、1.6k文字串講作用域鏈、詞法作用域、閉包、閉包使用案例。 ...
  • 一、什麼是協商緩存 協商緩存是伺服器端的一種緩存策略,服務端提供一種記號,用來判斷客戶端資源和服務端是否一樣。 一致返回304,否則返回200和新資源。 二、如何實現 主要是通過在response header中攜帶相關標識 一種通過last-modified資源的最後修改時間 第一次請求時,伺服器 ...
  • 本文將介紹利用 CSS 實現滾動視差效果的一個小技巧,並且,利用這個技巧來製作一些有意思的交互特效。 關於使用 CSS 實現滾動視差效果,在之前有一篇文章詳細描述過具體方案 - CSS 實現視差效果,感興趣的同學可以先看看這篇文章。 這裡,會運用上這樣一種純 CSS 的視差技巧: 使用 transf ...
  • 德國科技管理專家斯坦門茨早年移居美國,他以非凡的才能成為美國企業界的佼佼者。一次,美國著名的福特公司的一組電機發生故障,在束手無策之時,公司請斯坦門茨出馬解決問題。 斯坦門茨在電機旁仔細觀察,經過計算,用粉筆在電機外殼划了一條線,說:“從這裡打開,把裡面的線圈減少16圈。”工人們照他說的一試,電機果 ...
  • 策略模式是什麼 策略模式是一種行為設計模式, 它能讓你定義一系列演算法, 並將每種演算法分別放入獨立的類中, 以使演算法的對象能夠相互替換。 為什麼用策略模式 當你想使用對象中各種不同的演算法變體,並希望能在運行時切換演算法時,可使用策略模式。策略模式讓你能將不同行為抽取到一個獨立類層次結構中, 並將原始類組 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 一、chiner介紹 在chiner出現之前進行資料庫建模設計的時候,大部分時間使用的是PowerDesigner。說實話基本上是偷偷的用,因為大家都知道PD是收費軟體,到處和國內廠商打官司。不僅如此,PowerDesigner古老守舊的的設計界面已經快讓讓我忍不了了,一直想尋找一款PD的替代品。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...