DataStreamAPI實踐原理——計算模型

引入

通過前面我們對于Flink的理解,我們知道它吸收了 Dataflow 的理念,以及此前已有的流處理系統(如 S4、Storm、MillWheel)的經驗,實現了批流一體化的高效數據處理,并且通過靈活的窗口機制、事件時間與水位線機制、容錯機制和狀態管理等特性,為開發者提供了應對各種復雜的實時數據處理挑戰的能力。對于它的核心實現原理可以看我前面的Flink執行原理文章。

Flink 為流式/批式處理應用程序的開發提供了不同級別的抽象:

  • Flink API 最底層的抽象為有狀態實時流處理。其抽象實現是 Process Function,并且 Process Function 被 Flink 框架集成到了 DataStream API 中來為我們使用。它允許用戶在應用程序中自由地處理來自單流或多流的事件(數據),并提供具有全局一致性和容錯保障的狀態。此外,用戶可以在此層抽象中注冊事件時間(event time)和處理時間(processing time)回調方法,從而允許程序可以實現復雜計算。
  • Flink API 第二層抽象是 Core APIs。實際上,許多應用程序不需要使用到上述最底層抽象的 API,而是可以使用 Core APIs 進行編程:其中包含 DataStream API(應用于有界/無界數據流場景)。Core APIs 提供的流式 API(Fluent API)為數據處理提供了通用的模塊組件,例如各種形式的用戶自定義轉換(transformations)、聯接(joins)、聚合(aggregations)、窗口(windows)和狀態(state)操作等。此層 API 中處理的數據類型在每種編程語言中都有其對應的類。Process Function 這類底層抽象和 DataStream API 的相互集成使得用戶可以選擇使用更底層的抽象 API 來實現自己的需求。DataSet API 還額外提供了一些原語,比如循環/迭代(loop/iteration)操作。
  • Flink API 第三層抽象是 Table API。Table API 是以表(Table)為中心的聲明式編程(DSL)API,例如在流式數據場景下,它可以表示一張正在動態改變的表。Table API 遵循(擴展)關系模型:即表擁有 schema(類似于關系型數據庫中的 schema),并且 Table API 也提供了類似于關系模型中的操作,比如 select、project、join、group-by 和 aggregate 等。Table API 程序是以聲明的方式定義應執行的邏輯操作,而不是確切地指定程序應該執行的代碼。盡管 Table API 使用起來很簡潔并且可以由各種類型的用戶自定義函數擴展功能,但還是比 Core API 的表達能力差。此外,Table API 程序在執行之前還會使用優化器中的優化規則對用戶編寫的表達式進行優化。表和 DataStream/DataSet 可以進行無縫切換,Flink 允許用戶在編寫應用程序時將 Table API 與 DataStream/DataSet API 混合使用。
  • Flink API 最頂層抽象是 SQL。這層抽象在語義和程序表達式上都類似于 Table API,但是其程序實現都是 SQL 查詢表達式。SQL 抽象與 Table API 抽象之間的關聯是非常緊密的,并且 SQL 查詢語句可以在 Table API 中定義的表上執行。

DataStream API實踐原理小節的重點在于DataStream API,它主要用于構建流式類型的Flink應用,處理實時無界數據流。和Storm組合式編程接口不同,DataStream API屬于定義式編程接口,具有強大的表達力,可以構建復雜的流式應用,例如對狀態數據的操作、窗口的定義等。開發者只要調用統一的編程API,傳入具體的計算邏輯,不必太多關心底層的細節,就可以完成各種復雜的計算了,并且可以實現快速部署、資源調度、任務容錯等,大大的提高了開發效率。

下面我們先看看Flink的計算模型是如何設計的,便于后面我們基于DataStream API開發,并深入其實現原理。

Flink計算模型

DataStream是Flink流式計算編程的抽象數據集(與Spark的RDD是類似的),抽象數據集里面不裝要真正要計算的數據,而是記錄一些描述信息,例如從哪里讀取數據,掉了用了什么方法,傳入了什么計算邏輯,通過調用DataStreamTransformation(s)和Sink后,構建成執行計劃圖DataFlow Graph(類似Spark的DAG),然后生成Task提交到集群中執行真正的計算邏輯。通過前面實時計算核心論文系列文章,我們知道Flink實時計算模型主要分為數據源、轉換操作和數據輸出三部分。

  • 數據源:關注與外部數據系統的打通,讀取消息、中間件等數據
  • 轉換操作:關注數據的轉換,包括filter、transform和connect操作
  • 數據輸出:將轉換后的數據輸出到外部數據系統,供用戶獲取

在開發Flink實時計算程序,首先學要創建StreamExecutionEnvironment,然后調用相應的Source算子創建原始的DataStream,再調用零到多次Transformation(轉換算子),每調用一次Transformation都會生成一個新的DataStream,最后調用Sink,我們寫的程序就形成一個Data Flow Graph(數據流圖),然后提交給JobManager,經過優化后生成包含有具體計算邏輯的Task實例,然后調度到TaskManager的slot中開始計算。

Data Source數據源

