国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數據庫 > MySQL > 正文

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

2024-07-25 19:09:36
字體:
來源:轉載
供稿:網友

背景

在數據倉庫建模中,未經任何加工處理的原始業務層數據,我們稱之為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數據準確、高效地進入數倉。

整體架構

美團,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),通過一些語義方面的處理,完全能夠做到精準的數據還原。

Binlog實時采集

對Binlog的實時采集包含兩個主要模塊:一是CanalManager,主要負責采集任務的分配、監控報警、元數據管理以及和外部依賴系統的對接;二是真正執行采集任務的Canal和CanalClient。

美團,DB,數據同步,數據倉庫

當用戶提交某個DB的Binlog采集請求時,CanalManager首先會調用DBA平臺的相關接口,獲取這一DB所在MySQL實例的相關信息,目的是從中選出最適合Binlog采集的機器。然后把采集實例(Canal Instance)分發到合適的Canal服務器上,即CanalServer上。在選擇具體的CanalServer時,CanalManager會考慮負載均衡、跨機房傳輸等因素,優先選擇負載較低且同地域傳輸的機器。

CanalServer收到采集請求后,會在ZooKeeper上對收集信息進行注冊。注冊的內容包括:

  • 以Instance名稱命名的永久節點。
  • 在該永久節點下注冊以自身ip:port命名的臨時節點。

這樣做的目的有兩個:

  • 高可用:CanalManager對Instance進行分發時,會選擇兩臺CanalServer,一臺是Running節點,另一臺作為Standby節點。Standby節點會對該Instance進行監聽,當Running節點出現故障后,臨時節點消失,然后Standby節點進行搶占。這樣就達到了容災的目的。
  • 與CanalClient交互:CanalClient檢測到自己負責的Instance所在的Running CanalServer后,便會進行連接,從而接收到CanalServer發來的Binlog數據。

對Binlog的訂閱以MySQL的DB為粒度,一個DB的Binlog對應了一個Kafka Topic。底層實現時,一個MySQL實例下所有訂閱的DB,都由同一個Canal Instance進行處理。這是因為Binlog的產生是以MySQL實例為粒度的。CanalServer會拋棄掉未訂閱的Binlog數據,然后CanalClient將接收到的Binlog按DB粒度分發到Kafka上。

離線還原MySQL數據

完成Binlog采集后,下一步就是利用Binlog來還原業務數據。首先要解決的第一個問題是把Binlog從Kafka同步到Hive上。

美團,DB,數據同步,數據倉庫

Kafka2Hive

整個Kafka2Hive任務的管理,在美團數據平臺的ETL框架下進行,包括任務原語的表達和調度機制等,都同其他ETL類似。而底層采用LinkedIn的開源項目Camus,并進行了有針對性的二次開發,來完成真正的Kafka2Hive數據傳輸工作。

對Camus的二次開發

Kafka上存儲的Binlog未帶Schema,而Hive表必須有Schema,并且其分區、字段等的設計,都要便于下游的高效消費。對Camus做的第一個改造,便是將Kafka上的Binlog解析成符合目標Schema的格式。

對Camus做的第二個改造,由美團的ETL框架所決定。在我們的任務調度系統中,目前只對同調度隊列的任務做上下游依賴關系的解析,跨調度隊列是不能建立依賴關系的。而在MySQL2Hive的整個流程中,Kafka2Hive的任務需要每小時執行一次(小時隊列),Merge任務每天執行一次(天隊列)。而Merge任務的啟動必須要嚴格依賴小時Kafka2Hive任務的完成。

為了解決這一問題,我們引入了Checkdone任務。Checkdone任務是天任務,主要負責檢測前一天的Kafka2Hive是否成功完成。如果成功完成了,則Checkdone任務執行成功,這樣下游的Merge任務就可以正確啟動了。

Checkdone的檢測邏輯

