1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3601字,需瀏覽 8分鐘

         ·

        2021-11-03 14:32

        1b01b6eb922487abd80bbc8b6ebd6fc5.webp



        df8761ecaf25f298929ea1214c85217b.webp

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

        783dbd5611e8a84f66aa0674efa1cadc.webp

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

        47cb4ee20d989a5c56bf07e1409f5076.webp

        5da64a5679f38674666dbbcf3d0b9fc8.webp

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

        975915d56ae40034f1d902a7c13644e8.webp

        Hudi 表由 timeline 和 file group兩大項(xiàng)構(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í)時高頻更新場景,更新數(shù)據(jù)會直接寫入 log file 中,讀時再進(jìn)行合并。為了減少讀放大的問題,會定期合并 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í)時數(shù)據(jù)湖平臺,通過秒級數(shù)據(jù)可見支持實(shí)時數(shù)倉。ByteLake除了提供 Hudi 社區(qū)的所有功能外,還支持下述第三部分介紹的特性。

        849593e1af7201f359ec607262dea8da.webp

        52798d2846f5831676b16641b7652969.webp

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

        ?實(shí)時場景直接通過 Spark Streaming 或 Flink 消費(fèi)這部分更新數(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ù)和端上埋點(diǎn)數(shù)據(jù)這兩類實(shí)時數(shù)據(jù)流通過主鍵合并到一起,作為機(jī)器學(xué)習(xí)樣本。因此我們希望可以借助數(shù)據(jù)湖的能力,低成本的批量添加特征列。

        ebabaa6fab58177434d0ab992f861e2b.webp

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

        a48f73d8aeef2234f0a0ce0e9324bc4d.webp

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

        e270a1f5653fbf258b0c031a5c2ff681.webp

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

        62bafa03c3b16b089369dcc839f0b70f.webp

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

        整個架構(gòu)分為三部分引擎層、元數(shù)據(jù)層、存儲層。元數(shù)據(jù)層對外提供統(tǒng)一的元數(shù)據(jù)視圖,與 HMS 完全兼容,可無縫對接多個計(jì)算引擎。元數(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è)計(jì)

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

        1b9617f7ebdf39cf6246edf48a088321.webp

        21f2e32357ab68ca55a904e40d3f0c75.webp

        81f6ca77fff75e497974b5bb2cae0293.webp

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

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

        ?行級別的沖突檢查即是不能同時有兩個 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),從而提升運(yùn)維代價。因此,我們希望能有一個輕量且高效的索引方式。

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

        25b414997904dba39faea400e273b4c0.webp

        17390cd0ad528d03e9100266147d3273.webp

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

        ?Bucket Pruning,利用表的 Bucket 分布對讀取數(shù)據(jù)進(jìn)行剪枝。?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ù)按照主鍵進(jìn)行 join,從而找到每條更新數(shù)據(jù)對應(yīng)的 file group。

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

        059bba8d42d1cbb3932a5c76ae005ebb.webp

        f0beae72a6e9948b93cea0c1a3145ea6.webp

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

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

        推薦閱讀

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


        瀏覽 160
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            草草影院最新地址 | free性欧美双性人 | 麻豆国产原创 | 欧美视频不卡 | 欧美一级视频 | 欧美h版电影在线观看 | 密乳精品| 总裁双性受在会议室被h | 欧美两根一起进3p做受视频 | 激情视频久久 |