在實時計算DataStream API中,Source是用來獲取外部數據源的操作,按照獲取數據的方式,可以分為:基于集合的Source、基于Socket網絡端口的Source、基于文件的Source、第三方Connector Source和自定義Source五種。

前三種Source是Flink已經封裝好的方法,這些Source只要調用StreamExecutionEnvironment的對應方法就可以創建DataStream了,使用起來比較簡單,我們在學習和測試的時候會經常用到。如果以后生產環境想要從一些分布式、高可用的消息中間件中讀取數據,可以使用第三方Connector Source,比如Apache Kafka Source、AWS Kinesis Source、Google Cloud PubSub Source等(國內公司使用比較多的是Kafka這個消息中間件作為數據源),使用這些第三方的Source,需要額外引入對應消息中間件的依賴jar包。于此同時Flink允許開發者根據自己的需求,自定義各種Source,只要實現SourceFunction這個接口,然后將該實現類的實例作為參數傳入到StreamExecutionEnvironment的addSource方法就可以了,這樣大大的提高了Flink與外部數據源交互的靈活性。

從并行度的角度,Source又可以分為非并行的Source和并行的Source。非并行的Source它的并行度只能為1,即用來讀取外部數據源的Source只有一個實例,在讀取大量數據時效率比較低,通常是用來做一些實驗或測試,例如Flink的Socket網絡端口讀取數據的Source就是一個非并行的Source;并行的Source它的并行度可以是1到多個,即用來讀取外部數據源的Source可以有一個到多個實例(在分布式計算中,并行度是影響吞吐量一個非常重要的因素,在計算資源足夠的前提下,并行度越大,效率越高)。例如Kafka Source就是并行的Source。

Transformation轉換算子

Transformation翻譯成中文意為轉換,是將一個或多個DataStream調用某個轉換算子,生成一個新的DataStream,原來的DataStream不變。Flink程序可以將多個Transformation生成的DataStream組合成一個復雜的DataFlow拓撲。這里所提到的轉換算子,其實就是DataStream的轉換方法,調用轉換算子后,一定會生成一個新的DataStream。

我們前面的內容提到過,DataStream其實是一個抽象的數據集,調用了DataStream的轉換算子,并不會立即觸發任務的執行,對于Flink程序而言,僅是記錄了調用了哪個方法,傳入了具體什么處理邏輯,這些轉換操作會生成多個有著依賴關系和先后順序的DataStream,這些DataStream組成了DataFlow拓撲(類似Spark的DAG有向無環圖),這個DataFlow其實就是一個任務的邏輯執行計劃,Flink最終會將這個邏輯計劃轉成真正的物理計劃,最后提交到集群中運行。

Data Sink 數據輸出

經過一系列Transformation轉換操作后,最后一定要調用Sink操作,才會形成一個完整的DataFlow拓撲。只有調用了Sink操作,才會產生最終的計算結果,這些數據可以寫入到的文件、輸出到指定的網絡端口、消息中間件、外部的文件系統或者是打印到控制臺。

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

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

相關文章

項目筆記1:通用 Service的常見方法

通用 Service 通常封裝了常見的業務邏輯操作,以提高代碼的復用性和可維護性。不同的框架和業務場景下,通用 Service 的方法會有所差異,但一般都會包含一些基本的增刪改查(CRUD)操作,以下為你詳細介紹&#…

阿里云99機器總是宕機,實測還是磁盤性能差

阿里云99計劃總是宕機,經過反復排查,最終確認還是磁盤性能差。 阿里云99機器使用的磁盤類型是Entry云盤40GiB (2120 IOPS) 按照官方的一些數據,這個磁盤最小iops是1800最大是6000,實際使用中發現,這個6000值很虛,這個…

Fedora 43 計劃移除所有 GNOME X11 相關軟件包

Fedora 43 計劃移除所有 GNOME X11 相關軟件包,這是 Fedora 項目團隊為全面擁抱 Wayland 所做的重要決策。以下是關于此計劃的詳細介紹: 提案內容:4 月 23 日,Neal Gompa 提交提案,建議從 Fedora 軟件倉庫中移除所有 G…

魔幻預言手游》:職業介紹!

在《魔幻預言》手游中,共有武玄、魔魅、劍仙三大核心職業,各具特色且定位鮮明,以下為具體介紹: 一、武玄(戰士) 核心定位:近戰物理輸出與團隊增益擔當,兼具控制與防御能力。 戰斗風…

精益數據分析(27/126):剖析用戶價值與商業模式拼圖

精益數據分析(27/126):剖析用戶價值與商業模式拼圖 在創業和數據分析的領域中,每一次深入學習都是一次成長的契機。今天,我們繼續秉持共同進步的理念,深入研讀《精益數據分析》,剖析用戶價值的…

【SwitchyOmega安裝教程】

目錄 一、插件安裝 1. 下載安裝文件 2. 打開瀏覽器擴展安裝頁面 3. 安裝插件 二、界面詳情 三、配置信息 3.1 設置IP 1、查看IP地址信息 2、批量測試IP是否有效 3、點擊擴展程序,選擇 Proxy SwitchyOmega 4、 點擊選項進行配置 5、配置頁面 一、插件安裝 1…

