【Flink數據傳輸(一)】NetworkStack架構概述:實現tm之間的數據交換

文章目錄

  • 1. NetworkStack整體架構
  • 2. StreamTask內數據流轉過程

NetworkStack提供了高效的網絡I/O和反壓控制

除了各個組件之間進行RPC通信之外,在Flink集群中TaskManager和TaskManager節點之間也會發生數據交換,尤其當用戶提交的作業涉及Task實例運行在不同的TaskManager上時。Task實例之間的數據交換主要借助Flink中的NetworkStack實現。NetworkStack不僅提供了非常高效的網絡I/O,也提供了非常靈活的反壓控制。

?

1. NetworkStack整體架構

通過Netty協議實現的NetworkStack

Flink NetworkStack整體架構在不同的TaskManager之間建立TCP連接,而TCP連接則主要依賴Netty通信框架實現。Netty是一個NIO網絡編程框架,可以快速開發高性能、高可靠性的網絡服務器/客戶端程序,能夠極大簡化TCP和UDP等網絡編程。

流程舉例:

TaskManager中會運行多個Task實例,例如在TaskManager 1中運行了Task A-1和Task A-2,在TaskManager 2中運行了Task B-1和Task B-2,Task A中從外部接入數據并處理后,會通過基于Netty構建的TCP連接發送到Task B中繼續進行處理。整個數據傳輸過程主要基于Flink的NetworkStack框架進行。

?

上游數據流轉邏輯:二進制buffer->ResultSubPartition隊列->InputChannel

對于上游的Task A實例來講,經過Operator處理后的數據,最終會通過RecordWriter組件寫入網絡棧,即算子輸出的數據并不是直接寫入網絡,而是先將數據元素轉換為二級制Buffer數據,并將Buffer緩存在ResultSubPartition隊列中,接著寫入下游Task對應的InputChannel。在上游的Task中會創建LocalBufferPool為數據元素申請對應Buffer的存儲空間,且上游的Task會創建NettyServer作為網絡連接服務端,并與下游Task內部的NettyClient之間建立網絡連接。

?
在這里插入圖片描述

?

下游Task數據接收邏輯:InputGate的InputChannel接收->StreamTaskInput取數據并處理(反序列化)->OperatorChain

  • 對下游的Task實例來講,會通過InputGate組件接收上游Task發送的數據,在InputGate中包含了多個InputChannel。InputChannel實際上是將Netty中Channel進行封裝,數量取決于Task的并行度
  • 上游Task的ResultPartition會根據ChannelSelector選擇需要將數據下發到哪一個InputChannel中,其實現類似Shuffe的數據洗牌操作
  • 在下游的Task實例中可以看出,InputGate中接收到的二進制數據,會轉換為Buffer數據結構并存儲到本地的Buffer隊列中,最后被StreamTaskInput不斷地從隊列中拉取出來并處理。StreamTaskInput會將Buffer數據進行反序列化操作,將Buffer數據轉換為StreamRecord并發送到OperatorChain中繼續處理。

?

2. StreamTask內數據流轉過程

流式作業中OperatorChain轉為StreamTask

在ExecutionGraph調度和執行ExecutionVertex節點的過程中,會將OperatorChain提交到同一個Task實例中運行。如果被調度的作業為流式類型,則AbstractInvokable的實現類就為StreamTask。最終StreamTask會被TaskManager中的Task線程觸發執行。

根據數據源不同,StreamTask分為兩種類型:

  1. 直接從外部源數據讀取數據的SourceStreamTask和SourceReaderStreamTask;
  2. 支持從網絡或本地獲取數據的OneInputStreamTask和TwoInputStreamTask;

?

以OneInputStreamTask為例,分析從Task層面介紹數據從網絡接入并發送到OperatorChain中進行處理,接著通過Output組建輸出到下游網絡中的過程。

在這里插入圖片描述

?

