Flink介紹——實時計算核心論文之Dataflow論文總結

數據流處理的演變與 Dataflow 模型的革新

在大數據處理領域,流式數據處理系統的發展歷程充滿了創新與變革。從早期的 S4 到 Storm,再到 MillWheel,每一個系統都以其獨特的方式推動了技術的進步。S4 以其無中心架構和 PE(Processing Element)為核心,實現了分布式數據處理的基本框架。Storm 則通過中心化的架構,定義了 Spout 和 Bolt 的角色,使得數據流的發送與處理更加清晰和高效。而 MillWheel 在此基礎上更進一步,引入了 Computation、Stream、Key 等概念,并通過 Timer 和 State 來處理持久化狀態和時鐘差異問題。

這些系統雖然在實現和接口上各有不同,但它們共同采用了有向無環圖(DAG)模型來構建數據處理流程。在這樣的架構下,數據以流的形式在各個處理節點之間傳遞,每個節點負責特定的處理任務。然而,這些系統更多地是從具體實現的角度出發,定義了各自的邏輯和處理方式,而缺乏一個統一的、抽象的模型來指導流式數據處理的設計與實現。

Dataflow 模型的提出

2015 年,Google 發表了《The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale, Unbounded, Out-of-Order Data Processing》論文,提出了 Dataflow 模型,旨在從抽象層面重新定義流式數據處理。這一模型不僅融合了批處理和流處理的特點,還通過引入新的時間和窗口概念,為處理大規模、無邊界、亂序數據集提供了強大的理論基礎和實踐指導。

Dataflow 模型的核心在于其基礎計算模型,該模型僅包含兩個關鍵概念:ParDo 和 GroupByKey。ParDo(Parallel Do)相當于 MapReduce 中的 Map 階段,負責對輸入數據進行并行處理。每個輸入數據項都會被一個稱為 DoFn 的處理函數處理,且這些處理過程會在多臺機器上并行執行。GroupByKey 則類似于 MapReduce 中的 Shuffle 操作,它將所有具有相同 Key 的數據匯總到一起,以便后續處理。在 Dataflow 中,數據被抽象為 key-value 對,ParDo 的輸入和輸出都是 key-value 對,而 GroupByKey 則將相同 Key 的數據分組,為后續的 ParDo 處理提供基礎。

通過 ParDo 和 GroupByKey 的組合使用,Dataflow 能夠構建多層數據處理流程,類似于將多個 MapReduce 過程串聯在一起。例如,在統計廣告展示次數超過 100 萬次的廣告時,可以先通過 ParDo 解析日志并輸出(廣告 ID,1)這樣的 key-value 對,再通過 GroupByKey 將相同廣告 ID 的數據分組,接著利用 ParDo 統計每個廣告 ID 的展示次數,最后再次使用 ParDo 過濾掉展示次數不足的廣告。

流批一體的實現

Dataflow 模型的一個顯著優勢在于其對流批一體的支持。在傳統的數據處理觀念中,批處理和流處理被看作兩種截然不同的處理方式。批處理針對有邊界的數據集,而流處理針對無邊界的數據流。然而,Dataflow 模型指出,這種區分并非絕對,批處理可以被視為流處理的一種特殊情況。

在 Dataflow 中,輸入數據集可以是無邊界的,隨著時間的推移不斷有新的數據加入。這種設計使得 Dataflow 能夠處理持續增長的實時數據,同時也能夠處理預先確定的有邊界數據。例如,一份固定大小的日志文件可以被放置在 Kafka 中,通過重放的方式交給 Storm 的 Topology 來處理,這實際上是使用流處理的方式處理有邊界的數據。反之,對于不斷增長的實時數據,也可以通過定時執行 MapReduce 任務或使用類似 Spark Streaming 的微批處理方式來處理。

