Apache Flink 數據流編程模型

来源:https://www.cnblogs.com/bigdata1024/archive/2019/01/05/10217015.html
-Advertisement-
Play Games

抽象等級(Levels of Abstraction) Flink提供不同級別的抽象來開發流/批處理應用程式。 Statefule Stream Processing: 是最低級別(底層)的抽象,只提供有狀態的流。它通過ProcessFunction嵌入到DataStream API之中。它使得用戶 ...


抽象等級(Levels of Abstraction)

Flink提供不同級別的抽象來開發流/批處理應用程式。

Statefule Stream Processing: 是最低級別(底層)的抽象,只提供有狀態的流。它通過ProcessFunction嵌入到DataStream API之中。它使得用戶可以自由處理來源於一個或者多個流的事件

DataStream/DataSet API: 在我們的實際工作中,大多數的應用程式是不需要上文所描述的低級別(底層)抽象,而是相對於諸如DataStream API(有界/無界流)和DataSet API(有界數據集)的Core API進行編程。這些API提供了用於數據處理的通用模塊,如各種指定的transformations, joins, aggregations, windows, state等。在API中,這些處理的數據類型都是一個具體的實體類(class)。

底層的Process Function與DataStream API集成在一起,可以僅對一些操作進行底層抽象。

Table API: 是圍繞著table的申明性DSL,可以被動態的改變(當其表示流時)。Table API遵循(擴展)關係模型:表有一個模式鏈接(類似與在關係資料庫中的表),API也提供了一些類似的操作:select, project, join, group-by, aggregate等。Table API程式申明定義了怎麼做是規範的,而不是明確指定應該是什麼樣子的。雖然Table API可以通過各種類型的用戶定義的函數進行擴展,但它比Core API表達的更少,但使用起來更簡潔(少寫代碼)。另外,Table API程式也會通過一個優化器,在執行之前應用優化規則。

可以在表和DataStream / DataSet之間進行無縫轉換,允許程式混合使用Table API和DataStream 和DataSet API。

Flink提供的最高級抽象是SQL。 這種抽象在語義和表現力方面與Table API類似,但是將程式表示為SQL查詢表達式。在SQL抽象與Table API緊密地相互作用,另外,SQL查詢可以在Table API中定義的表上執行。

程式和數據流(Programs and Dataflows)

Flink可以說是由流(streams)和轉換(transformations)為基礎構建的(請註意,Flink的DataSet API中使用的數據集也是內部的流 )。從概念上講,流是數據記錄(可能是永無止境的)流,而轉換是將一個或多個流作為輸入,並產生一個或多個輸出流。

執行時,Flink程式被映射到由流和轉換運算符組成的流式數據流。每個數據從一個或多個源(sources)開始,併在一個或者多個接收器(sinks)中結束。數據流類似於一個任意有向無環圖(DAG)。儘管通過迭代構造允許特殊形式的迴圈,但是為了簡單起見,我們姑且先忽視這種情況。

程式中的轉換與數據流中的操作符通常是一一對應的。然而,有時候,一個轉換可能由多個轉換操作符組成。

信號源(sources)和接收器(sinks)記錄在流式連接器批量連接器文檔中。DataStream運算符DataSet轉換中記錄了轉換。

並行數據流(Parallel Dataflows)

Flink中的程式本質上是並行和分佈的。在執行過程中,一個流有一個或者多個流分區,每個運算符有一個或者多個子任務。操作符子任務彼此獨立,並且在不同的線程中執行,並且可能在不同的機器或容器上執行。

操作符子任務的數量是該特定操作符的並行度。流的並行性總是由生產它的操作符決定。同一個程式的不同運算符可能有不同的並行級別。

流可以以一對一(One-to-one)或者重新分配(Redistributing)的模式在兩個操作符之間傳輸:

One-to-one: 保留了元素的分區和順序,如上圖中source —>map。這意味著map運算符的subtask[1]將按照源運算符的subtask[1]所產生順序相同。

Redistributing: 如上圖所示,map和keyBy/window之間,以及keyBy/window和Sink之間重新分配流,將會改變流的分區。每個操作符子任務根據所選的轉換將數據發送到不同的目標子任務。比如 keyBy()(其通過哈希重新分區),broadcast(), or rebalance() (其隨機重新分區)。在重新分配 交換中,元素之間的排序只保存在每對發送和接收的子任務中(例如map() 的subtask[1] 和 keyBy /window的subtask [2])。所以在這個例子里,每個關鍵字中的排序都被保留下來,但是並行性確實造成了不同關鍵字彙總結果後順序的非確定性。

有關配置和控制並行的細節可以在並行執行的文檔中找到。

視窗(Windows)

聚合事件(如:sum,count,etc)在流上的工作方式與批處理中的不同。例如,我們不能夠去統計流中的所有元素,因為流一般是無限的(無界的)。因而,流中的一些aggregate操作,是由Windows控制的,例如:計算過去五分鐘或者最後100個元素的總和。

Windows可以是由時間驅動的(例如,每30秒)或者數據驅動(例如每100個元素)。這可以用來區分不同類型的Windows,例如:tumbling windows (no overlap), sliding windows (with overlap), and session windows (punctuated by a gap of inactivity).

更多的視窗示例可以在這篇博客文章中找到。更多細節在視窗文檔

