国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

字節(jié)跳動 Flink 狀態(tài)查詢實(shí)踐與優(yōu)化

原創(chuàng) 精選
數(shù)據(jù)庫
本篇文章介紹了字節(jié)跳動在 Flink 狀態(tài)查詢方面所進(jìn)行的優(yōu)化,解決了查詢 Flink 任務(wù)狀態(tài)時開發(fā)成本高及無法查詢狀態(tài)元信息等問題。

本篇文章介紹了字節(jié)跳動在 Flink 狀態(tài)查詢方面所進(jìn)行的優(yōu)化,解決了查詢 Flink 任務(wù)狀態(tài)時開發(fā)成本高及無法查詢狀態(tài)元信息等問題,提出了 State Query on Flink SQL 的解決方案,讓用戶使用 Flink Batch SQL 就可以快速查詢 Flink 任務(wù)狀態(tài)。

背景

眾所周知,F(xiàn)link 中的 State 保存了算子計算過程的中間結(jié)果。當(dāng)任務(wù)出現(xiàn)異常時,可以通過查詢?nèi)蝿?wù)快照中的 State 獲取有效線索。

但目前對于 Flink SQL 任務(wù)來說,當(dāng)我們想要查詢作業(yè) State 時,通常會因?yàn)闊o法獲知 State 的定義方式和具體類型等信息,而導(dǎo)致查詢 State 的成本過高。

為了解決這個問題,字節(jié)跳動流式計算團(tuán)隊在內(nèi)部提出了 State Query on Flink SQL 的解決方案——用戶通過寫 SQL 的方式就可以簡單地查詢 State。本文將主要介紹字節(jié)跳動在 Flink 狀態(tài)查詢這方面所進(jìn)行的相關(guān)工作。

State Processor API 介紹

圖片

提到狀態(tài)查詢,我們自然會聯(lián)想到 Flink 在 1.9 版本提出的特性 -- State Processor API。使用 State Processor API,我們可以將作業(yè)產(chǎn)生的 Savepoint 轉(zhuǎn)換成 DataSet,然后使用 DataSet API 完成對 State 的查詢、修改和初始化等操作。

圖片

下面簡單介紹一下如何使用 State Processor API 來完成 State 的查詢:

  • 首先創(chuàng)建 ExistingSavepoint 用來表示一個 Savepoint。初始化 ExistingSavepoint 時需要提供 Savepoint 路徑和 StateBackend 等信息;
  • 然后實(shí)現(xiàn) ReaderFunction 用于重新注冊所需要查詢的 State 以及定義處理 State 的方式。查詢狀態(tài)的過程中會遍歷所有的 Key 并按照我們定義的方式去操作 State;
  • 最后,調(diào)用 Savepoint.readKeyedState 并傳入算子的 uid 和 ReaderFunction,就可以完成 State 的查詢。

圖片

接下來為大家簡述一下 State 查詢背后的原理。

在 Savepoint 目錄中包含兩種文件,一種是狀態(tài)數(shù)據(jù)文件,比如上圖中的 opA-1-state ,這個文件里面保存著算子 A 在第一個 SubTask 狀態(tài)的明細(xì)數(shù)據(jù);還有一種元數(shù)據(jù)文件,對應(yīng)上圖中的 _metadata,元數(shù)據(jù)文件中保存了每個算子和狀態(tài)文件的映射關(guān)系。

當(dāng)我們在進(jìn)行狀態(tài)查詢的時候。首先在 Client 端會根據(jù) Savepoint 路徑去解析 metadata 文件。通過算子 ID,可以獲取需要查詢的狀態(tài)所對應(yīng)的文件的句柄。當(dāng)狀態(tài)查詢真正執(zhí)行時,負(fù)責(zé)讀取狀態(tài)的 Task 會創(chuàng)建一個新的 StateBackend ,然后將狀態(tài)文件中的數(shù)據(jù)恢復(fù)到 Statebackend 中。等到狀態(tài)恢復(fù)完成之后就會遍歷全部的 Key 并把對應(yīng)的狀態(tài)交給 ReaderFunction 處理。

圖片

有些同學(xué)可能會問,既然社區(qū)已經(jīng)提供了查詢 State 的功能,我們?yōu)槭裁催€要去做同樣的工作呢?主要是因?yàn)槲覀冊谑褂?State Processor API 的過程中發(fā)現(xiàn)一些問題:

  • 每次查詢 State 我們都需要獨(dú)立開發(fā)一個 Flink Batch 任務(wù),對用戶來說具有一定的開發(fā)成本;
  • 實(shí)現(xiàn) ReaderFunction 的時候需要比較清晰地了解任務(wù)狀態(tài)的定義方式,包括 State 的名稱、類型以及 State Descriptor 等信息,對用戶來說使用門檻高較高;
  • 使用 State Processor API 時,只能查詢單個算子狀態(tài),無法同時查詢多個算子的狀態(tài);
  • 無法直接查詢?nèi)蝿?wù)狀態(tài)的元信息,比如查詢?nèi)蝿?wù)使用了哪些狀態(tài),或者查詢某個狀態(tài)的類型。