Dataflow 模型通過引入時間維度,將批處理和流處理統一起來。在這種模型下,當批處理的記錄數被限制為每批一條時,它就轉變成了流處理。同樣,MapReduce 中的有邊界數據集也可以被視為 Dataflow 中的無邊界數據集的特例。這一思想的提出,為數據處理領域帶來了新的視角,使得開發者能夠以更加統一的方式構建數據處理管道,而不必在批處理和流處理之間做出嚴格的區分。

時間窗口的分配與合并

在流式數據處理中,時間窗口是一個關鍵的概念。Dataflow 模型通過引入固定窗口、滑動窗口和會話窗口等不同的窗口類型,為數據統計提供了靈活的時間維度支持。

固定窗口將數據按照固定的時間間隔劃分,例如每小時統計一次廣告展示數量。滑動窗口則隨著時間的推移而滑動,例如統計過去 2 分鐘的廣告展示數量,其窗口大小為 2 分鐘,滑動周期可以是 1 分鐘。會話窗口則用于統計用戶的會話,通過設置兩次事件之間的超時時間來定義會話的開始和結束。

Dataflow 模型通過 AssignWindows 和 MergeWindows 兩個關鍵函數來實現時間窗口的分配與合并。在業務處理函數之前,每個原始事件都被表示為(key, value, event_time)三元組。AssignWindows 函數將這些三元組轉換為(key, value, event_time, window)四元組,為每個事件分配一個或多個時間窗口。例如,一個廣告在 12:01 展示給用戶,該事件可能會被分配到 [12:00, 12:02) 和 [12:01, 12:03) 兩個時間窗口中。

MergeWindows 函數則負責合并具有重疊部分的時間窗口。以客服聊天系統為例,如果用戶和客服之間超過 30 分鐘沒有互動,則認為會話結束。對于同一用戶下的多個事件,如果它們的窗口之間有重疊部分,就會被合并成一個更大的時間窗口。這種窗口分配與合并機制使得 Dataflow 能夠處理亂序數據,確保計算結果的準確性,并且能夠將計算過程中的中間結果作為狀態持久化,以便后續的增量計算。

觸發器和增量數據處理

在流式數據處理中,確定何時輸出計算結果是一個關鍵問題。MillWheel 通過低水位(Low Watermark)來判斷是否所有應處理的事件都已經處理完畢,從而決定是否向下游發送計算結果。然而,這種方法在實踐中面臨兩個主要問題:一是水位標記后仍有新日志到達,導致已發送的計算結果不準確;二是水位標記可能因個體延遲日志而過低,導致計算結果無法及時發送。

Dataflow 模型通過引入觸發器(Trigger)機制解決了這些問題。觸發器借鑒了 Lambda 架構的核心思想,允許系統盡快輸出初步計算結果,并在后續根據新數據不斷修正結果。與 MillWheel 中僅基于定時器的觸發方式不同,Dataflow 的觸發器可以基于多種參數組合,如處理時間、記錄數等,并且支持用戶自定義觸發器邏輯。

觸發器還支持三種輸出策略:拋棄(Discarding)、累積(Accumulating)和累積并撤回(Accumulating & Retracting)。

  • 拋棄策略在觸發后丟棄窗口內的數據,適合對存儲空間要求較高的場景;
  • 累積策略則保留窗口數據,允許后續數據到達時重新計算并更新結果;
  • 累積并撤回策略不僅更新結果,還撤回之前的計算結果,確保計算的正確性,但在實現上更具挑戰性。

例如,在客服會話場景中,如果后續接收到新的日志導致會話窗口合并,系統需要撤回之前發送的錯誤會話窗口,并發送新的正確會話窗口。

Dataflow 模型的優勢與局限性

Dataflow 模型通過抽象時間和窗口概念,為流式數據處理提供了強大的理論基礎和實踐指導。它將批處理和流處理統一起來,支持亂序數據處理,并通過觸發器和增量處理機制提高了數據處理的靈活性和效率。Dataflow 模型不僅適用于 Google 內部的大規模數據處理需求,還推動了 Apache Beam 等開源項目的發展,促進了流處理技術的標準化和普及。

