Flink時間窗口詳解

一、引言

在大數據流處理的領域中,Flink 的時間窗口是一項極為關鍵的技術,想象一下,你要統計一個電商網站每小時的訂單數量。由于訂單數據是持續不斷產生的,這就形成了一個無界數據流。如果沒有時間窗口的概念,你就需要處理無窮無盡的數據,難以進行有效的統計分析。而時間窗口的作用,就是將這無界的數據流按照時間維度切割成一個個有限的 “數據塊”,方便我們對這些數據進行處理和分析。比如,我們可以定義一個 1 小時的時間窗口,將每小時內的訂單數據劃分到同一個窗口中,然后對這個窗口內的數據進行統計,就能得到每小時的訂單數量。?

簡單來說,時間窗口就是在流處理中,按照時間范圍對數據進行分組的一種機制。通過這種機制,我們可以將連續的數據流分割成離散的時間片段,針對每個時間片段內的數據進行聚合、計算等操作,從而實現對無界數據流的有效處理。

二、Flink 中的時間概念?

在深入了解 Flink 的時間窗口之前,我們先來認識一下 Flink 中重要的時間概念,主要包括事件時間(Event Time)、處理時間(Processing Time)和攝入時間(Ingestion Time)。?

2.1 事件時間(Event Time)?

事件時間是指事件實際發生的時間 ,它通常由事件中的時間戳表示。比如,在電商系統中,用戶下單的那一刻,這個訂單事件就產生了一個時間戳,這個時間戳就是事件時間。它反映的是事件真實發生的先后順序,與數據進入 Flink 系統的時間以及 Flink 處理數據的時間都無關。?

使用事件時間能夠讓我們獲得最符合實際業務情況的結果 ,因為它基于事件實際發生的時間進行處理。但在實際應用中,由于網絡延遲、系統負載等各種因素,數據可能會亂序到達 Flink 系統,甚至有些數據還會遲到很久。比如,在網絡擁塞時,后下單的訂單數據可能先到達 Flink 系統,而先下單的訂單數據卻延遲到達。為了解決這些問題,Flink 引入了水位線(Watermark)機制,通過設置水位線來處理數據的亂序和延遲,確保計算結果的準確性 。?

2.2 處理時間(Processing Time)?

處理時間是指數據在 Flink 算子中被處理的時間 ,也就是基于處理機器的系統時鐘的時間。例如,當一個訂單數據進入 Flink 的某個算子進行計算時,該算子獲取當前機器的系統時間作為處理時間。?

處理時間是最簡單的時間概念,它不需要考慮數據的亂序和延遲問題,因為它只關注數據在算子中被處理的那一刻的時間。基于處理時間進行計算,Flink 能夠提供最佳的性能和最低的延遲 ,因為它不需要額外的時間戳提取和水位線生成等操作。然而,在分布式環境中,多臺機器的系統時鐘無法做到嚴格一致,這就導致處理時間無法提供確定性的保障 。比如,不同的 Flink 節點處理相同的數據時,由于機器時鐘的差異,可能會將相同的數據劃分到不同的時間窗口中,從而導致計算結果的不確定性。?

2.3 攝入時間(Ingestion Time)?

攝入時間是指數據進入 Flink 系統的時間 ,它在數據源算子處被分配時間戳。當訂單數據從 Kafka 等數據源進入 Flink 系統時,Flink 會在數據源算子處記錄下數據進入的時間作為攝入時間。?

攝入時間介于事件時間和處理時間之間 ,它比處理時間更具可預測性,因為它在數據源處就確定了時間戳,而不是在每個算子處理時才確定。與事件時間相比,攝入時間不能處理任何亂序事件或遲到的數據 ,因為它只是簡單地記錄數據進入系統的時間,無法像事件時間那樣通過水位線機制來處理亂序和延遲問題。不過,在一些對數據準確性要求不是特別高,且數據相對有序的場景下,攝入時間也是一種不錯的選擇,它可以在一定程度上簡化處理邏輯。

三、Flink 時間窗口類型?

Flink 提供了多種類型的時間窗口,以滿足不同的業務需求 。常見的時間窗口類型有滾動窗口滑動窗口會話窗口 。?

3.1 滾動窗口(Tumbling Windows)?

滾動窗口具有固定的大小,并且不會重疊 。就像我們切蛋糕一樣,將連續的數據流按照固定的時間間隔切成一塊一塊的,每一塊就是一個滾動窗口。例如,我們設置一個 5 分鐘的滾動窗口,那么數據就會被劃分成一個個 5 分鐘的窗口,每個窗口內的數據是獨立處理的,前一個窗口結束后,緊接著開始下一個窗口 ,不存在窗口之間的重疊部分。?