OneInputStreamTask包含一個StreamInputProcessor,用于對輸入數據進行處理和輸出。在StreamInputProcessor組件中包含StreamTaskInput、OperatorChain以及DataOutput三個組成部分。

?
task內部數據流轉:StreamTaskNetworkIutput -> StreamTaskNetworkOutput -> OperatorChain中的HeaderOperator -> task實例算子->Output->下游算子...->RecordWriter->網絡。詳細過程如下:

  1. StreamTaskInput從Task外部獲取數據。

根據不同的數據來源,StreamTaskInput的實現主要分為從網絡獲取數據的StreamTaskNetworkInput和從外部系統獲取數據的StreamTaskSourceInput。

  1. DataOutput負責將StreamTaskInput接收的數據發送到當前Task實例的OperatorChain的HeadOperator中進行處理。

DataOutput主要有StreamTaskNetworkOutput(用于處理StreamTaskNetworkInput接收的數據)和StreamTaskSourceOutput(用于處理StreamTaskSourceInput接收的數據)兩種實現。

  1. HeaderOperator接收數據,算子開始接收數據并進行處理

OperatorChain負責將能夠運行在同一個Task實例中的Operator連接起來,然后形成算子鏈,且算子鏈中HeaderOperator會暴露給StreamTask。當StreamTaskNetworkIutput接收到網絡數據后,就會通過StreamTaskNetworkOutput組件將數據元素發送給OperatorChain中的HeaderOperator進行處理,此時Task實例中的算子就能夠接收數據并進行處理了。

  1. 上一個算子處理的數據會通過Output組件發送到下一個算子中繼續處理
  1. 在OperatorChain中,除了具有HeaderOperator之外,還包含了其他算子,這些算子會按照拓撲關系連接到HeaderOperator之后,每個算子之間的數據傳輸通過Output組件相連,即在OperatorChain中,上一個算子處理的數據會通過Output組件發送到下一個算子中繼續處理。注意:DataOutput強調的是從外部接入數據到Task實例后再轉發到HeaderOperator中,Output則更加強調算子鏈內部的數據傳遞。
  2. Output組件的實現主要有ChainingOutput、BroadcastingOutputCollector、DirectedOutput和RecordWriterOutput等類型,它們最大的區別在于數據下發的方式不同,例如ChainingOutput代表直接向下游算子推送數據。
  1. RecordWriterOutput中RecordWriter組件將數據發送到網絡

經過算子鏈處理后的數據,需要發送到網絡中供下游的Task實例繼續處理,此時需要通過RecordWriterOutput完成數據的網絡輸出。RecordWriterOutput中包含了RecordWriter組件,用于將數據輸出到網絡中,下游Task實例就能通過StreamTaskInput組件從網絡中獲取數據,并繼續傳遞到Task內部的算子鏈進行處理。

小結:
在StreamTask中接入數據,然后通過OperatorChain進行處理,再通過RecordWriterOutput發送到網絡中,下游Task節點則繼續從網絡中獲取數據并繼續處理,最后組合這些Task節點就形成了整個Flink作業的計算拓撲。

注意:Task節點的數據輸入也可以是本地類型,這種情況主要出現在Task實例被執行在同一臺TaskManager時,數據不需要經過網絡傳輸。

?

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

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

相關文章

ubuntu20.04中配置Pyrep和CoppeliaSim

ubuntu20.04中配置Pyrep和CoppeliaSim 在Ubuntu20.04中配置 Pyrep ,實現應用Python語言的機器人在 Vrep(CoppeliaSim)中的虛擬仿真 一、安裝CoppeliaSim 4.1 1.1 下載適配Ubuntu20.04的CoppeliaSim 4.1軟件 下載鏈接:https://…

5.iframe

iframe 經典真題 iframe 框架有哪些優缺點&#xff1f;iframe 用來干什么的 iframe 介紹 iframe 稱之為嵌入式框架&#xff0c;嵌入式框架可以把一個完整的網頁內容嵌入到現有的網頁中。 下面是一個 iframe 的簡單示例&#xff1a; <body><p>iframe 示例<…