然而,Dataflow 模型并非完美無缺。例如,其復雜性可能對某些簡單應用場景造成過度設計,增加了開發和維護成本。此外,模型對底層存儲和計算資源的依賴可能會限制其在某些環境中的適用性。在實際應用中,開發者需要根據具體的業務需求和技術條件權衡模型的選擇和實現方式。

Dataflow 模型的實際應用與影響

Dataflow 模型的實際應用已經證明了其在處理大規模數據集方面的優勢。Google 的 Cloud Dataflow 服務就是基于這一模型構建的,它允許用戶以統一的方式處理批和流數據。Cloud Dataflow 提供了高度的靈活性和可擴展性,使得企業能夠快速構建和部署數據處理管道,滿足實時數據分析的需求。

此外,Dataflow 模型對開源社區也產生了深遠的影響。Apache Beam 項目就是其中一個典型的例子。Apache Beam 提供了一個統一的編程模型,使得開發者可以在不同的執行引擎上運行 Dataflow 程序。這種統一性減少了開發者的負擔,使得他們能夠專注于業務邏輯的實現,而不必擔心底層技術細節。

Dataflow 模型的未來展望

隨著大數據技術的不斷發展,Dataflow 模型有望在以下幾個方面得到進一步的發展和應用:

更強的實時性支持

未來,Dataflow 模型可能會進一步優化其觸發器機制,以支持更低延遲的實時數據處理。這將使得系統能夠更快地響應數據變化,滿足對實時性要求更高的應用場景。

更豐富的窗口類型與時間語義

雖然 Dataflow 模型已經支持多種窗口類型,但隨著業務需求的多樣化,未來可能會引入更多的時間語義和窗口類型,以滿足復雜的業務場景要求。

更高效的數據處理引擎

為了應對大規模數據處理的挑戰,未來可能會出現更高效的數據處理引擎,這些引擎將在資源利用率和處理速度上取得更大的突破,進一步推動 Dataflow 模型的應用。

更廣泛的行業應用

Dataflow 模型的應用將不僅限于互聯網行業,還將在金融、醫療、物聯網等多個領域得到廣泛應用。這些行業的數據處理需求將持續推動模型的演進和完善。

結論

隨著技術的不斷發展,Google 基于其提出的 Dataflow 編程模型,成功孵化了 Apache Beam 項目。這一項目具有里程碑意義,它不僅推動了流處理技術的標準化,還為開發者提供了一個統一的編程模型,以便在不同的執行引擎上進行數據處理。Dataflow 模型的提出,標志著 Google 在大數據處理領域的又一次創新嘗試,它將大數據流式處理抽象為三個核心概念:能夠處理亂序數據并按事件發生時間計算時間窗口的模型、根據多維度特征決定計算結果輸出時機的觸發器模型,以及將數據更新和撤回與前述模型相集成的增量處理策略。這一模型的出現,為處理無邊界的大數據集提供了全新的視角和方法。

Dataflow 論文的發表,體現了 Google 在大數據處理領域的深度思考和前瞻性。與傳統的關注具體系統實現的論文不同,Dataflow 更側重于從模型的角度探討如何對無邊界的大數據處理進行有效抽象。它不僅為流式數據處理提供了一個高度抽象的框架,還啟發了后續眾多數據處理系統的設計與實現。

Dataflow 模型的影響力不僅限于理論層面,更在實際應用中得到了廣泛的驗證和推廣。Google Cloud Dataflow 服務就是該模型的一個成功應用,它允許用戶以統一的方式處理批和流數據,提供了高度的靈活性和可擴展性。此外,Apache Beam 項目也在開源社區中引起了廣泛關注,它實現了 Dataflow 的接口,使得開發者可以在不同的執行引擎上運行 Dataflow 程序,極大地降低了開發者的負擔,提高了開發效率。

