<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Hudi 實踐 | ByteLake:字節(jié)跳動基于 Apache Hudi 的實時數(shù)據(jù)湖平臺

          共 3601字,需瀏覽 8分鐘

           ·

          2021-11-03 14:32

          1b01b6eb922487abd80bbc8b6ebd6fc5.webp



          df8761ecaf25f298929ea1214c85217b.webp

          一篇關(guān)于字節(jié)跳動基于 Apache Hudi 的實時數(shù)據(jù)湖平臺 ByteLake 的分享。

          783dbd5611e8a84f66aa0674efa1cadc.webp

          本篇內(nèi)容包含四個部分,首先介紹一下 Hudi,其次介紹字節(jié)的實時數(shù)據(jù)湖平臺 ByteLake 的應(yīng)用場景;然后針對應(yīng)用場景,字節(jié)做的優(yōu)化和新特性;最后介紹未來規(guī)劃。

          47cb4ee20d989a5c56bf07e1409f5076.webp

          5da64a5679f38674666dbbcf3d0b9fc8.webp

          Hudi 是一個流式數(shù)據(jù)湖平臺,提供 ACID 功能,支持實時消費增量數(shù)據(jù)、離線批量更新數(shù)據(jù),并且可以通過 Spark、Flink、Presto 等計算引擎進行查詢。

          975915d56ae40034f1d902a7c13644e8.webp

          Hudi 表由 timeline 和 file group兩大項構(gòu)成。Timeline 由一個個 commit 構(gòu)成,一次寫入過程對應(yīng)時間線中的一個 commit,記錄本次寫入修改的文件。

          相較于傳統(tǒng)數(shù)倉,Hudi 要求每條記錄必須有唯一的主鍵,并且同分區(qū)內(nèi),相同主鍵只存在在一個 file group中。底層存儲由多個 file group 構(gòu)成,有其特定的 file ID。File group 內(nèi)的文件分為 base file 和 log file, log file 記錄對 base file 的修改,通過 compaction 合并成新的 base file,多個版本的 base file 會同時存在。

          c0f83078df79a47926fd1eff119aaf65.webp

          Hudi 表分為 COW 和 MOR兩種類型,

          ?COW 表適用于離線批量更新場景,對于更新數(shù)據(jù),會先讀取舊的 base file,然后合并更新數(shù)據(jù),生成新的 base file。?MOR 表適用于實時高頻更新場景,更新數(shù)據(jù)會直接寫入 log file 中,讀時再進行合并。為了減少讀放大的問題,會定期合并 log file 到 base file 中。

          af0b7a33922881d39be1da5abb47f778.webp

          對于更新數(shù)據(jù),Hudi 通過索引快速定位數(shù)據(jù)所屬的 file group。目前 Hudi 已支持 Bloom Filter Index、Hbase index 以及 Bucket Index。其中 Bucket Index 尚未合并到主分支。

          3b1ab81a9ac8071a414f141f212de06a.webp

          ByteLake 是字節(jié)跳動基于 Hudi 的實時數(shù)據(jù)湖平臺,通過秒級數(shù)據(jù)可見支持實時數(shù)倉。ByteLake除了提供 Hudi 社區(qū)的所有功能外,還支持下述第三部分介紹的特性。

          849593e1af7201f359ec607262dea8da.webp

          52798d2846f5831676b16641b7652969.webp

          一個典型的 pipeline 是MySQL 側(cè)的 binlog 生產(chǎn)到 Kafka。

          ?實時場景直接通過 Spark Streaming 或 Flink 消費這部分更新數(shù)據(jù),寫入數(shù)據(jù)湖,供下游業(yè)務(wù)使用。?批量場景會先將 binlog 通過 dump service 存儲到 HDFS上,再按照小時/天級粒度更新到數(shù)據(jù)湖中。

          ad04e0ff0a56505f2a4520e5f6d737c3.webp

          ba629ff8d0f7d5076e2eb1855357ae6f.webp

          在字節(jié)的推薦場景中,為服務(wù)離線對數(shù)據(jù)分析挖掘需求,需要將數(shù)據(jù)從類 Hbase的存儲導(dǎo)出到離線存儲中,并且可以提供高效的 OLAP 訪問。因此我們基于數(shù)據(jù)湖構(gòu)建BigTable 的 CDC。

          此外,在特征工程和模型訓(xùn)練場景中,需要將推薦系統(tǒng) Serving 時獲得的數(shù)據(jù)和端上埋點數(shù)據(jù)這兩類實時數(shù)據(jù)流通過主鍵合并到一起,作為機器學(xué)習(xí)樣本。因此我們希望可以借助數(shù)據(jù)湖的能力,低成本的批量添加特征列。

          ebabaa6fab58177434d0ab992f861e2b.webp

          數(shù)倉 backfill 場景中,需要對歷史全量數(shù)據(jù)進行部分行、列的更新,在 Hive 模式下,需要將增量數(shù)據(jù)和歷史全量進行 join,重新生成全量數(shù)據(jù)。其中,部分表的存量數(shù)據(jù)到達百 PB 級別。我們通過數(shù)據(jù)湖極大的減少了計算資源消耗,提升了端到端的性能。

          a48f73d8aeef2234f0a0ce0e9324bc4d.webp

          數(shù)倉場景中,對于一張底層分析表,往往是通過多個數(shù)據(jù)源的數(shù)據(jù)組合拼接而成,每個數(shù)據(jù)源都包含相同的主鍵列,和其他不同的屬性列。在傳統(tǒng)數(shù)倉場景中,需要先將每個數(shù)據(jù)源數(shù)據(jù) dump 成 Hive 表,然后再將多張 Hive 表按主鍵 join 后生成最終的完整 schema 的大表,延遲可到達天級別。我們通過數(shù)據(jù)湖使實時成為可能,并且提供列拼接能力,使下游數(shù)據(jù)分析性能大幅提升。

          e270a1f5653fbf258b0c031a5c2ff681.webp

          接下來介紹第三部分,針對上述場景,字節(jié)做的優(yōu)化與新特性。

          62bafa03c3b16b089369dcc839f0b70f.webp

          Hive Metastore 是元數(shù)據(jù)的事實標(biāo)準(zhǔn),但是基于目錄的元數(shù)據(jù)管理方式太粗,沒有辦法滿足數(shù)據(jù)湖以 commit 的形式管理元數(shù)據(jù)的需求。我們提出了適用于數(shù)據(jù)湖場景下的元數(shù)據(jù)管理系統(tǒng) ByteLake Metastore,并基于此設(shè)計了湖倉統(tǒng)一的元數(shù)據(jù)管理系統(tǒng)。

          整個架構(gòu)分為三部分引擎層、元數(shù)據(jù)層、存儲層。元數(shù)據(jù)層對外提供統(tǒng)一的元數(shù)據(jù)視圖,與 HMS 完全兼容,可無縫對接多個計算引擎。元數(shù)據(jù)層的 Catalog Service 接收來自引擎層的訪問請求,按規(guī)則路由到不同的 Metastore 上。元數(shù)據(jù)層通過 Catalog Service 屏蔽底層多 Metastore 的異構(gòu)性。

          e1135b7a72cadca7cc90e87ec96c77f6.webp

          367305e12c99c89999eced35330108ba.webp

          ByteLake Metastore 作為數(shù)據(jù)湖元數(shù)據(jù)管理系統(tǒng),支持 commit 形式的元數(shù)據(jù)管理,基于樂觀鎖和 CAS 支持并發(fā)更新;持久化元數(shù)據(jù)的 Snapshot,通過緩存常被訪問的元數(shù)據(jù)、索引信息,提供高效查詢;提供分區(qū)裁剪功能。整體設(shè)計

          ?底層存儲可插拔,不依賴某個特定的存儲系統(tǒng),可以是 HDFS、KV、MySQL?輕量且易于擴展,服務(wù)無狀態(tài),支持水平擴展;存儲可通過拆庫/表的方式縱向擴展?與 Hive Metastore 兼容

          1b9617f7ebdf39cf6246edf48a088321.webp

          21f2e32357ab68ca55a904e40d3f0c75.webp

          81f6ca77fff75e497974b5bb2cae0293.webp

          我們基于ByteLake Metastore和樂觀鎖的假設(shè),實現(xiàn)了并發(fā)寫入,并且支持靈活的行列沖突檢查策略。沖突檢查會在 instant 狀態(tài)變換的兩個節(jié)點進行,一個是 requested 轉(zhuǎn) inflight 狀態(tài),一個是 inflight 轉(zhuǎn) completed 狀態(tài)。其中,后者狀態(tài)變換時,會進行加鎖操作,以實現(xiàn)版本隔離。

          沖突檢查即是對 instant 創(chuàng)建到狀態(tài)變化的過程中其他已經(jīng)完成/正在執(zhí)行的 instant 之間的進行沖突檢查,檢查策略分為行列兩種,

          ?行級別的沖突檢查即是不能同時有兩個 instant 往同一個 file group 寫。?列級別的沖突檢查即是可以有兩個 instant 往同一個 file group 寫,但是兩個 instant 寫入的schema 不可以存在交集。?每個 instant 只寫入 schema 中的部分列,log 文件中的數(shù)據(jù)只包含 schema 中的部分?Compaction 按主鍵拼接不同列下的數(shù)據(jù),Parquet 文件中存儲的數(shù)據(jù)擁有完整的 schema

          7860849fe320fcfe9308f3244983ec79.webp

          8792e478c1c22785971c97f8b930efc5.webp

          Hudi 目前的兩種索引方式,Bloom Filter Index 在大數(shù)據(jù)場景下,假陽性的問題會導(dǎo)致查詢效率變差,而 Hbase Index 會引入額外的外部系統(tǒng),從而提升運維代價。因此,我們希望能有一個輕量且高效的索引方式。

          Bucket Index 是一種基于哈希的索引。每個分區(qū)被分成 N 個桶,每個桶對應(yīng)一個 file group。對于更新數(shù)據(jù),對更新數(shù)據(jù)的主鍵計算哈希,再對分桶數(shù)取模快速定位到 file group,提升導(dǎo)入實時性。

          25b414997904dba39faea400e273b4c0.webp

          17390cd0ad528d03e9100266147d3273.webp

          現(xiàn)有的計算引擎大都會利用表的 Bucket 分布做查詢優(yōu)化,提升查詢性能。優(yōu)化規(guī)則包含兩種:

          ?Bucket Pruning,利用表的 Bucket 分布對讀取數(shù)據(jù)進行剪枝。?Bucket Join,利用表的 Bucket 分布減少 Join/Aggregate 帶來的 shuffle 操作。

          e79454631d4248cb2e462ffa546ad0fc.webp

          Hudi 要求每條數(shù)據(jù)都有唯一主鍵和比較列,用于數(shù)據(jù)更新時定位 file group 和新舊數(shù)據(jù)比較。數(shù)據(jù)定位 file group 過程需要先根據(jù)索引構(gòu)建主鍵到 file group 的映射關(guān)系,然后與更新數(shù)據(jù)按照主鍵進行 join,從而找到每條更新數(shù)據(jù)對應(yīng)的 file group。

          對于日志場景,無確定的主鍵,并且用戶查詢也僅僅是對某些列進行 count 操作,因此更新數(shù)據(jù)只需要直接追加到任一文件末尾即可,也就是 Append 模式。為此,我們提出了 NonIndex方案,無需指定主鍵和比較列,更新過程也無需構(gòu)建主鍵到 file group 的映射關(guān)系,避免了 join,提升了導(dǎo)入的實時性。

          059bba8d42d1cbb3932a5c76ae005ebb.webp

          f0beae72a6e9948b93cea0c1a3145ea6.webp

          后續(xù)我們會將新特性逐步貢獻到社區(qū)。

          最后,字節(jié)跳動數(shù)據(jù)引擎團隊持續(xù)招人中,團隊支撐字節(jié)所有業(yè)務(wù)線的數(shù)倉,打造業(yè)界領(lǐng)先的 PB 級 OLAP引擎。工作地包括:北京/上海/杭州,有興趣的小伙伴歡迎添加微信?minihippo666,或發(fā)送簡歷至郵件?[email protected],或直接通過下述二維碼進行投遞,具體職位信息可通過下述二維碼查詢。

          推薦閱讀

          順豐科技 Hudi on Flink 實時數(shù)倉實踐
          一文徹底弄懂Apache Hudi不同表類型
          37 手游基于 Flink CDC + Hudi 湖倉一體方案實踐
          硬核!Apache Hudi中自定義序列化和數(shù)據(jù)寫入邏輯
          Apache Hudi 在 B 站構(gòu)建實時數(shù)據(jù)湖的實踐


          瀏覽 160
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产日韩精品在线 | 国产av一区二区三本 | 日本一区二区三视频 | 国产乱伦自拍 | 久久无码视频电影 |