ssm+springmvc基于springboot的寵物領養系統的設計與實現_j5fk4

寵物領養系統主要是為了提高管理員的工作效率&#xff0c;滿足管理員對更方便、更快、更好地存儲所有信息和數據檢索功能的要求。通過對多個類似網站的合理分析&#xff0c;確定了寵物領養系統的各個模塊。考慮到用戶的可操作性&#xff0c;經過深入調查研究&#xff0c;遵循系…

vue3中mockjs模擬獲取數據

開發項目的時候&#xff0c;如果后端接口沒有出來&#xff0c;前端工程師也不必非得等接口出來才進行下步開發。可以使用mock.js來模擬接口數據&#xff0c;以下就是使用vue3設置hook函數來封裝axios請求&#xff0c;配合mock.js來實現的代碼&#xff0c;mock的官網 Mock.js 一…

力扣算法Algorithm競賽模板庫(codeforces-go):含了算法競賽中常用的數據結構和算法實現,助力開發者更高效地解決問題

1.算法Algorithm競賽模板庫&#xff08;codeforces-go&#xff09; 算法競賽模板庫&#xff0c;為算法競賽愛好者提供了一系列精心設計的算法模板。這個庫包含了算法競賽中常用的數據結構和算法實現&#xff0c;助力開發者更高效地解決問題 一個算法模板應當涵蓋以下幾點&…

C語言------字符串函數(2)