Dataflow 模型的提出,與 MapReduce 模型有著異曲同工之妙。正如 MapReduce 作為一個抽象的計算模型,其影響力遠超 Google 的原版 C++ 實現,Hadoop 等開源項目對 MapReduce 的實現和推廣功不可沒。同樣,Dataflow 模型不僅提供了一個全新的計算框架,還通過推動 Apache Beam 項目,促進了流式數據處理接口的統一。這意味著,無論底層實現如何,只要遵循 Dataflow 的語義并實現相應的接口,開發者就能夠編寫出能夠在不同系統上運行的代碼,實現相同的計算結果。這種跨系統的兼容性和可移植性,為大數據處理技術的發展帶來了新的活力。

總的來說,Dataflow 模型不僅是一個創新的計算模型,更是 Google 在大數據處理領域多年經驗的結晶。它為流式數據處理提供了一個強大的理論基礎和實踐指南,推動了整個行業的發展和技術進步。隨著數據規模的不斷增長和業務需求的日益復雜,Dataflow 模型的重要性將愈發凸顯,它將繼續為開發者和企業提供高效、可靠的數據處理解決方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903237.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Arduino 入門學習筆記(五):KEY實驗

Arduino 入門學習筆記(五):KEY實驗 開發板:正點原子ESP32S3 例程源碼在文章頂部可免費下載(審核中…) 1. GPIO 輸入功能使用 1.1 GPIO 輸入模式介紹 在上一文章中提及到 pinMode 函數, 要對…

Centos9安裝docker

1. 卸載docker 查看是否安裝了docker yum list | grep docker卸載老版本docker,拷貝自官網 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine卸載新版本…

Pgvector+R2R搭建RAG知識庫

背景 R2R是一個采用Python編寫的開源AI RAG框架項目,與PostgreSQL技術棧集成度高,運行需求資源少(主要是本人的Macbook air m1內存只有8G)的特點,對部署本地私有化化AI RAG應用友好。 Resource Recommendations Whe…

go中redis使用的簡單介紹