在實際應用中,滾動窗口非常適合對固定時間間隔內的數據進行聚合計算的場景。比如,統計每小時的網站訪問量,每 15 分鐘的訂單數量等。通過滾動窗口,我們可以很方便地對這些固定時間段內的數據進行統計分析,得到我們想要的結果 。?

下面是使用 Java 代碼實現滾動窗口操作的示例 :

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;public class TumblingWindowExample {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 從socket讀取數據DataStreamSource<String> streamSource = env.socketTextStream("localhost", 9999);// 將讀取到的數據轉換為Tuple2<String, Integer>類型,這里假設輸入數據是"key,value"格式SingleOutputStreamOperator<Tuple2<String, Integer>> dataStream = streamSource.map(new MapFunction<String, Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> map(String value) throws Exception {String[] fields = value.split(",");return new Tuple2<>(fields[0], Integer.parseInt(fields[1]));}});// 按照key分組,并使用滾動窗口,窗口大小為5秒dataStream.keyBy(t -> t.f0).window(TumblingProcessingTimeWindows.of(Time.seconds(5))).sum(1).print();env.execute("Tumbling Window Example");}
}

在這個示例中,我們從 socket 讀取數據,將數據轉換為Tuple2<String, Integer>類型,然后按照Tuple2中的第一個元素(即key)進行分組 。接著,我們使用TumblingProcessingTimeWindows.of(Time.seconds(5))來定義一個 5 秒大小的滾動窗口,對每個窗口內的數據按照第二個元素(即value)進行求和操作 ,最后將結果打印輸出 。?

3.2 滑動窗口(Sliding Windows)?

滑動窗口同樣具有固定的大小,但與滾動窗口不同的是,它可以有重疊 。滑動窗口就像是在數據流上滑動的一個固定大小的框,每次滑動的距離(即滑動間隔)可以自定義 。比如,我們設置一個窗口大小為 10 分鐘,滑動間隔為 5 分鐘的滑動窗口 。那么,第一個窗口是從 0 分鐘到 10 分鐘,第二個窗口是從 5 分鐘到 15 分鐘,第三個窗口是從 10 分鐘到 20 分鐘,以此類推 。可以看到,每個窗口之間有 5 分鐘的重疊部分 。?

滑動窗口的這種特性,使得它非常適合對最近一個時間段內的數據進行統計分析 。比如,計算某接口最近 5 分鐘的失敗率來決定是否要報警,或者統計股票價格在最近 30 分鐘內的波動情況等 。通過設置合適的窗口大小和滑動間隔,我們可以更靈活地捕捉到數據的變化趨勢 。

3.3 會話窗口(Session Windows)?

會話窗口是根據活動間隙來劃分的 ,它沒有固定的開始時間和結束時間 。當一段時間內沒有接收到新數據時,就會認為會話結束,從而生成一個新的窗口 。比如,在用戶行為分析中,如果一個用戶在一段時間內沒有任何操作,那么就可以認為這個用戶的當前會話結束,后續的操作會開啟一個新的會話窗口 。?

會話窗口的這種特性,使其在處理用戶行為數據、會話相關的數據時非常有用 。通過設置合適的間隙時間,我們可以準確地捕捉到用戶的會話行為,分析用戶在不同會話中的行為模式 。?

下面是使用 Java 代碼實現會話窗口操作的示例 :

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.time.Time;public class SessionWindowExample {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 從socket讀取數據DataStreamSource<String> streamSource = env.socketTextStream("localhost", 9999);// 將讀取到的數據轉換為Tuple2<String, Integer>類型,這里假設輸入數據是"key,value"格式SingleOutputStreamOperator<Tuple2<String, Integer>> dataStream = streamSource.map(new MapFunction<String, Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> map(String value) throws Exception {String[] fields = value.split(",");return new Tuple2<>(fields[0], Integer.parseInt(fields[1]));}});// 按照key分組,并使用會話窗口,設置間隙時間為5秒dataStream.keyBy(t -> t.f0).window(ProcessingTimeSessionWindows.withGap(Time.seconds(5))).sum(1).print();env.execute("Session Window Example");}
}

在這個示例中,我們從 socket 讀取數據并轉換為Tuple2<String, Integer>類型 。按照Tuple2中的第一個元素(即key)進行分組 ,使用ProcessingTimeSessionWindows.withGap(Time.seconds(5))來定義一個間隙時間為 5 秒的會話窗口 。對每個窗口內的數據按照第二個元素(即value)進行求和操作 ,最后將結果打印輸出 。如果在 5 秒內沒有新數據到達,那么當前會話窗口結束,新的數據會被分配到新的會話窗口中 。

