Apache Flink 的詳細介紹

Apache Flink 是一個開源的分布式流處理框架,專注于高吞吐、低延遲、 Exactly-Once 語義的實時數據處理,同時也支持批處理(將批數據視為有限流)。它廣泛應用于實時數據分析、實時 ETL、監控告警、欺詐檢測等場景,是當前大數據實時處理領域的核心框架之一。

一、Flink 的核心定位與設計理念

Flink 的核心定位是 **“流優先”(Stream-First)**,即把所有數據都視為流:

  • 實時流(Unbounded Stream):無界、持續產生的數據(如用戶行為日志、傳感器數據)。
  • 批處理流(Bounded Stream):有界、可終止的數據(如歷史日志文件)。

這種設計理念讓 Flink 能統一處理流和批場景,避免了傳統框架(如 Spark Streaming 基于微批處理)在實時性上的妥協。

二、核心特性

1. 高吞吐與低延遲
  • 基于增量計算內存管理優化,Flink 可支持每秒數百萬條記錄的處理,延遲可低至毫秒級(甚至亞毫秒級)。
  • 對比 Spark Streaming(微批處理,延遲通常在秒級),Flink 真正實現了 “流處理” 而非 “批模擬流”。
2. Exactly-Once 語義
  • 通過分布式快照(Checkpoint)?機制,確保數據處理結果在故障恢復后仍保持一致性(即每條數據僅被正確處理一次)。
  • 支持與外部系統(如 Kafka、MySQL)的 Exactly-Once 集成(需外部系統支持事務或 idempotent 寫入)。
3. 豐富的時間語義

Flink 是首個原生支持事件時間(Event Time)?的框架,解決了數據亂序、延遲到達的問題:

  • 事件時間:數據產生的時間(如日志中的 timestamp 字段),最貼近業務真實時間。
  • 處理時間:數據被 Flink 算子處理的時間(依賴系統時鐘,易受延遲影響)。
  • 攝入時間:數據進入 Flink 的時間(介于事件時間和處理時間之間)。

通過水印(Watermark)?機制,Flink 可基于事件時間觸發窗口計算(如 “統計過去 10 分鐘的訂單量”),即使數據亂序到達也能保證結果準確性。

4. 強大的狀態管理

Flink 允許算子(Operator)存儲和訪問中間狀態(如累計計數、聚合結果),支持:

  • 狀態類型
    • Keyed State:與 key 綁定的狀態(如按用戶 ID 分組的累計消費金額),支持 ValueState、ListState 等。
    • Operator State:算子實例級別的狀態(如 Kafka 消費者的 offset)。
  • 狀態后端:負責狀態的存儲、持久化和恢復:
    • MemoryStateBackend:狀態存于內存,適合測試(不持久化,故障丟失)。
    • FsStateBackend:狀態存于本地磁盤,元數據存于內存,適合中小規模狀態。
    • RocksDBStateBackend:狀態存于 RocksDB(嵌入式 KV 數據庫),支持增量 Checkpoint,適合大規模狀態(TB 級)。
5. 靈活的窗口機制

窗口是流處理的核心,Flink 支持多種窗口類型:

  • 時間窗口:基于時間劃分(如滾動窗口、滑動窗口、會話窗口)。
  • 計數窗口:基于數據條數劃分(如每 100 條數據一個窗口)。
  • 全局窗口:全量數據為一個窗口(需自定義觸發器)。

窗口可基于事件時間或處理時間觸發,且支持自定義窗口函數(如增量聚合、全量聚合)。

6. 容錯與可恢復性
  • Checkpoint:自動周期性生成分布式快照,記錄所有算子狀態和數據位置,故障后可從最近的 Checkpoint 恢復。
  • Savepoint:手動觸發的快照,用于版本升級、集群遷移等(語義與 Checkpoint 一致,但需手動管理)。

三、架構設計

Flink 采用主從架構,核心組件包括 Client、JobManager、TaskManager:

1. Client(客戶端)
  • 負責將用戶編寫的 Flink 程序(Job)編譯為執行計劃(Execution Plan),并提交給 JobManager。
  • 提交后可退出或保持連接(用于監控作業狀態)。
2. JobManager(主節點)
  • 核心職責:協調作業執行,包括資源申請、任務調度、Checkpoint 管理、故障恢復等。
  • 包含三個關鍵組件:
    • Dispatcher:接收客戶端提交的作業,啟動 JobMaster 并提供 Web UI 入口。
    • JobMaster:每個作業對應一個 JobMaster,負責將執行計劃轉換為物理計劃(Execution Graph),并調度到 TaskManager 執行。
    • ResourceManager:管理集群資源(如 TaskManager 的插槽 Slot),為作業分配資源。