圖片

總體來說,我們的目標(biāo)有兩個,一是降低用戶的使用成本;二是增強(qiáng)狀態(tài)查詢的功能。我們希望用戶在查詢 State 時能用最簡單的方式;同時也不需要知道任何信息。

此外,我們還希望用戶能同時查詢多個算子的 State ,也可以直接查詢作業(yè)使用了哪些 State,每個 State 的類型是什么。

因此,我們提出了 State Query on Flink SQL 的解決方案。簡單來說是把 State 當(dāng)成數(shù)據(jù)庫一樣,讓用戶通過寫 SQL 的方式就可以很簡單地查詢 State。

圖片

在這個方案中,我們需要解決兩個問題:

  • 如何對用戶屏蔽 State 的信息:參考 State Processor API 我們可以知道,查詢 State 需要提供非常多的信息,比如 Savepoint 路徑、 StateBacked 類型、算子 id 、State Descriptor 等等。通過 SQL 語句顯然難以完整地表述這些復(fù)雜的信息,那么查詢狀態(tài)到底需要哪些內(nèi)容,我們又如何對用戶屏蔽 State 里復(fù)雜的細(xì)節(jié)呢?這是我們面對的第一個難點(diǎn)。
  • 如何用 SQL 表達(dá) State:State 在 Flink 中的存儲方式并不像 Database 一樣,我們?nèi)绾稳ビ?SQL 來表達(dá)狀態(tài)的查詢過程呢?這是我們要解決的另一個難點(diǎn)。

StateMeta Snapshot 機(jī)制

圖片

首先我們來回答第一個問題,查詢一個 State 需要哪些信息呢?

可以參考上文中 State Processor API 的示例,當(dāng)我們創(chuàng)建 ExistingSavepoint 和 ReaderFunction 的時候,我們需要提供的信息有 Savepoint 路徑、Backend 類型、OperatorID、算子 key 的類型、State 名稱以及 Serializer 等等,我們可以將這些統(tǒng)一稱為狀態(tài)的元信息。

對于 Flink SQL 任務(wù)來說,要清楚地了解這些信息,對用戶來說門檻是非常高的。我們的想法是讓用戶只需要提供最簡單的信息,即 Savepoint ID ,然后由 Flink 框架把其他的元信息都存在 Savepoint 中,這樣就可以對用戶屏蔽 State 那些復(fù)雜的細(xì)節(jié),完成狀態(tài)的查詢。因此,我們引入了 StateMeta Snapshot 機(jī)制。

圖片

StateMeta Snapshot 簡單來說就是把狀態(tài)的元信息添加到 Savepoint Metadata 的過程,具體步驟如下:

  • 首先在 State 注冊的時候,Task 會把 operatorName\ID\KeySerializer\StateDescriptors 等元信息都保存在 Task 的內(nèi)存中;
  • 觸發(fā) Savepoint 時,Task 會在制作快照的同時,對狀態(tài)的元信息也同樣進(jìn)行快照。快照完成之后將狀態(tài)的元信息 (StateMeta) 和狀態(tài)文件的句柄 (StateHandle) 一起上報給 JobManager;
  • JobManager 在收到所有 Task 上報的 StateMeta 信息之后 ,將這些狀態(tài)元信息進(jìn)行合并,最后會把合并之后的狀態(tài)元信息保存到 Savepoint 目錄里名為 stateInfo 的文件中。

之后在狀態(tài)查詢時就只需解析 Savepoint 中的 stateInfo 文件,而不再需要用戶通過代碼去輸入這些 State 的元信息。通過這樣的方式可以很大程度地降低用戶查詢狀態(tài)的成本。

State as Database

接下來我們來回答第二個問題,我們?nèi)绾斡?SQL 來表達(dá) State。其實(shí)社區(qū)在設(shè)計 State Processor API 的時候就提出了一些解決思路,也就是 State As Database。

圖片

