<em id="hanht"></em>

    <dd id="hanht"></dd>

    <em id="hanht"><acronym id="hanht"></acronym></em>
    
    <button id="hanht"></button>
    <rp id="hanht"><object id="hanht"><blockquote id="hanht"></blockquote></object></rp><em id="hanht"></em>

    首頁 > 運營 > 幫助中心 > 正文

    美團DB數據同步到數據倉庫的架構與實踐

    2020-03-29 16:42:54
    字體:
    來源:轉載
    供稿:網友

    背景

    在數據倉庫建模中,未經任何加工處理的原始業務層數據,我們稱之為ODS(Operational Data Store)數據。在互聯網企業中,常見的ODS數據有業務日志數據(Log)和業務DB數據(DB)兩類。對于業務DB數據來說,從MySQL等關系型數據庫的業務數據進行采集,然后導入到Hive中,是進行數據倉庫生產的重要環節。

    如何準確、高效地把MySQL數據同步到Hive中?一般常用的解決方案是批量取數并Load:直連MySQL去Select表中的數據,然后存到本地文件作為中間存儲,最后把文件Load到Hive表中。這種方案的優點是實現簡單,但是隨著業務的發展,缺點也逐漸暴露出來:

    性能瓶頸:隨著業務規模的增長,Select From MySQL -> Save to Localfile -> Load to Hive這種數據流花費的時間越來越長,無法滿足下游數倉生產的時間要求。 直接從MySQL中Select大量數據,對MySQL的影響非常大,容易造成慢查詢,影響業務線上的正常服務。 由于Hive本身的語法不支持更新、刪除等SQL原語,對于MySQL中發生Update/Delete的數據無法很好地進行支持。

    為了徹底解決這些問題,我們逐步轉向CDC (Change Data Capture) + Merge的技術方案,即實時Binlog采集 + 離線處理Binlog還原業務數據這樣一套解決方案。Binlog是MySQL的二進制日志,記錄了MySQL中發生的所有數據變更,MySQL集群自身的主從同步就是基于Binlog做的。

    本文主要從Binlog實時采集和離線處理Binlog還原業務數據兩個方面,來介紹如何實現DB數據準確、高效地進入數倉。

    整體架構

    整體的架構如上圖所示。在Binlog實時采集方面,我們采用了阿里巴巴的開源項目Canal,負責從MySQL實時拉取Binlog并完成適當解析。Binlog采集后會暫存到Kafka上供下游消費。整體實時采集部分如圖中紅色箭頭所示。

    離線處理Binlog的部分,如圖中黑色箭頭所示,通過下面的步驟在Hive上還原一張MySQL表:

    采用Linkedin的開源項目Camus,負責每小時把Kafka上的Binlog數據拉取到Hive上。 對每張ODS表,首先需要一次性制作快照(Snapshot),把MySQL里的存量數據讀取到Hive上,這一過程底層采用直連MySQL去Select數據的方式。 對每張ODS表,每天基于存量數據和當天增量產生的Binlog做Merge,從而還原出業務數據。

    我們回過頭來看看,背景中介紹的批量取數并Load方案遇到的各種問題,為什么用這種方案能解決上面的問題呢?

    首先,Binlog是流式產生的,通過對Binlog的實時采集,把部分數據處理需求由每天一次的批處理分攤到實時流上。無論從性能上還是對MySQL的訪問壓力上,都會有明顯地改善。 第二,Binlog本身記錄了數據變更的類型(Insert/Update/Delete),通過一些語義方面的處理,完全能夠做到精準的數據還原。
    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    一级特黄大片欧美久久久久_一本一道久久综合狠狠老_JLZZ日本人年轻护士_欧美男男作爱VIDEOS可播放
      <em id="hanht"></em>

      <dd id="hanht"></dd>

      <em id="hanht"><acronym id="hanht"></acronym></em>
      
      <button id="hanht"></button>
      <rp id="hanht"><object id="hanht"><blockquote id="hanht"></blockquote></object></rp><em id="hanht"></em>