3. TaskManager(從節點)
  • 核心職責:執行具體的任務(Task),并管理自身資源(內存、CPU)。
  • 每個 TaskManager 包含多個插槽(Slot),每個 Slot 對應一段固定內存資源,用于運行一個或多個子任務(Subtask)。
  • 任務鏈(Operator Chain):Flink 會將上下游算子合并為一個 Task(減少數據傳輸開銷),如 “Map -> Filter” 可合并為一個 Task。

四、部署模式

Flink 支持多種部署模式,適應不同集群環境:

1. Standalone 模式
  • 獨立部署的 Flink 集群,包含 JobManager 和 TaskManager 進程,適合測試或小規模生產。
2. YARN 模式
  • 集成 Hadoop YARN,由 YARN 管理資源:
    • Session Mode:啟動一個共享的 Flink 集群,多個作業共享資源(適合小作業)。
    • Per-Job Mode:每個作業啟動一個專屬 Flink 集群,作業結束后集群銷毀(資源隔離性好,適合大作業)。
    • Application Mode:應用程序入口在 YARN 集群內運行(減少客戶端壓力)。
3. Kubernetes 模式
  • 基于 K8s 部署,支持自動擴縮容、滾動升級,適合云原生環境。
4. 其他模式
  • Mesos 模式、AWS EMR 模式等,適應不同基礎設施。

五、編程模型與 API

Flink 提供多層 API,從低級到高級,滿足不同場景需求:

1. 低級 API:ProcessFunction
  • 最靈活的 API,可訪問事件時間、水印、狀態和定時器(Timer)。
  • 適合實現復雜業務邏輯(如基于狀態的動態規則匹配)。
  • 示例:KeyedProcessFunction?可處理按 key 分組的流,并通過定時器觸發延遲計算。
2. 核心 API:DataStream / DataSet
  • DataStream API:處理流數據(無界 / 有界),支持 map、filter、window、keyBy 等算子。
  • DataSet API:傳統批處理 API(基于有界數據),但目前已逐步被 DataStream API 的批處理模式替代(Flink 1.12+ 推薦用 DataStream 統一處理流和批)。
3. 高級 API:SQL / Table API
  • 基于 SQL 或類 SQL 的聲明式 API,適合分析師或業務人員使用。
  • 支持標準 SQL 語法(如 SELECT、GROUP BY、JOIN),以及自定義函數(UDF、UDTF)。
  • 與 DataStream/DataSet API 可無縫轉換(Table ? DataStream)。
4. 示例:DataStream 處理 Kafka 流
// 1. 創建執行環境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2. 讀取 Kafka 流(事件時間 + 水印)
DataStream<String> kafkaStream = env.addSource(new FlinkKafkaConsumer<>("user_log",new SimpleStringSchema(),kafkaConfig
)).assignTimestampsAndWatermarks(WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event, timestamp) -> parseTimestamp(event))
);// 3. 轉換處理(統計每小時的用戶數)
DataStream<Tuple2<String, Long>> result = kafkaStream.map(event -> parseUserId(event)) // 提取用戶ID.keyBy(userId -> userId).window(TumblingEventTimeWindows.of(Time.hours(1))) // 1小時滾動窗口.aggregate(new CountAggregate()); // 聚合計數// 4. 輸出到 MySQL
result.addSink(new JdbcSink<>(...));// 5. 執行作業
env.execute("UserCountPerHour");

六、連接器(Connectors)

Flink 提供豐富的連接器,支持與外部系統集成:

  • 消息隊列:Kafka、RabbitMQ、Pulsar 等(支持 Exactly-Once 讀寫)。
  • 存儲系統:HDFS、S3、HBase、Redis、Elasticsearch 等。
  • 數據庫:MySQL、PostgreSQL、MongoDB 等(通過 JDBC 或專用連接器)。
  • CDC 工具:Flink CDC(基于 Debezium)支持從 MySQL、PostgreSQL 等捕獲數據變更(CDC = Change Data Capture),常用于實時數據同步。

七、生態系統

Flink 生態圍繞核心引擎擴展,形成完整的實時數據處理棧:

  • Flink SQL Client:交互式 SQL 客戶端,支持提交 SQL 作業。
  • Flink Dashboard:Web UI 用于監控作業狀態、Checkpoint 進度、算子 metrics 等。
  • Flink Stateful Functions:基于函數的無服務器(Serverless)計算框架,簡化狀態管理。
  • Flink Kubernetes Operator:基于 K8s 管理 Flink 作業的生命周期。
  • 集成工具:與 Apache Hive(批處理)、Apache Iceberg(數據湖)、Prometheus(監控)等無縫集成。

八、與其他框架的對比

特性FlinkSpark StreamingStorm
處理模型原生流處理微批處理(Mini-Batch)原生流處理
延遲毫秒級(低)秒級(中)毫秒級(低)
吞吐量
Exactly-Once 語義支持(Checkpoint)支持(WAL + 冪等)僅 At-Least-Once
事件時間支持原生支持模擬支持(復雜)不支持
狀態管理強大(多狀態類型 + 后端)有限(RDD 緩存)弱(需手動管理)