在傳統(tǒng)的數(shù)據(jù)庫中,通常用 Catalog、Database、Table 這個三個元素來表示一個 Table,其實(shí)我們也可以將用樣的邏輯到映射到 Flink State 上。我們可以把 Flink 的 State 當(dāng)作一種特殊的數(shù)據(jù)源,作業(yè)每次產(chǎn)生的 Savepoint 都當(dāng)作一個獨(dú)立 DB 。在這個 DB 中,我們將 State 元信息、State 的明細(xì)數(shù)據(jù),都抽象成不同的 Table 暴露給用戶,用戶直接查詢這些 Table 就可以獲取任務(wù)的狀態(tài)信息。

圖片

首先我們來看如何把 State 表示為 Table。我們都知道在 Flink 中,常用的 State 有兩種類型,分別是 KeyedState 和 OperatorState。

  • 對于 OperatorState 來說,它只有 Value 這一個屬性,用來表示這個 State 具體的值。因此我們可以把 OperatorState 表示為只包含一個 Value 字段的表結(jié)構(gòu)。
  • 對于 KeyedState 來說,每個 State 在不同的 Key 和 Namespace 下的值可能都不一樣, 因此我們可以將 KeyedState 表示為一個包含 Key、Namespace、Value 這三個字段的表結(jié)構(gòu)。

圖片

當(dāng)我們抽象出了單個 State 之后,想要表示多個 State 就比較容易了。可以看到在上圖的例子中,這個算子包含 3 個 State,分別是兩個 KeyedState 和一個 OperatorState,我們只需要將這些 Table 簡單的 union 起來,再通過 state_name 字段去區(qū)分不同的 State,就可以表示這個算子中所有的 State。

圖片

最后還有一個問題,我們?nèi)绾沃酪粋€任務(wù)到底用了哪些 State 或者這些 State 的具體類型呢?

為了解決這個問題,我們定義了一種特殊表 -- StateMeta ,用來表示一個 Flink 任務(wù)中所有 State 的元信息。StateMeta 中包含一個任務(wù)中每個 State 的名稱、State 所在的算子 ID 、算子名稱 、Key 的類型和 Value 的類型等等,這樣用戶直接查詢 StateMeta 這個表就能獲取任務(wù)中所有狀態(tài)的元信息。

使用 Flink Batch SQL 查詢?nèi)蝿?wù)狀態(tài)

圖片

以上就是狀態(tài)查詢方案的整體介紹。那我們到底如何去查詢一個 State 呢,我們以一個 Word Count 任務(wù)為例來說明。

首先,我們需要創(chuàng)建一個 Flink SQL 任務(wù)并啟動。通過 web-ui 可以看到這個任務(wù)中包含三個算子,分別是 Source,Aggregate 還有 Sink。然后,我們可以觸發(fā) Savepoint,當(dāng) Savepoint 制作成功之后獲取對應(yīng)的 SavepointID。我們可以通過 SavepointID 去完成作業(yè)狀態(tài)的查詢。

圖片

假如我們現(xiàn)在對 Flink SQL 任務(wù)中狀態(tài)的使用一無所知,那么首先我們需要查詢的就是這個 Flink 任務(wù)中包含哪些 State 以及這些 State 的類型。我們可以從 StateMeta 表獲取這些信息。如上圖中場景一所示,通過查詢 StateMeta 表,可以看到這個任務(wù)包含一個 ListState 和一個 ValueState,分別存在于 Source 算子和 Aggregate 算子中。

此外,有些對 Flink 比較了解的同學(xué)知道,KafkaSource 中的 State 是用于記錄當(dāng)前消費(fèi)的 Offset 信息。如場景二所示,我們可以通過查詢 Source 算子的狀態(tài),獲取到任務(wù)中消費(fèi) Kafka Topic 的 Partition 和 Offset 信息。

還有一種比較常見的場景,比如下游的業(yè)務(wù)同學(xué)發(fā)現(xiàn)某個 key(比如 key_662)的結(jié)果異常。我們在定位問題的時候可以直接去查詢作業(yè)中 aggregate 算子中的狀態(tài),同時去指定 key 等于 key_662 作為查詢條件。如上圖場景三所示,通過查詢的結(jié)果可以看到,當(dāng) key 為 662 時對應(yīng)的聚合結(jié)果是 11290。用戶使用這樣的方式就可以比較方便地驗(yàn)證狀態(tài)是否正確。

未來展望

圖片

未來,我們計劃進(jìn)一步豐富 State 的功能,目前我們支持了使用 SQL 查詢 State 的功能 ,其實(shí)社區(qū)還提供了 State 修改和初始化的能力。在一些場景下,這些能力也比較重要。比如,我們已知狀態(tài)中的部分 key 計算錯誤,希望將狀態(tài)中這部分的數(shù)據(jù)進(jìn)行修正;或者任務(wù)邏輯發(fā)生變更以后和之前的狀態(tài)不能完全兼容, 這個時候我們希望可以通過狀態(tài)修改和初始化的能力去生成一個新的 Savepoint。同樣,在使用方式上我們也希望用戶能直接使用 SQL 中 insert 和 update 語法來完成狀態(tài)的修改和初始化操作。