時間(Time)

當我們在流式編程中談及時間時,可以參考不同的時間概念:

Event Time, 是事件創建的時間,通常用時間戳表示。Flink通過時間戳分配器來訪問事件時間戳。

Ingestion time, 是事件進入Flink的時間,在源操作中每個記錄都會獲得源的當前時間作為時間戳,後續基於時間的操作(如: time window)會依賴這個時間戳

Processing Time, 是指each operator 執行程式時對應的物理機的系統時間

有關如何處理時間的更多細節,請參閱event time 文檔

有狀態的操作(Stateful Operations)

儘管數據流中很多操作看起來像一個單獨的事件,但是一些操作會跨越幾個事件記下相關的的信息(比如像window operators)。這種操作被稱為有狀態的(stateful)。

這種有狀態的操作,被保存在一種key/value的存儲結構之中。狀態與有狀態操作符讀取的流嚴格分區和分配。只有在keyed()函數之後才能訪問key/value狀態。並且僅限於與當前事件的鍵相關的值。流和狀態的keys的匹配保證了所有狀態更新都是本地操作,保證了一致性,所以不需要事務的開銷。這種匹配還允許flink重新分配狀態,並公開的調整分區。

有關更多信息,請參閱有關狀態的文檔

檢查點容錯(Checkpoints for Fault Tolerance)

Flink使用流重播(stream replay)檢查點(checkpointing) 的組合來實現容錯。檢查點與每個輸入流中的特定點以及每個操作元的相應狀態有關。數據流可以從檢查點恢復,同時保持一致性(exactly-once processing語義),方法是恢復operators 的狀態並從檢查點重放事件。

檢查點間隔是在執行恢復時間(需要被重放的事件的數量)的情況下折衷的容錯開銷手段。

容錯內部的描述提供了有關Flink如何管理檢查點和相關主題的更多信息。有關啟用和配置檢查點的詳細信息位於檢查點API文檔中。

批處理流(Batch on Streaming)

Flink執行批處理程式作為流程式的特殊情況,它是有限的(元素是有限的)。ADataSet 在內部視為數據流。因此,上述概念同樣適用於批處理程式,就像適用於流式處理程式一樣,但有一點例外:

  • 批處理程式的容錯不使用檢查點。通過完全重放流來恢復。這是可能的,因為輸入是有限的。這將成本更多推向recovery,但是使常規地處理更便宜,因為它避免了檢查點。

  • DataSet API中的有狀態操作使用簡化的記憶體/外核數據結構,而不是鍵/值索引。

  • DataSet API引入了特殊的同步(超級)iterations,這隻能在有界的流上進行。有關詳細信息,請查看iterations文檔


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux系統成功的關鍵因素之一就是具有與其他操作系統和諧共存的能力。Linux系統的文件系統由兩層結構構建:第一層是虛擬文件系統(VFS),第二層是各種不同的具體的文件系統。 VFS就是把各種具體的文件系統的公共部分抽取出來,形成一個抽象層,是系統內核的一部分,它位於用戶程式和具體的文件系統之間。 ...
  • 使用的centos版本為 7.5 首先我們要把jdk拷到linux中,這裡我們藉助XShell工具,我們先來看看Xshell的用法 打開Xshell 後點擊文件,“新建“,如下圖: 起一個名稱,主機填寫linux的的IP地址,打開終端 輸入 ifconfig即可查看ip地址 紅色箭頭指向的地方就是l ...
  • 本文所述MongoDB版本為4.0.5,筆者對MongoDB剛接觸,對各個版本的MongoDB不甚瞭解,本文不對該版本的MongoDB做特性介紹,所涉及命令也許對其餘版本不適用。 因為目前有一個試驗性的項目想要使用NoSQL,而MongoDB在工作中有一定的接觸,所以這個項目打算使用MongoDB ...
  • information_schema 此資料庫是MySQL資料庫自帶的,主要存儲資料庫的元數據,保存了關於MySQL伺服器維護的所有其他資料庫的信息,如資料庫名、資料庫表、表列的數據類型及訪問許可權等。 這個庫在很多情況下,可以幫助我們做一些自動化處理的工作,比如巡檢程式找到所有的MyISAM表,或者 ...
  • 查詢性能低下最基本的原因是訪問的數據太多。某些查詢不可避免的需要篩選大量數據,但這並不常見。大部分性能低下的查詢都可以通過減少訪問的數據量的方式進行優化 ...
  • 第一題:求單月訪問次數和總訪問次數 1.數據說明 (1)欄位數據說明 (2)數據格式 2.數據準備 (1)創建表 (2) 導入數據 (3) 驗證數據 3.結果需求 4.思路分析 (1)先求出用戶每個月的訪問次數 (2)利用其之前創建的視圖,利用視窗函數就可以擺脫select後面的欄位必須出現在gro ...
  • Sqoop 本文所使用的Sqoop版本為1.4.6 1.官網 ...
  • 分頁從資料庫返回一張表的某些條數據 假設我需要查詢 系統表 sys.all_columns中的數據,每次查詢10條 第一次查詢第1-10條數據 第二次查詢第11-20條數據 第三次查詢第21-30條數據 ......以此類推 於是我想到了sqlserver的ROW_NUMBER()排序函數,可以根據 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...