九、應用場景

  1. 實時數據分析:實時計算用戶活躍度、商品銷量 TOP N 等。
  2. 實時 ETL:將 Kafka 流數據清洗、轉換后寫入數據倉庫(如 MySQL、Hive)。
  3. 監控告警:實時檢測系統指標(如 QPS 突降、錯誤率飆升)并觸發告警。
  4. 欺詐檢測:實時分析交易行為,識別異常模式(如異地登錄、大額轉賬)。
  5. 實時推薦:基于用戶實時行為更新推薦列表。

十、版本與社區

  • 最新穩定版:Flink 1.18(2023 年發布),支持 Python API 增強、K8s 原生集成優化等。
  • 社區活躍:由 Apache 基金會管理,貢獻者來自阿里巴巴、字節跳動、Netflix 等企業,中文資料豐富(阿里、字節有大量實踐分享)。

總結:Flink 憑借流優先的設計、Exactly-Once 語義、強大的狀態管理和豐富的生態,成為實時數據處理的首選框架,尤其適合對延遲和準確性要求高的場景。

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

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

相關文章

Qt 常用控件 - 5

Qt 常用控件 - 4https://blog.csdn.net/Small_entreprene/article/details/149830464 前文補充 QRadioButton&#xff08;單選按鈕&#xff09; QRadioButton 是單選按鈕&#xff0c;允許在多個選項中選擇一個。作為 QAbstractButton 和 QWidget 的子類&#xff0c;前面介紹…

vue的響應式原理

Vue.js 的響應式原理是其核心特性之一&#xff0c;使得數據變化能夠自動更新到視圖。Vue 的響應式系統主要依賴于 Object.defineProperty&#xff08;在 Vue 2.x 中&#xff09;和 Proxy&#xff08;在 Vue 3.x 中&#xff09;來實現數據的觀察和更新。以下是對 Vue 響應式原理…

【AI論文】PixNerd:像素神經場擴散

摘要&#xff1a;擴散變換器目前所取得的成功在很大程度上依賴于預訓練變分自編碼器&#xff08;VAE&#xff09;所塑造的壓縮潛在空間。然而&#xff0c;這種兩階段訓練模式不可避免地會引入累積誤差和解碼偽影。為解決上述問題&#xff0c;研究人員選擇回歸像素空間&#xff…

Java中的LambdaMetafactory:動態生成Lambda的底層黑魔法

引言 在Java 8中&#xff0c;Lambda表達式作為最引人注目的新特性之一被引入。但你是否曾好奇過&#xff0c;這些簡潔的Lambda表達式在底層是如何實現的&#xff1f;這就是LambdaMetafactory發揮作用的地方。作為Java語言中一個不太為人所知但極其重要的類&#xff0c;LambdaMe…

看不見的偽造痕跡:AI時代的鑒偽攻防戰

在生成式人工智能飛速發展的今天&#xff0c;“眼見為實”這句話的有效性正面臨前所未有的挑戰。以往&#xff0c;圖像篡改往往通過傳統的圖像處理工具&#xff08;如 Photoshop&#xff09;進行&#xff0c;需要較高的技術門檻和人工成本&#xff1b;而現在&#xff0c;僅需通…

《React+TypeScript實戰:前端狀態管理的安全架構與性能優化深解》

當用戶在界面上進行表單提交、數據篩選等操作時,每一次交互的精準響應,都依賴于底層狀態架構對風險的預判與性能的調控。深入理解如何在功能實現之外,構筑一套兼顧狀態安全與運行高效的體系,是從基礎開發邁向工程化實踐的關鍵一躍。狀態管理機制的設計,需要穿透“數據更新…

【android bluetooth 協議分析 01】【HCI 層介紹 30】【hci_event和le_meta_event如何上報到btu層】

一、引言 在藍牙協議棧中&#xff0c;HCI Event 和 LE Meta Event 是控制器&#xff08;Controller&#xff09;向主機&#xff08;Host&#xff09;報告事件的兩種形式&#xff0c;它們屬于 HCI&#xff08;Host Controller Interface&#xff09;層。這是主機和控制器之間通…

小實驗--震動點燈

1.實驗目的 使用中斷的方法&#xff0c;震動傳感器檢測到震動時&#xff0c;LED1點亮2秒&#xff0c;之后熄滅。 2.硬件清單 震動傳感器STM32開發板ST-Link 3.硬件連接STM32震動傳感器PA4DO3V3VCCGNDGND4.代碼 4.1exti.c #include "exti.h" #include "sys.h&quo…

vcpkg: 一款免費開源的C++包管理器