矯平機終極指南:特殊材料處理、工藝鏈協同與全球供應鏈管理

一、特殊材料矯平:挑戰與創新解決方案 1. 高溫合金(如Inconel 718)處理 技術難點: 屈服強度高達1100 MPa,傳統矯平力不足 高溫下易氧化,需惰性氣體保護環境 解決方案: 采用雙伺服電機驅動&a…

反事實——AI與思維模型【82】

一、定義 反事實思維模型是一種心理認知模型,它指的是人們在頭腦中對已經發生的事件進行否定,然后構建出一種可能性假設的思維活動。簡單來說,就是思考“如果當時……,那么就會……”的情景。這種思維方式讓我們能夠超越現實的限制,設想不同的可能性和結果,從而對過去的…

Nginx:支持 HTTPS

文章目錄 Nginx 開啟 ssl 以支持 HTTPS1 生成本地證書2 開啟 ssl 以支持 HTTPS3 將 https 的請求轉發給 http 最終的 nginx.conf 如下 Nginx 開啟 ssl 以支持 HTTPS [!IMPORTANT] 在下文中,將采用如下定義。 HTTP端口: 80 HTTPS端口: 443 服務…

[計算機科學#2]:從繼電器到晶體管的電子計算機發展史(龐然大物的進化)

【核知坊】:釋放青春想象,碼動全新視野。 我們希望使用精簡的信息傳達知識的骨架,啟發創造者開啟創造之路!!! 內容摘要:本文講述了20世紀初至1950年代計算機技術的發展歷程…

【ESP32S3】Cache 框圖和操作

ESP32-S3 采用雙核共享 ICache (指令緩存) 和 DCache (數據緩存) 結構,如下圖所示。以便當 CPU 的指令總線和數據總線同時發起請求時,也可以迅速響應: Cache 的存儲空間與內部存儲空間可以復用。具體為 Internal SRAM0…

wireshark從HEX轉儲導入使用方法

官方資料: https://www.wireshark.org/docs/wsug_html_chunked/ChIOImportSection.html 方法1: 文本文件,純內容導入: ff ff ff ff ff ff 00 00 00 00 5f 0f 08 06 00 01 08 00 06 04 00 01 00 00 00 00 5f 0f 64 01 60 10 00 00 00 00 00 00 64 01 01…

【Android】四大組件之Activity

目錄 一、什么是Activity 二、如何創建和配置Activity 三、Activity 跳轉與數據傳遞 四、數據保存與恢復 五、Activity 啟動模式 六、自定義返回行為 七、復雜界面布局 你可以把Activity想象成手機屏幕上的一個“頁面”。比如,當你打開一個App時,…

uml類關系(實現、繼承,聚合、組合,依賴、關聯)

drawio和EA是架構設計時經常使用的畫圖工具。 drawio學習門檻低,使用靈活,但是功能僅僅限于畫圖。 EA學習門檻高,但是功能更加的豐富: ①在畫圖方面,EA嚴格滿足UML標準,EA中的圖和類是關聯的&#xff0c…

C++如何設計線程池(thread pool)來提高線程的復用率,減少線程創建和銷毀的開銷

線程池的基本概念與多線程編程中的角色 線程池,顧名思義,是一種管理和復用線程的資源池。它的核心思想在于預先創建一定數量的線程,并將這些線程保持在空閑狀態,等待任務的分配。一旦有任務需要執行,線程池會從池中取出…

React.memo 和 useMemo

現象 React 中,通常父組件的某個state發生改變,會引起父組件的重新渲染(和其他state的重新計算),從而會導致子組件的重新渲染(和其他非相關屬性的重新計算) 問題一:如何避免因為某個…

防火墻技術深度解析:從包過濾到云原生防火墻的部署與實戰

防火墻技術深度解析:從包過濾到云原生防火墻的部署與實戰 在網絡安全防御體系中,防火墻是第一道物理屏障,承擔著“網絡流量守門人”的核心角色。從早期基于IP地址的包過濾設備到如今集成AI威脅檢測的云原生防火墻,其技術演進始終…

strcmp()在C語言中怎么用(附帶實例)

C語言標準庫中的 strcmp() 函數用于比較兩個字符串。 strcmp() 函數原型如下: int strcmp (const char * str1, const char * str2); const char *str1 表示待比較字符串 1 的首地址;const char *str2 表示待比較字符串 2 的首地址。 如果兩個字符串相…

搜廣推校招面經八十二

一、L1 和 L2 正則化的區別?對數據分布有什么要求,它們都能防止過擬合嗎? 1.1. L1 與 L2 正則化的區別 特性L1 正則化(Lasso)L2 正則化(Ridge)正則項λ * ∑|w?| λ ? ∑ ( w i 2 ) λ * ∑…

數據結構和算法(九)--紅黑樹

一、紅黑樹 1、紅黑樹 前面介紹了2-3樹,可以看到2-3樹能保證在插入元素之后,樹依然保持平衡狀態,它的最壞情況下所有子結點都是2-結點,樹的高度為IgN,相比于我們普通的二叉查找樹,最壞情況下樹的高度為N,確…