中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flink State 有可能代替數據庫嗎?

發布時間:2020-08-09 19:42:07 來源:ITPUB博客 閱讀:215 作者:大濤學長 欄目:數據庫
有狀態的計算作為容錯以及數據一致性的保證,是當今實時計算必不可少的特性之一,流行的實時計算引擎包括 Google Dataflow、Flink、Spark (Structure) Streaming、Kafka Streams 都分別提供對內置 State 的支持。State 的引入使得實時應用可以不依賴外部數據庫來存儲元數據及中間數據,部分情況下甚至可以直接用 State 存儲結果數據,這讓業界不禁思考: State 和 Database 是何種關系?有沒有可能用 State 來代替數據庫呢?
在這個課題上,Flink 社區是比較早就開始探索的。總體來說,Flink 社區的努力可以分為兩條線: 一是在作業運行時通過作業查詢接口訪問 State 的能力,即 QueryableState;二是通過 State 的離線 dump 文件(Savepoint)來離線查詢和修改 State 的能力,即即將引入的 Savepoint Processor API。

QueryableState

在 2017 年發布的 Flink 1.2 版本,Flink 引入了 QueryableState 的特性以允許用戶通過特定的 client 查詢作業 State 的內容 [1],這意味著 Flink 應用可以在完全不依賴 State 存儲介質以外的外部存儲的情況下提供實時訪問計算結果的能力。


只通過 Queryable State 提供實時數據訪問
然而,QueryableState 雖然設想上比較理想化,但由于依賴底層架構的改動較多且功能也比較受限,它一直處于 Beta 版本并不能用于生產環境。針對這個問題,在前段時間騰訊的工程師楊華提出 QueryableState 的改進計劃 [2]。在郵件列表中,社區就 QueryableState 是否可以用于代替數據庫作了討論并出現了不同的觀點。筆者結合個人見解將 State as Database 的主要優缺點整理如下。
優點:
  • 更低的數據延遲。一般情況下 Flink 應用的計算結果需要同步到外部的數據庫,比如定時觸發輸出窗口計算結果,而這種同步通常是定時的會帶來一定的延遲,導致計算是實時的而查詢卻不是實時的尷尬局面,而直接 State 則可以避免這個問題。
  • 更強的數據一致性保證。根據外部存儲的特性不同,Flink Connector 或者自定義的 SinkFunction 提供的一致性保障也有所差別。比如對于不支持多行事務的 HBase,Flink 只能通過業務邏輯的冪等性來保障 Exactly-Once 投遞。相比之下 State 則有妥妥的 Exactly-Once 投遞保證。
  • 節省資源。因為減少了同步數據到外部存儲的需要,我們可以節省序列化和網絡傳輸的成本,另外當然還可以節省數據庫成本。
缺點:
  • SLA 保障不足。數據庫技術已經非常成熟,在可用性、容錯性和運維上都很多的積累,在這點上 State 還相當于是處于原始人時期。另外從定位上來看,Flink 作業有版本迭代維護或者遇到錯誤自動重啟帶來的 down time,并不能達到數據庫在數據訪問上的高可用性。
  • 可能導致作業的不穩定。未經過考慮的 Ad-hoc Query 可能會要求掃描并返回夸張量級的數據,這會系統帶來很大的負荷,很可能影響作業的正常執行。即使是合理的 Query,在并發數較多的情況下也可能影響作業的執行效率。
  • 存儲數據量不能太大。State 運行時主要存儲在 TaskManager 本地內存和磁盤,State 過大會造成 TaskManager OOM 或者磁盤空間不足。另外 State 大意味著 checkpoint 大,導致 checkpoint 可能會超時并顯著延長作業恢復時長。
  • 只支持最基礎的查詢。State 只能進行最簡單的數據結構查詢,不能像關系型數據庫一樣提供函數等計算能力,也不支持謂詞下推等優化技術。
  • 只可以讀取,不能修改。State 在運行時只可以被作業本身修改,如果實在要修改 State 只能通過下文的 Savepoint Processor API 來實現。
總體來說,目前 State 代替數據庫的缺點還是遠多于其優點,不過對于某些對數據可用性要求不高的作業來說,使用 State 作為數據庫還是完全合理的。由于定位上的不同,Flink State 在短時間內很難看到可以完全替代數據庫的可能性,但在數據訪問特性上 State 往數據庫方向發展是無需質疑的。

Savepoint Processor API