Checkdone是怎樣檢測的呢?每個Kafka2Hive任務成功完成數據傳輸后,由Camus負責在相應的HDFS目錄下記錄該任務的啟動時間。Checkdone會掃描前一天的所有時間戳,如果最大的時間戳已經超過了0點,就說明前一天的Kafka2Hive任務都成功完成了,這樣Checkdone就完成了檢測。

此外,由于Camus本身只是完成了讀Kafka然后寫HDFS文件的過程,還必須完成對Hive分區的加載才能使下游查詢到。因此,整個Kafka2Hive任務的最后一步是加載Hive分區。這樣,整個任務才算成功執行。

每個Kafka2Hive任務負責讀取一個特定的Topic,把Binlog數據寫入original_binlog庫下的一張表中,即前面圖中的original_binlog.db,其中存儲的是對應到一個MySQL DB的全部Binlog。

美團,DB,數據同步,數據倉庫

上圖說明了一個Kafka2Hive完成后,文件在HDFS上的目錄結構。假如一個MySQL DB叫做user,對應的Binlog存儲在original_binlog.user表中。ready目錄中,按天存儲了當天所有成功執行的Kafka2Hive任務的啟動時間,供Checkdone使用。每張表的Binlog,被組織到一個分區中,例如userinfo表的Binlog,存儲在table_name=userinfo這一分區中。每個table_name一級分區下,按dt組織二級分區。圖中的xxx.lzo和xxx.lzo.index文件,存儲的是經過lzo壓縮的Binlog數據。

Merge

Binlog成功入倉后,下一步要做的就是基于Binlog對MySQL數據進行還原。Merge流程做了兩件事,首先把當天生成的Binlog數據存放到Delta表中,然后和已有的存量數據做一個基于主鍵的Merge。Delta表中的數據是當天的最新數據,當一條數據在一天內發生多次變更時,Delta表中只存儲最后一次變更后的數據。

把Delta數據和存量數據進行Merge的過程中,需要有唯一鍵來判定是否是同一條數據。如果同一條數據既出現在存量表中,又出現在Delta表中,說明這一條數據發生了更新,則選取Delta表的數據作為最終結果;否則說明沒有發生任何變動,保留原來存量表中的數據作為最終結果。Merge的結果數據會Insert Overwrite到原表中,即圖中的origindb.table。

Merge流程舉例

下面用一個例子來具體說明Merge的流程。

美團,DB,數據同步,數據倉庫

數據表共id、value兩列,其中id是主鍵。在提取Delta數據時,對同一條數據的多次更新,只選擇最后更新的一條。所以對id=1的數據,Delta表中記錄最后一條更新后的值value=120。Delta數據和存量數據做Merge后,最終結果中,新插入一條數據(id=4),兩條數據發生了更新(id=1和id=2),一條數據未變(id=3)。

默認情況下,我們采用MySQL表的主鍵作為這一判重的唯一鍵,業務也可以根據實際情況配置不同于MySQL的唯一鍵。

上面介紹了基于Binlog的數據采集和ODS數據還原的整體架構。下面主要從兩個方面介紹我們解決的實際業務問題。

實踐一:分庫分表的支持

隨著業務規模的擴大,MySQL的分庫分表情況越來越多,很多業務的分表數目都在幾千個這樣的量級。而一般數據開發同學需要把這些數據聚合到一起進行分析。如果對每個分表都進行手動同步,再在Hive上進行聚合,這個成本很難被我們接受。因此,我們需要在ODS層就完成分表的聚合。

美團,DB,數據同步,數據倉庫

首先,在Binlog實時采集時,我們支持把不同DB的Binlog寫入到同一個Kafka Topic。用戶可以在申請Binlog采集時,同時勾選同一個業務邏輯下的多個物理DB。通過在Binlog采集層的匯集,所有分庫的Binlog會寫入到同一張Hive表中,這樣下游在進行Merge時,依然只需要讀取一張Hive表。

第二,Merge任務的配置支持正則匹配。通過配置符合業務分表命名規則的正則表達式,Merge任務就能了解自己需要聚合哪些MySQL表的Binlog,從而選取相應分區的數據來執行。