四、Flink 時間窗口與其他流處理框架對比?

與 Spark Streaming 對比?

在流處理領域,Spark Streaming 曾經也是備受矚目的框架,它與 Flink 在時間窗口處理等方面存在諸多不同 。?

從時間處理能力來看,Spark Streaming 主要基于處理時間(Processing Time)進行窗口操作 ,這使得它在處理數據時相對簡單直接 。但在面對復雜的業務場景,特別是數據亂序到達的情況時,它的處理能力就顯得有些力不從心 。因為它缺乏像 Flink 那樣對事件時間(Event Time)的原生支持,無法有效地處理亂序數據和延遲數據 。而 Flink 不僅支持處理時間,還提供了強大的事件時間處理能力,通過水位線(Watermark)機制,能夠很好地處理數據的亂序和延遲問題,確保計算結果的準確性 。比如在電商訂單統計中,如果訂單數據因為網絡等原因亂序到達,Flink 能夠基于事件時間準確地統計出每個時間段的訂單數量,而 Spark Streaming 可能會因為時間處理的局限性導致統計結果不準確 。?

在窗口操作方面,Spark Streaming 基于微批處理模型,通過將數據流劃分為小的微批次,然后在這些微批次上執行批處理操作來實現窗口處理 。這種方式在實現一些簡單的滾動窗口和滑動窗口操作時是可行的 。然而,當涉及到復雜的窗口操作,如會話窗口,或者需要對窗口進行更靈活的自定義操作時,就會變得非常困難 。Flink 則提供了豐富且靈活的窗口操作支持,除了常見的滾動窗口、滑動窗口外,還支持會話窗口,并且允許用戶自定義窗口函數 。這使得開發者可以根據具體的業務需求,更加自由地定義和操作窗口 。例如,在用戶行為分析中,Flink 的會話窗口可以根據用戶的活動間隙準確地劃分會話,而 Spark Streaming 在處理類似場景時則需要更多的額外工作 。?

性能方面,Spark Streaming 的微批處理模式在處理大規模數據流時,能夠利用 Spark 強大的批處理引擎,實現較高的吞吐量 。但是,由于它需要將數據收集到一定量后形成微批次再進行處理,這就不可避免地引入了一定的延遲 。對于一些對延遲要求較高,需要亞秒級響應的應用場景,Spark Streaming 可能無法滿足需求 。Flink 采用真正的流處理模型,數據在到達時立即被處理,具有更低的處理延遲 。同時,Flink 通過優化的內存管理和高效的算子執行,也能夠實現非常高的吞吐量 。在一些高并發、低延遲要求的場景,如金融交易系統、物聯網設備監控等,Flink 的性能優勢就能夠得到充分體現 。

五、總結?

在使用 Flink 時間窗口時,合理選擇事件時間、處理時間或攝入時間,能夠滿足不同業務場景下對時間語義的需求 。通過實際的代碼示例,我們也看到了如何在 Flink 中實現時間窗口操作,從數據源的定義、數據的轉換,到窗口的分配和計算,每一步都緊密相連,共同完成對數據流的實時處理和分析 。與其他流處理框架相比,Flink 在時間窗口處理方面展現出了強大的優勢,無論是對事件時間的原生支持,還是豐富靈活的窗口操作,都使得它能夠在復雜的業務場景中脫穎而出 。

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

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

相關文章

寬帶接入,網線插入電腦的經驗

現在一般家里安裝移動寬帶&#xff0c;都會提供四個千兆接口的光貓路由器&#xff0c;但是要注意了 首先網線的兩端看起來一樣&#xff0c;實際上并不是&#xff0c;如果發現連接不成功&#xff0c;那么就要換一頭重新嘗試&#xff0c; 一般像說什么自動DHCP啊&#xff0c;因為…

crmeb多門店對接拉卡拉支付小程序聚合收銀臺集成全流程詳解

一、商戶注冊與配置??注冊支付平臺賬號??&#xff1a;在拉卡拉開放平臺注冊商戶賬號&#xff08;私信聯系注冊&#xff09;??創建應用??&#xff1a;獲取小程序應用ID(AppID)??配置支付參數??&#xff1a;商戶號(MID)終端號(TID)API密鑰支付回調地址二、配置拉卡拉…

C#將樹圖節點展示到NetronLight圖表中

之前寫過NetronLight開源框架 C#使用開源框架NetronLight繪制流程圖-CSDN博客 我們這里將TreeView樹圖的節點內容展示到NetronLight圖表中&#xff0c;按照樹的層次【深度Level】展示 新建窗體應用程序ShowTreeNodeToDiagram&#xff0c;將默認的Form1重命名為FormShowNode&…