目錄 一、Redis 簡介 二、Go中Redis的使用 1. 安裝Go Redis包 2. 單機模式 連接示例 3. 哨兵模式 依賴 連接示例 三、Redis集群 1. 集群模式 集群部署 部署結構 使用redis-cli創建集群 連接示例 四、常用數據結構與操作 1. 字符串(String&#xff0…

北京工業大學25計專上岸經驗分享

1.個人情況介紹 本科就讀于河北雙非,專業為計算機科學與技術,四級三次498,六級兩次460,拿過幾次校級獎學金,競賽經歷有藍橋杯國三、數學競賽省二。本科成績排名靠前,保研保7排8,遺憾選擇考研繼…

在 Ubuntu 24.04 系統上安裝和管理 Nginx

1、安裝Nginx 在Ubuntu 24.04系統上安裝Nginx,可以按照下面的步驟進行: 1.1、 更新系統軟件包列表 在安裝新軟件之前,需要先更新系統的軟件包列表,確保獲取到最新的軟件包信息。打開終端,執行以下命令: …

HarmonyOS4+NEXT星河版入門與項目實戰(26)-----版本控制與代碼托管

引言 隨著移動應用開發技術的不斷進步,華為推出的鴻蒙操作系統(HarmonyOS)以及其配套的集成開發環境DevEco Studio逐漸成為開發者關注的焦點。對于新手開發者來說,掌握版本控制和代碼托管不僅是提高工作效率的關鍵,也是團隊協作的重要基礎。本文將介紹如何在使用DevEco S…

利用Arcgis自己繪制shp文件

1.選擇自己想要創建的shp文件的位置 我是直接創建在連接文件夾中 2.右鍵-新建-shp 3.設置名稱、要素類型、空間參考 4、點擊創建要素 5、右側選擇圖層、創建面 6、開始繪制,雙擊任意位置結束繪制 之后可以改一下shp文件的名字

【C/C++】深入理解指針(六)

文章目錄 深入理解指針(六)1.sizeof和strlen的對比1.1 sizeof1.2 strlen1.3 sizeof和strlen的對? 2.數組和指針筆試題解析2.1 ?維數組2.2 字符數組代碼1:代碼2:代碼3:代碼4:代碼5:代碼6: 2.3 ?維數組 3.…

探索大語言模型(LLM):語言模型從海量文本中無師自通

文章目錄 引言:當語言模型學會“自己教自己”一、自監督學習:從“無標簽”中挖掘“有監督”信號二、語言模型的自監督訓練范式:兩大經典路徑1. 掩碼語言模型(Masked Language Modeling, MLM)——以BERT為例2. 自回歸語…

2025.5.4機器學習筆記:PINN文獻閱讀

2025.5.4周報 文獻閱讀題目信息摘要創新點網絡架構實驗結論不足以及展望 文獻閱讀 題目信息 題目: Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊: Journal o…

Unity Post Processing 小記 【使用泛光實現燈光亮度效果】

一、前言 本篇適用于Unity 2018 - 2019及以上版本,以默認渲染管線為例。文章內容源于個人研究嘗試與網絡資料收集,可能存在不準確之處。初衷是因新版本制作時老的Bloom插件失效,經研究后分享開啟Bloom效果的方法。若在項目中使用Post Proces…

牟乃夏《ArcGIS Engine地理信息系統開發教程》學習筆記3-地圖基本操作與實戰案例

目錄 一、開發環境與框架搭建 二、地圖數據加載與文檔管理 1. 加載地圖文檔(MXD) 2. 動態添加數據源 三、地圖瀏覽與交互操作 1. 基礎導航功能 2. 書簽管理 3. 量測功能 四、要素選擇與屬性查詢 1. 屬性查詢 2. 空間查詢 五、視圖同步與鷹眼…

Qt指ModbusTcp協議的使用

Modbus 是一套通信“語言”(協議),而 RS485 / RS232 / TCP 是通信“管道”(物理接口)。 編寫modubusTcp程序,避免不了調試,首先用到的兩個工具助手 poll是主機,slave是從機。主機也就是發送數據…

探索大語言模型(LLM):自監督學習——從數據內在規律中解鎖AI的“自學”密碼

文章目錄 自監督學習:從數據內在規律中解鎖AI的“自學”密碼一、自監督學習的技術內核:用數據“自問自答”1. 語言建模:預測下一個單詞2. 掩碼語言模型(MLM):填補文本空缺3. 句子順序預測(SOP&a…

CentOS7.9安裝Python 3.10.11并包含OpenSSL1.1.1t

1. 安裝編譯 Python 所需的依賴包 yum -y install gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel wget2. 安裝 OpenSSL 1.1.1 或更新版本 (自定義路徑安裝的 OpenSSL 1.1.1 不會影響系統原有的…

qt事件過濾與傳遞機制

當點擊 QLabel 時,正常情況下并不會直接觸發 MyWidget 的 mousePressEvent 函數,原因在于事件的傳遞機制和事件過濾器的存在。下面詳細分析這個過程: 事件傳遞機制 在 Qt 里,事件的傳遞是從子控件往父控件冒泡的。不過&#xff…

ubuntu 安裝ollama后,如何讓外網訪問?

官網下載linux版本:https://ollama.com/download/linux 1、一鍵安裝和運行 curl -fsSL https://ollama.com/install.sh | sh 2、下載和啟動deepseek-r1大模型 ollama run deepseek-r1 這種方式的ollama是systemd形式的服務,會隨即啟動。默認開啟了 …

kotlin與MVVM結合使用總結(三)

1. MVVM 架構詳細介紹及源碼層面理解 整體架構 MVVM(Model - View - ViewModel)架構是為了解決視圖和數據模型之間的耦合問題而設計的。它通過引入 ViewModel 作為中間層,實現了視圖和數據的分離,提高了代碼的可維護性和可測試性…

A系統使用iframe嵌套B系統時登錄跨域問題!

我這邊兩個項目都是獨立的,問題是做了跨域配置之后點擊登錄接口調用成功但是頁面沒有跳轉進去 顯示以下報錯 這個錯誤明確指出了問題的核心原因:由于跨站點Cookie設置未正確聲明SameSiteNone,導致瀏覽器攔截了Cookie。這是現代瀏覽器&#x…