這樣通過兩個層面的工作,就完成了分庫分表在ODS層的合并。

這里面有一個技術上的優化,在進行Kafka2Hive時,我們按業務分表規則對表名進行了處理,把物理表名轉換成了邏輯表名。例如userinfo123這張表名會被轉換為userinfo,其Binlog數據存儲在original_binlog.user表的table_name=userinfo分區中。這樣做的目的是防止過多的HDFS小文件和Hive分區造成的底層壓力。

實踐二:刪除事件的支持

Delete操作在MySQL中非常常見,由于Hive不支持Delete,如果想把MySQL中刪除的數據在Hive中刪掉,需要采用“迂回”的方式進行。

對需要處理Delete事件的Merge流程,采用如下兩個步驟:

  • 首先,提取出發生了Delete事件的數據,由于Binlog本身記錄了事件類型,這一步很容易做到。將存量數據(表A)與被刪掉的數據(表B)在主鍵上做左外連接(Left outer join),如果能夠全部join到雙方的數據,說明該條數據被刪掉了。因此,選擇結果中表B對應的記錄為NULL的數據,即是應當被保留的數據。
  • 然后,對上面得到的被保留下來的數據,按照前面描述的流程做常規的Merge。

美團,DB,數據同步,數據倉庫

展望

作為數據倉庫生產的基礎,美團數據平臺提供的基于Binlog的MySQL2Hive服務,基本覆蓋了美團內部的各個業務線,目前已經能夠滿足絕大部分業務的數據同步需求,實現DB數據準確、高效地入倉。在后面的發展中,我們會集中解決CanalManager的單點問題,并構建跨機房容災的架構,從而更加穩定地支撐業務的發展。