精密模具大深徑比微孔尺寸檢測方案 —— 激光頻率梳 3D 輪廓檢測

引言精密模具中大深徑比微孔&#xff08;深徑比&#xff1e;20:1&#xff0c;孔徑&#xff1c;1mm&#xff09;的尺寸精度直接影響注塑件、電子元件等產品的成型質量。此類微孔具有孔徑小、深度大、表面質量要求高&#xff08;Ra≤0.1μm&#xff09;等特點&#xff0c;傳統檢測…

defer學習指南

一、源頭&#xff1a;早期管理資源&#xff08;如數據庫連接、鎖、文件句柄、網絡連接&#xff09;和狀態清理異常麻煩。 必須在每個可能的返回點&#xff08;return、err、panic&#xff09;手動重復清理代碼&#xff0c;極易遺漏且打斷主要邏輯思路&#xff01;像Java語言雖然…

NLP_知識圖譜_大模型——個人學習記錄

1. 自然語言處理、知識圖譜、對話系統三大技術研究與應用 https://github.com/lihanghang/NLP-Knowledge-Graph 深度學習-自然語言處理(NLP)-知識圖譜&#xff1a;知識圖譜構建流程【本體構建、知識抽取&#xff08;實體抽取、 關系抽取、屬性抽取&#xff09;、知識表示、知…

linux:進程詳解(1)

目錄 ?編輯 1.進程基本概念與基本操作 1.1 概念 1.2 描述進程-PCB 1.2.1PCB的基本概念 1.2.2 task_ struct 1.2.3 查看進程 2.進程狀態 2.1 Linux內核源碼展示 2.2 進程狀態查看 ?編輯 2.3 Z(zombie)-僵?進程 2.4 僵尸進程的危害 2.5 孤兒進程 3.進程優先級 …

碳中和目標下的全球產業鏈重構:深度解析與未來路徑

引言&#xff1a;氣候臨界點與產業鏈的系統性風險2023年&#xff0c;全球平均氣溫較工業化前上升1.2℃&#xff0c;南極冰蓋年消融量達1500億噸&#xff0c;極端天氣事件導致的經濟損失占全球GDP的2.3%。這一系列數據背后&#xff0c;暴露出傳統產業鏈的致命缺陷——其設計邏輯…

FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120轉RGB奇…

新手向:使用Python構建高效的日志處理系統

本文將詳細講解如何使用Python開發一個專業的日志分析工具&#xff0c;能夠自動化處理、分析和可視化各類日志文件&#xff0c;大幅提升運維效率。環境準備開發本工具需要以下環境配置&#xff1a;Python環境&#xff1a;建議Python 3.8或更高版本必要庫&#xff1a;pandas&…

大模型-量化技術

簡介 模型量化是一種重要的模型壓縮技術。其核心目標是在可控精度損失下&#xff0c;將大模型中浮點型權重&#xff08;通常為 float32 等高精度格式&#xff09;近似轉換為低精度離散值表示&#xff08;通常為 int8&#xff09;。 具體而言&#xff0c;該技術通過將模型的權重…

【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時&#xff0c;第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼&#xff0c;但未必真正理解它的原理。 本篇博客將圍繞一個經典函數&#xff1a; char *host_to_ip(const char *hostna…

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時&#xff0c;?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點&#xff1a; ?路徑搜索不精確?&#xff1a;默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中&#xff0c;性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏&#xff0c;還是 goroutine 失控&#xff0c;都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具&#xff0c;就像一把精準的手術刀&#xff0c;能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題&#xff0c;結合SSD特性和fio測試原理 fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案&#xff1a; &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院&#xff08;IAAR-Shanghai&#xff09;的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架&#xff0c;可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言&#xff1a;開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源&#xff0c;標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時&#xff0c;文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…

LeetCode 2401.最長優雅子數組

給你一個由 正 整數組成的數組 nums 。 如果 nums 的子數組中位于 不同 位置的每對元素按位 與&#xff08;AND&#xff09;運算的結果等于 0 &#xff0c;則稱該子數組為 優雅 子數組。 返回 最長 的優雅子數組的長度。 子數組 是數組中的一個 連續 部分。 注意&#xff1a;長…

中華心法問答系統的解讀(1)

中華心法問答系統一、研究背景1. 研究意義2. 研究目的3. 信息檢索技術二、主要研究內容三、相關技術介紹1. Flask框架技術2. BERT模型&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;BERT解決的問題&#xff08;3&#xff09;BERT的核心結構a. 模型結構b. 預訓練任…