其次,我們會進(jìn)一步加強(qiáng) State 的可用性。我們使用 DAG 編輯的方案解決了作業(yè)拓?fù)浒l(fā)生變化時產(chǎn)生的狀態(tài)不兼容問題,但是當(dāng) Flink SQL 任務(wù)修改字段時 State Serializer 可能會變化,同樣導(dǎo)致狀態(tài)無法兼容。針對這種情況我們設(shè)計了完整的 Flink SQL State Schema Evolution 方案,可以極大的增強(qiáng) Flink SQL 任務(wù)發(fā)生變化之后狀態(tài)的恢復(fù)能力,目前正在落地中。我們還提供了完善的狀態(tài)恢復(fù)事前檢查能力,能夠做到在任務(wù)上線之前就檢查出狀態(tài)是否兼容并告知用戶,避免狀態(tài)不兼容引起作業(yè)啟動失敗對線上造成影響。

責(zé)任編輯:未麗燕 來源: 字節(jié)跳動技術(shù)團(tuán)隊
相關(guān)推薦

2022-08-21 21:28:32

數(shù)據(jù)庫實(shí)踐

2024-01-03 16:29:01

Agent性能優(yōu)化

2022-04-07 16:35:59

PGO 優(yōu)化profile 數(shù)據(jù)編譯優(yōu)化

2024-09-25 15:57:56

2022-10-14 14:47:11

Spark字節(jié)跳動優(yōu)化

2023-06-09 14:14:45

大數(shù)據(jù)容器化

2022-06-24 15:18:48

字節(jié)跳動數(shù)據(jù)庫ClickHouse

2023-01-10 09:08:53

埋點(diǎn)數(shù)據(jù)數(shù)據(jù)處理

2024-04-23 10:16:29

云原生

2022-06-06 11:55:12

Flink字節(jié)跳動State

2022-09-05 17:26:27

技術(shù)

2022-12-23 08:58:35

字節(jié)跳動YARN架構(gòu)

2022-06-22 06:49:39

Hertz開源HTTP 框架

2022-05-23 13:30:48

數(shù)據(jù)胡實(shí)踐

2024-11-01 17:00:03

2022-07-18 16:02:10

數(shù)據(jù)庫實(shí)踐

2025-01-22 14:00:12

2024-08-22 14:53:24

PromptAI大模型

2021-09-06 11:15:05

數(shù)據(jù)治理字節(jié)跳動埋點(diǎn)

2022-07-08 09:26:45

Flink快手計算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