本文主要從Binlog流式采集和基于Binlog的ODS數據還原兩方面,介紹了這一服務的架構,并介紹了我們在實踐中遇到的一些典型問題和解決方案。希望能夠給其他開發者一些參考價值,同時也歡迎大家和我們一起交流。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
在线免费日韩| 天天av综合网| 人人干人人插| 国产视频精品久久| 九九热免费在线视频| 久久国产情侣| 日本中文字幕视频| 国产黄在线观看| 一级黄色av| 丁香婷婷激情| 伊人免费视频| 九九热在线视频观看| 91sp网站在线观看入口| 国产白浆在线| 免费a在线看| 国产午夜在线| 免费网站看黄yyy222| 国产裸舞福利在线视频合集 | 国产日韩欧美第一页 | gogogogo高清视频在线| 国产精品被窝福利一区| 开心丁香婷婷深爱五月| 国产福利在线视频| 国产91大片| 亚洲精品自产拍在线观看| 国产深夜视频在线观看| 成年网在线观看免费观看网址| 99久久国产视频| 亚洲欧美小说国产图片| 国产精品久久在线| 国产尤物一区二区三区| 天天插天天狠天天透| 精品视频vs精品视频| 中文字幕在线播放网址| eeuss影院在线观看第一页| 91中文字幕| 国产对白叫床清晰在线播放| 国产另类图片| 午夜伦全在线观看| 国产麻豆麻豆| 国产亚洲精品久久久久久青梅| 超碰在线中文| 国产在线观看网站| 国产美女av在线| 国产午夜在线观看| 日本成a人片在线观看| 99久热re在线精彩视频| 国产高清av| 国产黄在线看| 精品全国在线一区二区| 精品久久亚洲一级α| 国产福利在线播放麻豆| 国产区在线观看| 2019中文字幕在线电影免费| 精品美女在线观看视频在线观看 | 最近中文字幕大全中文字幕免费| 福利在线视频导航| 中文字幕免费中文| 精品一区二区三区高清免费不卡 | 日本aⅴ写真网站免费| 99爱在线观看| 麻豆视频在线观看免费网站| 青草视频在线播放| 国产亚洲精品午夜高清影院| 精品国产高清自在线一区二区三区 | 中文字幕色视频| 国产高清免费视频| 九九热在线播放| 国产精品扒开做爽爽爽的视频| 在线中文视频| 国产一区精品| 快射av在线播放一区| 国产香蕉在线| 国产在线麻豆精品| 精品久久亚洲一级α| 黄色片视频在线观看| 伊人精品影院| 九九99九九精彩| 91桃色在线| 国产一级免费| 欧美精品小视频| 亚洲男人的天堂成人| 国产高清在线| 国产一级视频| 久久亚洲天堂| www.操操操.com| 精品av中文字幕在线毛片| 国产精品一区二区三区高清在线 | 国产精品一区二三区| 在线中文视频| 国产福利三区| 国产丝袜精品丝袜| 国产资源在线看| 亚洲私人影吧| 国产youjizz在线| 国产粉嫩一区二区三区在线观看| 中文字幕一区免费| 国产一区二区三区不卡在线| 成人欧美精品久久久久影院| 日本动漫同人动漫在线观看| 亚洲精品天堂在线| jizz性欧美| 国产激情视频一区二区三区| 成人福利视频导航| 中文字幕不卡| 18av在线播放| 在线色视频网| gogo高清在线播放免费| www.色五月| 久蕉依人在线视频| 国产理论电影在线| 国产秀色在线www免费观看| 国产欧美日本亚洲精品一4区| 国产三级在线| 精品乱码一区二区三四区视频| 精品国产一区二区三区四区阿崩 | 白浆爆出在线观看| 日本在线视频www鲁啊鲁| av人人综合网| 九九热在线观看| 国产日产一区二区三区| 国产精品二线| 天堂在线国产| 国产永久在线观看| 91高清国产| 青青在线视频| 国产午夜精品一区理论片| 中文视频在线| 五月婷婷开心综合| 在线亚洲不卡| 国产精品亚洲色图| 亚洲欧美日韩成人网| 国产精品作爱| av首页在线| 国产精品久久麻豆| 天天插天天干| 国产精品久久久久白浆| 欧美性猛交xxxx免费看久久| 国产无遮挡又黄又爽免费软件| 亚洲久草视频| 最近最好的中文字幕2019免费| 国产色在线 com| 久久一本精品| 亚洲成人国产综合| 国产欧美日韩精品综合| 黄色一级视频网站| 牛牛精品视频在线| 91极品在线| 国产精品免费视频一区一| 国产鲁鲁视频在线观看特色| 蜜桃av在线免费观看| av手机免费在线观看| 国产高清一级片| 国产午夜在线视频| 国产九九在线| 国产在线激情视频| 高清视频一区二区三区四区| gogo在线高清视频| av资源网站在线观看| www.xxx黄| 狠狠干在线视频| 天天操天天射天天色| 国产理论片免费观看| 中文字幕亚洲精品视频| 国产色视频网站| 精品一区二区三区在线观看l| 2021av在线| av网站大全在线| 欧美午夜电影一区二区三区| 日本啊v在线| www在线观看播放免费视频日本| www.91在线播放| 国产69精品久久app免费版| 久久久久久久久久久久久91| 国内精品不卡| 国产精品久久一区二区三区不卡| 国产日韩精品在线看| 国产成人天天5g影院| 在线免费看av| 国产麻豆综合视频在线观看| 国产激情小视频在线| 影音先锋中文字幕在线| 欧美日韩一区二区三区在线播放| 狠狠插狠狠操| 精品国产一区二区三区不卡在线 | 一本久中文高清| 男女午夜视频在线观看| 最新亚洲精品国自产在线观看| 国产福利一区二区在线精品| 99久热re在线精彩视频| 黄色网址在线免费播放| 91桃色在线| 国产小黄视频| 国产中文字幕av| 在线观看中文字幕| 国产私拍精品| 超碰免费在线播放| 亚洲欧美综合乱码精品成人网 | 国产网站免费观看| 亚洲精品天堂在线观看|