目錄 1.簡介 2.安裝 3.常用命令 4.與項目集成 5.vcpkg的工作原理 5.1.包索引&#xff1a;ports 系統&#xff08;定義庫的 “元信息”&#xff09; 5.2.源碼獲取&#xff1a;從 “地址” 到 “本地緩存” 5.3.編譯構建&#xff1a;按 “triplet” 定制目標 5.4.安裝布…

WinCC通過無線Modbus TCP監控S7-1200/200SMT PLC實例詳解

工業自動化系統中&#xff0c;車間內通常部署多臺PLC設備并需通過中央監控平臺實現集中管控。考慮到工業現場設備間距普遍在數十至數百米范圍&#xff0c;傳統有線以太網雖能保障傳輸速率&#xff0c;但其施工需面臨電纜溝開挖或復雜布線工程&#xff0c;既增加線材采購、人力投…

【AI智能編程】Trae-IDE工具學習

什么是Trae&#xff1f; Trae與 AI 深度集成&#xff0c;提供智能問答、代碼自動補全以及基于 Agent 的 AI 自動編程能力。使用 Trae 開發項目時&#xff0c;你可以與 AI 靈活協作&#xff0c;提升開發效率。提供傳統的 IDE 功能&#xff0c;包括代碼編寫、項目管理、插件管理…

智能駕駛再提速!批量蘇州金龍L4級自動駕駛巴士交付杭州臨平區

近日&#xff0c;由蘇州金龍海格客車研發的“清源”L4級自動駕駛巴士現身杭州市臨平區并投入測試。這是臨平區引進的首批L4級自動駕駛巴士&#xff0c;標志著臨平區智能交通建設邁入新階段。此次投入測試的“清源”小巴采用一級踏步設計&#xff0c;車身延續了海格蔚藍巴士的經…

Spring_事務

在mysql階段的文章中&#xff0c;已經介紹過事務了。本篇文章是對mysql事務的總結和對使用Spring框架來實現事務操作的講解。事務回顧什么是事務事務時一組操作的集合&#xff0c;是一個不可分割的操作。事務會把所有操作作為一個整體&#xff0c;一起向數據庫提交或者撤銷操作…

事務管理介紹

為什么要用事務管理在我們同時操作兩個或更多個數據庫時&#xff0c;可能因為網絡等各方面原因導致中間出現異常。造成像對第一個數據庫的操作成功了&#xff0c;但是對第二個數據庫的操作沒有成功。這樣數據的完整性就被破壞了。事務&#xff1a;是一組操作的集合&#xff0c;…

Android 之 ViewBinding 實現更安全、高效的視圖綁定

??一、配置說明????作用位置??需在模塊級 build.gradle或 build.gradle.kts文件的 android {}塊內添加&#xff1a;android {buildFeatures {viewBinding true // Kotlin DSL 語法} }android {buildFeatures {viewBinding true // Groovy 語法} }??生成規則??為每…

全球首款Java專用AI開發助手實測:一句話生成完整工程代碼——飛算 JavaAI

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f;&#x1f30d; 立志在堅不欲說&#xff0c;成功在久不在速&#x1f30d;&#x1f680; 歡迎關注&#xff1a;&#x1f44d;點贊??留言收藏&#x1f680;&#x1f340;歡迎使用&#xff1a;小智初學計算機…

Shader開發(七)創建第一個Shader項目

在前面的章節中&#xff0c;我們已經了解了Shader的基本概念和渲染管線的工作原理。現在&#xff0c;是時候動手實踐了&#xff01;本章將帶您一步步創建第一個Shader項目&#xff0c;開啟真正的Shader開發之旅。 為什么選擇openFrameworks&#xff1f; 與其他文章不同&#x…

IAR軟件中測量函數執行時間

通常在調試代碼中需要直到某個函數或者某段代碼的實際執行時間&#xff0c;在IAR中可以直接借助軟件提供的工具來計算代碼執行時間。 第一種方法 進入仿真調試界面&#xff0c;在需要測量的代碼前面打斷點。工具欄中選擇 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字節碼文件(.class)的組成詳解

文章目錄基礎信息常量池字段方法屬性字節碼文件內容說明案例文件基本信息類的基本信息常量池字段信息構造方法實例方法主方法源文件信息字節碼文件由五部分組成&#xff0c;分別是基礎信息、常量池、字段、方法、屬性。案例&#xff1a; public class Main implements Interfa…

C++之vector類的代碼及其邏輯詳解 (下)

1. insert()這個就是在指定位置插入一個元素&#xff0c;首先計算要插入的這個位置和開頭之間的距離&#xff0c;接著判斷那個_finish 有沒有碰到_endofstorage 或者_endofstorage 是不是為0&#xff0c;如果滿足條件&#xff0c;那就進行擴容&#xff0c;然后接著重新計算距離…