1.strcat函數功能實現 ? char* mystrcat(char* dest, const char* src) {assert(dest);assert(src);char* ret dest;//找到目標空間里面的斜杠0的位置&#xff0c;再追加while (*dest ! \0){dest;}while ((*dest *src)){;}return ret; } int main() {char arr1[20] "…

【信息系統項目管理師】--【信息技術發展】--【現代化創新發展】--【物聯網】

文章目錄 第二章 信息技術發展2.2 新一代信息技術及應用2.2.1 物聯網1.技術基礎2.關鍵技術3.應用和發展 第二章 信息技術發展 信息技術是在信息科學的基本原理和方法下&#xff0c;獲取信息、處理信息、傳輸信息和使用信息的應用技術總稱。從信息技術的發展過程來看&#xff0c…

Android 圓環帶刻度條進度動畫效果實現

效果圖 需求是根據傳感器做一個重力球效果&#xff0c;先實現了動畫后續加上跟傳感器聯動. 又是擺爛的一天&#xff0c; 尚能呼吸&#xff0c;未來可期啊 View源碼 package com.android.circlescalebar.view;import android.content.Context; import android.content.res.Typ…

C++ //練習 7.58 下面的靜態數據成員的聲明和定義有錯誤嗎?請解釋原因。

C Primer&#xff08;第5版&#xff09; 練習 7.58 練習 7.58 下面的靜態數據成員的聲明和定義有錯誤嗎&#xff1f;請解釋原因。 //example.h class Example{public:static double rate 6.5;static const int vecSize 20;static vector<double> vec(vecSize); };//e…

【治愈系】心靈雞湯美文:溫暖你的每一寸心田

1.人生就像一杯茶&#xff0c;不會苦一輩子&#xff0c;但總會苦一陣子。只有經歷過苦澀&#xff0c;才能品味到甜美的滋味。 2.每一次失敗都是一次寶貴的經驗&#xff0c;它教會我們如何更好地面對困難和挑戰。不要害怕失敗&#xff0c;因為失敗是成功的前奏。 3.人生最重要的…

【Vue】本地使用 axios 調用第三方接口并處理跨域

前端處理跨域 一. 開發準備 開發工具&#xff1a;VScode框架&#xff1a;Vue2項目結構&#xff1a;vue腳手架生成的標準項目&#xff08;以下僅顯示主要部分&#xff09; 本地已搭建好的端口&#xff1a;8080要請求的第三方接口&#xff1a;http://1.11.1.111:端口號/xxx-api…

刪除文件中的注釋(C語言)

【題目描述】刪除文件中的注釋&#xff1a;將C語言源程序(hello.c)文件中的所有注釋去掉后存入另一個文件(new_hello.c)。試編寫相應程序。 【代碼】 #include <stdio.h> #include <stdlib.h> int main(void) {FILE *fp1, *fp2;if ((fp1fopen("hello.c"…

【Git工具實戰】實用真實 Git 開發工作流程

前言 最近工作中發現&#xff0c;很多開發人員連最基本的Git怎么使用都不知道&#xff0c;比如什么時候切分支&#xff0c;什么時候合并代碼&#xff0c;代碼遇到沖突怎么辦&#xff0c;經常出現掉代碼&#xff0c;代碼合并后丟失的情況。以下為個人總結的常規Git開發工作流程…

Java架構師之路五、微服務:微服務架構、服務注冊與發現、服務治理、服務監控、容器化等。

目錄 微服務架構&#xff1a; 服務注冊與發現&#xff1a; 服務治理&#xff1a; 服務監控&#xff1a; 容器化&#xff1a; 上篇&#xff1a;Java架構師之路四、分布式系統&#xff1a;分布式架構、分布式數據存儲、分布式事務、分布式鎖、分布式緩存、分布式消息中間件、…

C語言系列15——C語言的安全性與防御性編程

目錄 寫在開頭1 緩沖區溢出&#xff1a;如何防范與處理1.1 緩沖區溢出的原因1.2 預防與處理策略 2. 安全的字符串處理函數與使用技巧2.1 strncpy函數2.2 snprintf函數2.3 strlcpy函數2.4 使用技巧 3 防御性編程的基本原則與實際方法3.1 基本原則3.2 實際方法 寫在最后 寫在開頭…

思騰合力攜京東打造服務器采購解決方案,助企業高校提升算力

隨著云計算、大數據、人工智能的快速發展&#xff0c;服務器需求不斷擴大&#xff0c;市場規模持續保持增長。IDC數據顯示&#xff0c;預計2023年我國服務器市場規模將增至308億美元。基于對服務器市場的趨勢洞察&#xff0c;思騰合力攜手京東品牌持續深化合作&#xff0c;在保…

深入淺出JVM(六)之前端編譯過程與語法糖原理

本篇文章將圍繞Java中的編譯器&#xff0c;深入淺出的解析前端編譯的流程、泛型、條件編譯、增強for循環、可變長參數、lambda表達式等語法糖原理 編譯器與執行引擎 編譯器 Java中的編譯器不止一種&#xff0c;Java編譯器可以分為&#xff1a;前端編譯器、即時編譯器和提前編…

(提供數據集下載)基于大語言模型LangChain與ChatGLM3-6B本地知識庫調優:數據集優化、參數調整、Prompt提示詞優化實戰

文章目錄 &#xff08;提供數據集下載&#xff09;基于大語言模型LangChain與ChatGLM3-6B本地知識庫調優&#xff1a;數據集優化、參數調整、提示詞Prompt優化本地知識庫目標操作步驟問答測試的預設問題原始數據情況數據集優化&#xff1a;預處理&#xff0c;先后準備了三份數據…

mac下C、C++項目出現‘stdio.h’ file not found的解決方法

【轉載】https://www.cnblogs.com/yongfengnice/p/14260997.html 有時候更新mac系統或者項目配置之后&#xff0c;打開之前的項目&#xff0c;發現出現莫名其妙的‘stdio.h’ file not found等頭文件找不到。 解決這個問題之前&#xff0c;我們要弄清楚開發工具是引用了系統哪…

C++:STL簡介

1. 什么是STL STL(standard template libaray- 標準模板庫 ) &#xff1a; 是 C 標準庫的重要組成部分 &#xff0c;不僅是一個可復用的組件庫&#xff0c;而且 是一個包羅數據結構與算法的軟件框架 。 2. STL的版本 3. STL的六大組件 4.STL的缺陷 1. STL庫的更新太慢了。這…