主頁 > 資料庫 > 位元組跳動基于 Apache Hudi 的多流拼接實踐方案

位元組跳動基于 Apache Hudi 的多流拼接實踐方案

2022-03-31 07:43:48 資料庫

位元組跳動資料湖團隊在實時數倉構建寬表的業務場景中,探索實踐出的一種基于 Hudi Payload 的合并機制提出的全新解決方案,

位元組跳動資料湖團隊在實時數倉構建寬表的業務場景中,探索實踐出的一種基于 Hudi Payload 的合并機制提出的全新解決方案,

該方案在存盤層提供對多流資料的關聯能力,旨在解決實時場景下多流 JOIN 遇到的一系列問題,接下來,本文會詳細介紹多流拼接方案的背景以及實踐經驗,

業務面臨的挑戰

位元組跳動存在較多業務場景需要基于具有相同主鍵的多個資料源實時構建一個大寬表,資料源一般包括 Kafka 中的指標資料,以及 KV 資料庫中的維度資料,

業務側通常會基于實時計算引擎在流上做多個資料源的 JOIN 產出這個寬表,但這種解決方案在實踐中面臨較多挑戰,主要可分為以下兩種情況:

  1. 維表 JOIN
  • 場景挑戰:指標資料與維度資料進行關聯,其中維度資料量比較大,指標資料 QPS 比較高,導致資料可能會產出延遲,

  • 當前方案:將部分維度資料快取起起來,緩解高 QPS 下訪問維度資料存盤引擎產生的任務背壓問題,

  • 存在問題:由于業務方的維度資料和指標資料時間差比較大,所以指標資料流無法設定合理的 TTL;而且存在 Cache 中維度資料沒有及時更新,導致下游資料不準確的問題,

  1. 多流 JOIN
  • 場景挑戰:多個指標資料進行關聯,不同指標資料可能會出現時間差比較大的例外情況,
  • 當前方案:使用基于視窗的 JOIN,并且維持一個比較大的狀態,
  • 存在問題:維持大的狀態不僅會給記憶體帶來的一定的壓力,同時 Checkpoint 和 Restore 的時間會變 得更長,可能會導致任務背壓.

分析與對策

總結上述場景遇到的挑戰,主要可歸結為以下兩點:

  • 由于多流之間時間差比較大,需要維持大狀態,同時 TTL 不好設定,
  • 由于對維度資料做了 Cache,維度資料資料更新不及時,導致下游資料不準確,

針對這些問題,并結合業務場景對資料延遲有一定容忍,但對資料準確性要求比較高的背景,我們在不斷的實踐中探索出了基于 Hudi Payload 機制的多流拼接方案:

  • 多流資料完全在存盤層進行拼接,與計算引擎無關,因此不需要保留狀態及其 TTL 的設定,
  • 維度資料和指標資料作為不同的流獨立更新,更新程序中不需要做多流資料合并,下游讀取時再 Merge 多流資料,因此不需要快取維度資料,同時可以在執行 Compact 時進行 Merge,加速下游查詢,

此外,多流拼接方案還支持:

  • 內置通用模板,支持資料去重等通用介面,同時可滿足用戶定制化資料處理需求,
  • 支持離線場景和流批混合場景,

方案介紹

基本概念

首先簡單介紹下本方案依賴 Hudi 的一些核心概念:

  • Hudi MetaStore

這是一個中心化的資料湖元資料管理系統,它基于 Timeline 樂觀鎖實作并發寫控制,可以支持列級別的沖突檢查,這在 Hudi 多流拼接方案中能夠實作并發寫入至關重要,更多細節可參考位元組跳動資料湖團隊向社區貢獻的 RFC-36,

  • MergeOnRead 表讀寫邏輯

MergeOnRead 表里面的檔案包含兩種, LogFile (行存) 和 BaseFile (列存),適用于實時高頻更新場景,更新資料會直接寫入 LogFile 中,讀時再進行合并,為了減少讀放大的問題,會定期合并 LogFile 到 BaseFile 中,此程序叫 Compact,

原理概述

針對上述業務場景,我們設計了一種完全基于存盤層的多流拼接方案,支持多個資料流并發寫入,讀時按照主鍵合并多流資料,此外還支持異步 Compact 來加速下游讀取資料,


圖 1 Hudi 多流拼接概念圖(本文所有圖中示例資料均與圖 1 一致)

現以一個簡單的示例流程對方案原理進行闡述,圖 1 為多流拼接示意圖,圖中的寬表包含 BCDE 五列,是由兩個實時流和一個離線流拼接而成,其中 A 是主鍵列,實時流 1 負責寫入 ABC 三列,實時 流 2 負責寫入 AD 兩列,離線流負責寫入 AE 兩列,此處僅對兩個實時流的拼接程序進行介紹,

圖 1 中顯示兩個流寫入資料以 LogFile 形式存盤,Merge 程序是合并 LogFile 和 BaseFile 中的資料,合并程序中,LogFile 中每一列的值被更新到 BaseFile 中對應的列上,BaseFile 中未被更新的列保持原來的值不變,如圖 1 中 BCD 三列被更新成新值,E 列保持舊值不變,

寫入程序

多流資料拼接方案支持多流并發寫入,相互獨立,對于單個流的寫入,邏輯與 Hudi 原有寫入流程一致,即資料以 Upsert 的方式寫入 Hudi 表,以 LogFile 的形式存盤,并在資料寫入的程序中對資料去重,在多流寫入的場景,核心點在于如何處理并發問題,