Savepoint Processor API 是社區最近提出的一個新特性(見 FLIP-42 [3]),用于離線對 State 的 dump 文件 Savepoint 進行分析、修改或者直接根據數據構建出一個初始的 Savepoint。Savepoint Processor API 屬于 Flink State Evolution 的 State Management。如果說 QueryableState 是 DSL 的話,Flink State Evolution 就是 DML,而 Savepoint Processor API 就是 DML 中最為重要的部分。
Savepoint Processor API 的前身是第三方的 Bravo 項目 [4],主要思路提供 Savepoint 和 DataSet 相互轉換的能力,典型應用是 Savepoint 讀取成 DataSet,在 DataSet 上進行修改,然后再寫為一個新的 Savepoint。這適合用于以下的場景:
  • 分析作業 State 以研究其模式和規律
  • 排查問題或者審計
  • 為新的應用構建的初始 State
  • 修改 Savepoint,比如:
  • 改變作業最大并行度
  • 進行巨大的 Schema 改動
  • 修正有問題的 State

Savepoint 作為 State 的 dump 文件,通過 Savepoint Processor API 可以暴露數據查詢和修改功能,類似于一個離線的數據庫,但 State 的概念和典型關系型數據的概念還是有很多不同,FLIP-43 也對這些差異進行了類比和總結。
首先 Savepoint 是多個 operator 的 state 的物理存儲集合,不同 operator 的 state 是獨立的,這類似于數據庫下不同 namespace 之間的 table。我們可以得到 Savepoint 對應數據庫,單個 operator 對應 Namespace。
DatabaseSavepointNamespaceUidTableState
但就 table 而言,其在 Savepoint 里對應的概念根據 State 類型的不同而有所差別。State 有 Operator State、Keyed State 和 Broadcast State 三種,其中 Operator State 和 Broadcast State 屬于 non-partitioned state,即沒有按 key 分區的 state,而相反地 Keyed State 則屬于 partitioned state。對于 non-partitioned state 來說,state 是一個 table,state 的每個元素即是 table 里的一行;而對于 partitioned state 來說,同一個 operator 下的所有 state 對應一個 table。這個 table 像是 HBase 一樣有個 row key,然后每個具體的 state 對應 table 里的一個 column。
舉個例子,假設有一個游戲玩家得分和在線時長的數據流,我們需要用 Keyed State 來記錄玩家所在組的分數和游戲時長,用 Operator State 記錄玩家的總得分和總時長。
在一段時間內數據流的輸入如下:
user_iduser_nameuser_groupscore1001PaulA5,0001002CharlotteA3,6001003KateC2,0001004RobertB3,900user_iduser_nameuser_grouptime1001PaulA1,8001002CharlotteA1,2001003KateC6001004RobertB2,000
用 Keyed State ,我們分別注冊 group_score 和 group_time 兩個 MapState 表示組總得分和組總時長,并根據 user_group keyby 數據流之后將兩個指標的累積值更新到 State 里,得到的表如下:
user_groupgroup_scoregroup_timeA8,6003,000C2,00600B3,9002,000
相對地,假如用 Operator State 來記錄總得分和總時長(并行度設為 1),我們注冊 total_score 和 total_time 兩個 State,得到的表有兩個:
total_score | ------- | 14,500 |
total_time5,600
至此 Savepoint 和 Database 的對應關系應該是比較清晰明了的。而對于 Savepoint 來說還有不同的 StateBackend 來決定 State 具體如何持續化,這顯然對應的是數據庫的存儲引擎。在 MySQL 中,我們可以通過簡單的一行命令 ALTER TABLE xxx ENGINE = InnoDB; 來改變存儲引擎,在背后 MySQL 會自動完成繁瑣的格式轉換工作。而對于 Savepoint 來說,由于 StateBackend 各自的存儲格式不兼容,目前尚不能方便地切換 StateBackend。為此,社區在不久前創建 FLIP-41 [5] 來進一步完善 Savepoint 的可操作性。

總結

State as Database 是實時計算發展的大趨勢,它并不是要代替數據庫的使用,而是借鑒數據庫領域的經驗拓展 State 接口使其操作方式更接近我們熟悉的數據庫。對于 Flink 而言,State 的外部使用可以分為在線的實時訪問和離線的訪問和修改,分別將由 Queryable State 和 Savepoint Processor API 兩個特性支持。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆尧县| 江华| 南通市| 福海县| 安多县| 互助| 巴林右旗| 威信县| 都兰县| 新和县| 呼图壁县| 台南县| 天门市| 宜都市| 海门市| 鄂托克前旗| 阳高县| 吴旗县| 芦溪县| 和田市| 武义县| 吐鲁番市| 电白县| 河北区| 盐亭县| 石景山区| 象州县| 综艺| 调兵山市| 乐都县| 常州市| 涟水县| 广东省| 丹巴县| 武隆县| 贞丰县| 汕尾市| 星子县| 土默特左旗| 颍上县| 灵石县|