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>

        Flink 數(shù)據(jù)湖 助力美團(tuán)數(shù)倉增量生產(chǎn)

        共 4190字,需瀏覽 9分鐘

         ·

        2021-05-02 00:02

        一、美團(tuán)數(shù)倉架構(gòu)圖

        如上圖,是美團(tuán)最新的數(shù)倉架構(gòu)圖。
        整個架構(gòu)圖分為三層,從下往上看,最下面一層是數(shù)據(jù)安全,包括受限域認(rèn)證系統(tǒng)、加工層權(quán)限系統(tǒng),應(yīng)用層權(quán)限系統(tǒng),安全審計系統(tǒng),來保證最上層數(shù)據(jù)集成與處理的安全;
        中間一層是統(tǒng)一的元數(shù)據(jù)中心和全鏈路血緣,覆蓋了全鏈路的加工過程;
        最上層根據(jù)數(shù)據(jù)的流向,分成數(shù)據(jù)集成,數(shù)據(jù)處理,數(shù)據(jù)消費,數(shù)據(jù)應(yīng)用,四個階段;
        在數(shù)據(jù)集成階段,對于不同的數(shù)據(jù)來源(包括用戶行為數(shù)據(jù),日志數(shù)據(jù),DB 數(shù)據(jù),文件數(shù)據(jù)),都有相對應(yīng)的數(shù)據(jù)集成系統(tǒng),把數(shù)據(jù)收集到統(tǒng)一的存儲之中,包括 Kafka 和 Hive 等。
        在數(shù)據(jù)處理階段,有一個面向用戶的數(shù)據(jù)開發(fā)平臺(萬象平臺),可以使用兩條數(shù)據(jù)處理鏈路來加工數(shù)據(jù),一個是流式處理鏈路,一個是離線處理鏈路。
        數(shù)據(jù)加工好了之后,使用內(nèi)部自研的 DeltaLink 同步數(shù)據(jù)到其他的應(yīng)用中,例如即席分析,即席查詢,報表等應(yīng)用。
        上圖中標(biāo)紅的地方,Kafka -> HDFS,F(xiàn)link,DeltaLink 是本次重點分享的內(nèi)容。

        二、美團(tuán)當(dāng)前 Flink 應(yīng)用場景和規(guī)模

        美團(tuán) Flink 應(yīng)用場景包括:
        • 實時數(shù)倉、經(jīng)營分析、運營分析、實時營銷
        • 推薦、搜索
        • 風(fēng)控、系統(tǒng)監(jiān)控
        • 安全審計
        Flink 集群規(guī)模如下(高峰流量是每天最高峰的流量):

        三、基于 Flink 的流式數(shù)據(jù)集成

        數(shù)據(jù)集成經(jīng)歷了多個版本的迭代

        1. 數(shù)據(jù)集成 V1.0

        V1.0 版本很簡單,是完全批量同步的架構(gòu)。
        在數(shù)據(jù)量比較少的情況下,這樣的批同步的架構(gòu),優(yōu)勢很明顯,架構(gòu)簡單,非常簡單易于維護(hù)。
        但是缺點也很明顯,光是數(shù)據(jù)傳輸就 1 - 2 個小時。

        2. 數(shù)據(jù)集成 V2.0

        在 V2.0 中,增加了流式傳輸?shù)逆溌罚ㄏ旅娴逆溌罚?,把?shù)據(jù)實時傳輸?shù)?ODS 中(批量傳輸?shù)逆溌啡匀皇潜仨毜模鳛榈谝淮稳康膶?dǎo)入)。
        流式傳輸系統(tǒng),使用 canal (阿里開源) 采集 Mysql 的 binlog 日志到 kafka。后邊有一個 Kafka2Hive 系統(tǒng),這個系統(tǒng)經(jīng)過了多個版本的迭代。
        Kafka2Hive 模塊,最開始是使用 Camus ,每一個小時拉一次數(shù)據(jù),跑在 Spark 上。后面改成使用 SparkStreaming ,但是 Spark Streaming 在資源的利用方面有一些問題的,所以最終弄全部遷移到了 Flink 框架上來。
        這樣的架構(gòu),優(yōu)勢是非常明顯的:把數(shù)據(jù)傳輸放在了 T+0 的時間去做,T + 1 的時間只需要經(jīng)過一次 Merge 即可,花費的時間可能就從 2 - 3 個小時減少到 1 個小時了,提升是非常明顯的。

        3. 數(shù)據(jù)集成 V3.0

        數(shù)據(jù)集成 V3.0 的架構(gòu),前面的部分和 V2.0 一樣,關(guān)鍵的是后面這一部分。
        在 V2.0 架構(gòu)中,凌晨需要對數(shù)據(jù)做一次 Merge,這個操作對于 Hdfs 的壓力非常大,要把幾十 T 的數(shù)據(jù)讀過來,清洗一遍,再把幾十 T 的數(shù)據(jù)寫入到 Hdfs。
        所以,在 V3.0 架構(gòu)中,引用了 Hidi 架構(gòu)(Hidi 是美團(tuán)內(nèi)部基于 Hdfs 開發(fā)的類似 Hudi 或者 Iceberg 的文件格式)。

        4. 美團(tuán)自研的 Hidi

        要做到增量生產(chǎn),最關(guān)鍵的特性在于
        • 支持增量讀取,也就是讀取當(dāng)前時間到前一段時間的數(shù)據(jù), 才能做到增量;
        • 支持基于主鍵的 Upsert/Delete。Hidi 是美團(tuán)在 2,3 年前,在內(nèi)部自研的架構(gòu),此架構(gòu)的特性在于:
        • 支持 Flink 引擎讀寫;
        • 通過 MOR 模式支持基于主鍵的 upsert/Delete;
        • 小文件管理 Compaction;
        • Table Schema
        可以對比 Hidi、Hudi、Iceberg,如下:
        Hudi 最亮眼的特性是支持基于主鍵的 Upsert/Delete,但劣勢是深度和 Spark 綁定,但在國內(nèi) Flink 框架這么火熱的情況下,難免會有點美中不足。
        Iceberg 不依賴于執(zhí)行引擎,可以深度和 Flink 集成。
        美團(tuán)自研的 Hidi 則根據(jù)自己的需求實現(xiàn)了諸多的特性,目前仍然在完善中。

        四、基于 Flink 的增量生產(chǎn)

        1、傳統(tǒng)離線數(shù)倉特性分析

        一般我們說數(shù)倉,都是指離線數(shù)倉。離線數(shù)倉有三個重要的指標(biāo),一是時效性,二是質(zhì)量,三是成本。
        首先是時效性,有兩個更深層次的含義,一個是實時,一個是準(zhǔn)時。
        實時就是實時流式處理,來一條處理一條,實時處理消耗的資源很多。
        準(zhǔn)時,就是按時處理。比如廣告需求,可能只需要在每個整點,統(tǒng)計過去一小時或者在每個整點統(tǒng)計當(dāng)天的數(shù)據(jù)即可,沒有必要做到實時,只需要到點能產(chǎn)出數(shù)據(jù)就行。
        所以,總結(jié)下來,離線數(shù)倉和實時數(shù)倉各有利弊,離線數(shù)倉在質(zhì)量和成本上會有優(yōu)勢,但是時效性不足;實時數(shù)倉,在時效性上很有優(yōu)勢,但是質(zhì)量和成本都略遜色。

        2. 增量生產(chǎn)

        如下圖,是離線數(shù)倉、實時數(shù)倉和增量計算的對比
        所謂增量計算,就是企業(yè)在時效性、質(zhì)量、成本上做一個權(quán)衡,時效性需要高一點,但是不用做到 RealTime,OnTime 也可以接受( 8 點看報表,提前到 3 點計算好也沒有很大的意義),但是質(zhì)量要高,成本也需要盡量少。

        3. 增量計算的優(yōu)點

        增量計算最大的優(yōu)點,就是可以盡快的發(fā)現(xiàn)問題。
        一般我們會在第二天花 8 個小時到 12 個小時,把前一天的數(shù)據(jù)生產(chǎn)出來。但是如果第二天發(fā)現(xiàn)數(shù)據(jù)錯了,可能要花一天的時間去修復(fù)數(shù)據(jù),這個時候,準(zhǔn)時性和質(zhì)量都被打破了。
        如下圖,橫坐標(biāo)是時間(T 表示當(dāng)天,T+1 表示第二天),黑色線表示離線生產(chǎn),大概利用 T + 1 一半資源去生產(chǎn)。紅色線是實時生產(chǎn),在當(dāng)天就生產(chǎn)數(shù)據(jù),占用的資源比離線計算高。
        下圖是增量生產(chǎn)的示意圖。
        綠色線是增量計算,在當(dāng)天就計算好。
        黑色線是離線計算,在第二天的前半天計算。
        增量計算,是在當(dāng)天計算,在當(dāng)天就能提前發(fā)現(xiàn)問題,避免 T + 1 修復(fù)數(shù)據(jù)。并且還可以充分利用資源,提前產(chǎn)出數(shù)據(jù)的時間,并且占用資源更少。

        4. 增量生產(chǎn)架構(gòu)圖

        下圖是美團(tuán)增量生產(chǎn)的架構(gòu)圖(目前的架構(gòu)正在逐步完善中,還沒有完全實現(xiàn))
        如圖,最上面是實時處理的鏈路,F(xiàn)link 消費 Kafka 數(shù)據(jù) 到 下游的 kafka,輸出結(jié)果給下游使用或者供 OLAP 分析。
        下面的鏈路是批處理,首先 kafka 數(shù)據(jù)經(jīng)過 Flink 集成到 HDFS,再通過 Spark 做離線的生產(chǎn),最終經(jīng)過 Flink 導(dǎo)出到 OLAP 應(yīng)用里面去。
        上文提到的增量生產(chǎn),就是圖中標(biāo)綠色的部分,希望可以用增量生產(chǎn)來替換掉 Spark 離線計算,做到計算引擎的統(tǒng)一。
        要能支持增量生產(chǎn),需要具備幾個核心的能力:
        • Flink SQL 能力能夠?qū)R Spark SQL;
        • Hidi 支持 Upsert/Delete 特性(Hidi 已支持);
        • Hidi 支持全量和增量的讀取,全量讀取用于查詢和修復(fù)數(shù)據(jù),增量讀取用來增量生產(chǎn);

        五、實時數(shù)倉模型與架構(gòu)

        如下圖是實時數(shù)倉的模型,基本上都見過
        下圖是實時數(shù)倉平臺的架構(gòu)圖
        整個架構(gòu),分為資源層、存儲層、引擎層、SQL 層、平臺層和應(yīng)用層。

        六、流式導(dǎo)出與 OLAP 應(yīng)用

        1. 異構(gòu)數(shù)據(jù)源的同步

        如上圖,是異構(gòu)數(shù)據(jù)源的同步。數(shù)據(jù)會在不同的存儲系統(tǒng)中交換,所以我們做了一個 Deltalink 的平臺,把數(shù)據(jù) N 對 N 的交換過程,抽象成 N 對 1 的交換過程。
        我們也迭代改進(jìn)了很多版本。

        2. 第一版實現(xiàn)

        第一版是基于 DataX (阿里開源)來做同步,包含工具平臺層,調(diào)度層,執(zhí)行層。
        • 工具平臺層,對接用戶,用來配置同步任務(wù),配置調(diào)度,運維任務(wù);
        • 調(diào)度層,負(fù)責(zé)任務(wù)的調(diào)度,管理任務(wù)狀態(tài)管理,以及執(zhí)行機的管理,這其中有非常多的額外工作都需要自己做;
        • 執(zhí)行層,通過 DataX 進(jìn)程,以及 Task 線程從源存儲同步到目標(biāo)存儲。
        但劣勢也很明顯,開源版的 DataX 是一個單機多線程的模型,當(dāng)數(shù)據(jù)量非常大的時候,單機多線程是成為了瓶頸,限制了可擴展性;
        然后在調(diào)度層,需要管理機器,管理同步的任務(wù)和狀態(tài),非常繁瑣;
        當(dāng)調(diào)度執(zhí)行機發(fā)生故障的時候,整個災(zāi)備都需要單獨去做。

        3. 第二版實現(xiàn)

        在第二版中,改成了基于 Flink 同步的架構(gòu),看起來就清爽了很多。
        工具平臺層沒有變,調(diào)度層的任務(wù)調(diào)度和執(zhí)行機管理都交給 Yarn 去做。
        調(diào)度層的任務(wù)狀態(tài)管理,可以遷移到 Client 中去做。
        基于 Flink 的 DeltaLink 的架構(gòu),解決了可擴展性問題,而且架構(gòu)非常簡單。
        當(dāng)把同步的任務(wù)拆細(xì)之后,可以分布式的分布到不同的 TaskManager 里去執(zhí)行。
        并且離線和實時的同步,都可以統(tǒng)一到 Flink 框架中去,這樣離線和實時同步的 Source 和 Sink 組件都可以共用一套。

        4. 基于 Flink 的同步架構(gòu)關(guān)鍵設(shè)計

        1. 避免跨 TaskManager 的 Shuffle,避免不必要的序列化成本;Source 和 Sink 盡量在同一個 TaskManager;
        2. 務(wù)必設(shè)計臟數(shù)據(jù)收集旁路和失敗反饋機制;數(shù)據(jù)同步遇到臟數(shù)據(jù)的時候,比如失敗了 1% 的時候,直接停下來;
        3. 利用 Flink 的 Accumulators 對批任務(wù)設(shè)計優(yōu)雅退出機制;數(shù)據(jù)傳輸完之后,通知下游數(shù)據(jù)同步完了;
        4. 利用 S3 統(tǒng)一管理 Reader/Writer 插件,分布式熱加載,提升部署效率;很多傳輸任務(wù)都是小任務(wù),而作業(yè)部署時間又非常長,所以需要要提前部署插件;

        5. 基于 Flink 的 OLAP 生產(chǎn)平臺

        基于 Flink 做了 Deltalink ,數(shù)據(jù)導(dǎo)出的平臺;
        基于數(shù)據(jù)導(dǎo)出的平臺,做了 OLAP 平臺,對于資源,模型,任務(wù)和權(quán)限都做了管理。

        七、 未來規(guī)劃

        經(jīng)過多次迭代,把 Flink 用到了數(shù)據(jù)集成、數(shù)據(jù)處理、離線數(shù)據(jù)導(dǎo)出、OLAP 等場景,但事情還沒有結(jié)束。
        未來的目標(biāo),是要做到流批一體,把離線作業(yè)都遷移到 Flink 上來;
        同時數(shù)據(jù)也要做到批流一體,這個很重要。如果數(shù)據(jù)仍然是兩份,是兩套 Schema 定義,那么不管如何處理,都需要去對數(shù)據(jù),就不是真正的流批統(tǒng)一。
        所以不管是計算還是存儲,都使用 Flink,達(dá)到真正的流批一體。

        瀏覽 40
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            好大好湿硬顶到了的好爽91 | 开心激情黄色网 | 极品美女操逼视频 | 国模吧91| 在线免费观看黄片爆插 | 操逼www.| 免费污污视频网站 | 亚洲 简体 自由 管 | 日韩精品人妻一区二区中文 | 成人无码www免费视频在线播放 |