圖 2 顯示了資料并發寫入的流程,流 1 和 流 2 是兩個并發的任務,檢查這兩個任務寫入的列除了主鍵以外是不是存在其它交集,例如:

流 1 的 Schema 包含三列 (A,B,C),流 2 的 Schema 包含兩列 (A,D),
在并發寫入的時候,先在 Hudi MetaStore 對兩個任務發起的 DeltaCommit 做列沖突檢查,即除了主鍵列外的其它列是否存在交集,如圖中的 (B,C) 和 (D):

  • 如果有交集,則后發起的 DeltaCommit 失敗,
  • 如果沒有交集,則兩個任務繼續后續的寫入,


圖 2 資料寫入程序示意圖

讀取程序

接下來,介紹多流拼接場景下 Snapshot Query 的核心程序,即先對 LogFile 進行去重合并,然后再合并 BaseFile 和 去重后的 LogFile 中的資料,圖 3 顯示了整個資料合并的程序,具體可以拆分成以下 兩個程序:

  • Merge LogFile
    Hudi 現有邏輯是將 LogFile 中的資料讀出來存放在 Map 中,對于 LogFile 中每條 Record,如果 Key 不存在 Map 中,則直接放入 Map,如果 Key 已經存在于 Map 中,則需要更新操作,

在多流拼接中,因為 LogFile 中存在不同資料流寫入的資料,即每條資料的列可能不相同,所以在更新的時候需要判斷相同 Key 的兩個 Record 是否來自同一個流,是則做更新,不是則做拼接,

如圖 3 所示,讀到 LogFile2 中的主鍵是 key1 的 Record 時,key1 對應的 Record 在 Map 中已經存在,但這兩個 Record 來自不同流,則需要拼接形成一條新的 Record (key1,b0_new,c0_new,d0_new) 放入 Map 中,

  • Merge BaseFile and LogFile

Hudi 現有默認邏輯是對于每一條存在于 BaseFile 中的 Record,查看 Map 中是否存在 key 相同的 Record,如果存在,則用 Map 中的 Record 覆寫 BaseFile 中的 Record,在多流拼接中,Map 中的 Record 不會完整覆寫 BaseFile 中對應的 Record,可能只會更新部分列的值,即 Map 中的 Record 對應的列,

如圖 3 所示,以最簡單的覆寫邏輯為例,當讀到 BaseFile 中的主鍵是 key1 的 Record 時,發現 key1 在 Map 中已經存在并且對應的 Record 有 BCD 三列的值,則更新 BaseFile 中的 BCD 列,得到新的 Record(key1,b0_new,c0_new,d0_new,e0),注意 E 列沒有被更新,所以保持原來的值 e0,
對于新增的 Key 如 Key3 對應的 Record,則需要將 BCE 三列補上默認值形成一條完整的 Record,


圖3 SnapShot Query 中資料合并程序

異步 Compaction

為了提升讀取性能,某些資料源的寫入任務會同步執行 Compaction,但實踐程序中發現同步執行 Compaction 會阻塞寫入任務,而且 Compaction 任務需要資源比較多,可能會搶占流式匯入任務的資源,

針對這類場景,通過獨立的 Compaction Service 來隔離 Compaction 任務和流式資料匯入任務,與 Hudi 本身自帶的異步 Compaction 不同的是,用戶無需指定要執行的 Compaction Instant,且有一個獨立的 Compaction Service 負責所有的表的 Compaction 操作,關于 Compaction Service 的細節就不在本文展開,詳情可參考 RFC-43,

具體程序是流式匯入任務同步生成 Schedule Compaction Plan,并將 Plan 存入 Hudi MetaStore,有一個獨立于流式匯入任務的 Async Compactor,它從 Hudi MetaStore 回圈拉取 Compaction Plan 并執行,

場景實踐與未來規劃

最終,基于 Hudi 多流拼接的方案,在實時數倉的 DWS 層落地,單表支持了 3+ 資料流的并發匯入,覆寫了數百 TB 的資料,

此外,在使用 Spark 對寬表資料進行查詢時,在單次掃描量幾十 TB 的查詢中,性能相比于直接使用多表關聯性能提升在 200% 以上,在一些更加復雜的查詢下,也有 40-140% 的性能提升,

目前,基于 Hudi 多流拼接方案易用性不足,單個任務至少需要配置超過 10 個引數,為了進一步降低用戶使用成本,后續會做部分列插入和更新的 SQL 的語法支持以及引數的收斂,

除此之外,為了進一步提升寬表資料查詢性能,還計劃在多流拼接場景下支持基于列存格式的 LogFile,提供列裁剪和過濾條件下推等功能,

資料湖團隊正在招人,
歡迎關注位元組跳動資料平臺同名公眾號

相關產品

  • 火山引擎湖倉一體分析服務 LAS

面向湖倉一體架構的Serverless資料處理分析服務,提供一站式的海量資料存盤計算和互動分析能力,完全兼容 Spark、Presto、Flink 生態,幫助企業輕松完成資料價值洞察,點擊了解

  • 火山引擎E-MapReduce

支持構建開源 Hadoop 生態的企業級大資料分析系統,完全兼容開源,提供 Hadoop、Spark、Hive、Flink 集成和管理,幫助用戶輕松完成企業大資料平臺的構建,降低運維門檻,快速形成大資料分析能力,點擊了解

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452898.html

標籤:其他

上一篇:資料插補—拉格朗日插值法

下一篇:MySQL中常用的資料型別

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more