久久久www成人免费毛片麻豆| 色成人在线视频| 亚洲自拍偷拍色图| 九七电影院97理论片久久tvb| 欧美日韩中文字幕一区| 福利电影导航| 2024国产精品视频| 在线不卡日本| 在线亚洲成人| 成人免费网站在线看| 成人线上播放| 色av中文字幕一区| 91禁在线看| 91.成人天堂一区| 中文字幕av在线播放| 亚洲天堂2016| 亚洲老女人av| 国产三级一区二区| 成人一区二区三| 91亚洲国产成人精品一区二区三 | 久草在线资源福利站| 欧洲av一区二区嗯嗯嗯啊| 91嫩草在线播放| 亚洲精品免费播放| 国产www在线观看| 国产亚洲一二三区| 天天色综合4| 亚洲图片你懂的| 成人黄色电影在线| 亚洲视频图片小说| 一级毛片视频| 一本久道久久综合中文字幕| 在线国产三级| 懂色av中文一区二区三区天美| 日日噜噜噜夜夜爽爽狠狠| 亚洲综合自拍偷拍| 日本一级在线观看| 在线成人av网站| 欧美aaa免费| 亚洲美女免费精品视频在线观看| 校园春色亚洲| 一本色道久久综合狠狠躁篇怎么玩 | 国产日韩欧美精品一区| 992kp快乐看片永久免费网址| 国产精品久久久久久久久免费桃花 | 久久久三级国产网站| 日韩av片网站| 午夜久久福利影院| aⅴ在线视频男人的天堂| 欧美日韩国产精选| 成人免费网站视频| 欧美激情二区三区| 日韩欧美国产精品综合嫩v| 国产欧美丝袜| 国产成人亚洲精品青草天美| 亚洲一级免费在线观看| 欧美小视频在线| 青草av在线| 欧美另类高清videos| 99久久99久久精品国产片桃花| 国内精品国语自产拍在线观看| 黑人精品欧美一区二区蜜桃| 一区二区xxx| 日本精品一级二级| 免费在线看污片| 精品国产一区二区三区久久久狼| 一区二区三区日本久久久| 国产精品高潮呻吟视频| 久久婷婷一区| 9色视频在线观看| 国产精品久久久久久久蜜臀 | 日日摸夜夜添夜夜添亚洲女人| 婷婷四房综合激情五月| 国产欧美一区二区精品久导航| 孩娇小videos精品| 制服丝袜成人动漫| 日韩一区二区三区免费| 成人免费网视频| 美女在线视频一区| **毛片在线网站| 欧美一区二区三区公司| 自拍偷自拍亚洲精品被多人伦好爽| 欧美成人h版在线观看| 91精品综合| 男人添女荫道口图片| 亚洲精品欧美激情| 看黄在线观看| 日韩**中文字幕毛片| 精品一区二区三区久久| 欧美伦理片在线观看| 亚洲护士老师的毛茸茸最新章节| 中文字幕一区二区三区中文字幕| 国产在线拍偷自揄拍精品| 久久精品男女| www.日本xxxx| 日韩激情在线视频| 日韩欧美一区二区三区免费看| 极品粉嫩国产18尤物| 欧美日韩性视频在线| 亚洲精品黑牛一区二区三区| av色综合网| 亚洲美女免费视频| segui88久久综合9999| av蓝导航精品导航| 91麻豆精品在线观看| 国产后进白嫩翘臀在线观看视频 | 成人勉费视频| 国产拍精品一二三| 91美女在线观看| 久久bbxx| 国产精品你懂得| 国产成a人无v码亚洲福利| 9191在线| 日本午夜人人精品| 99精品热视频| 综合图区亚洲| 91网站免费看| 亚洲欧洲av在线| 色吧亚洲日本| 久久草视频在线看| 色婷婷av一区二区三区软件 | 伪装者免费全集在线观看 | 成人国产免费电影| 美女av一区二区三区 | 91美女在线| 欧美中文在线视频| 国产69精品久久99不卡| а√天堂在线官网| 成人性生交大片免费观看嘿嘿视频 | 国产乱码精品一区二区三区av| 超碰在线12| 欧美黑人视频一区| 国产成人在线影院| 蜜芽在线免费观看| 亚洲综合中文字幕在线观看| 亚洲一区二区三区在线播放| 视频二区欧美| 三级在线免费看| 中文字幕在线看视频国产欧美| 高清在线观看日韩| 亚洲奶水xxxx哺乳期| 日本成人看片网址| 在线视频你懂得一区| 亚洲激情偷拍| 日韩电影网址| 精品国产二区在线| 欧美日韩一区不卡| 国产乱码精品| 最新日本在线观看| 亚洲一区美女| 精品国产乱码久久久久久牛牛 | 一卡二卡三卡亚洲| 国产精品嫩草影院一区二区| 欧美日韩国产精品一区二区三区四区 | 成人午夜在线| 91精品国产91久久久久久最新毛片| 亚洲国产高清视频| 最新日本视频| 国产精品一二三视频| 欧美在线一区二区三区| 国产综合精品| 蜜桃视频动漫在线播放| 一区二区三区在线视频看| www.亚洲男人天堂| 337p粉嫩大胆噜噜噜噜噜91av| 麻豆视频一区| 九七影院理伦片| 97神马电影| 日韩精品视频在线免费观看| 国产精品自拍毛片| 私拍精品福利视频在线一区| 成人网18免费看| 国产精品毛片一区视频| 欧美日韩一区二区三区四区五区 | www.在线视频| 干日本少妇首页| 欧美精品videosex牲欧美| 午夜久久电影网| 亚洲三级影院| 天天综合在线观看| 日韩肉感妇bbwbbwbbw| 亚洲自拍偷拍区| 精品久久久三级丝袜| 国产高清视频一区| 国产精品免费不| 成人资源www网在线最新版| 人人妻人人澡人人爽欧美一区| 丝袜亚洲另类欧美重口| 黑人精品xxx一区| 国产精品中文字幕欧美| 风间由美中文字幕在线看视频国产欧美 | 日本高清+成人网在线观看| 亚洲曰韩产成在线| 米奇777在线欧美播放| 天堂电影一区| 91美女在线| 在线观看欧美亚洲| 国产日韩欧美在线播放| 精品久久国产字幕高潮| 亚洲欧美日韩电影|