1. 程式人生 > >數據倉庫:Mysql->Hive

數據倉庫:Mysql->Hive

人員 question 單表查詢 分隔符 sim wfq txt .net 時間

背景

寫這篇文章主要是介紹一下我做數據倉庫ETL同步的過程中遇到的一些有意思的內容和提升程序運行效率的過程。

關系型數據庫:

  項目初期:遊戲的運營數據比較輕量,相關的運營數據是通過Java後臺程序聚合查詢關系型數據庫MySQL完全可以應付,系統通過定時任務每日統計相關數據,等待運營人員查詢即可。

  項目中後期:隨著開服數量增多,玩家數量越來越多,數據庫的數據量越來越大,運營後臺查詢效率越來越低。對於普通的關系型來說,如MySQL,當單表存儲記錄數超過500萬條後,數據庫查詢性能將變得極為緩慢,而往往我們都不會只做單表查詢,還有多表join。這裏假如有100個遊戲服,每個服有20張表,而每個表有500W數據,那麽:

  總數據量 = 100 * 20 * 500W = 10億 按當時的庫表結構,換算成磁盤空間,約為100G左右

我的天吶,現在沒有單機的內存能同一時間載入100G的數據

https://www.zhihu.com/question/19719997

  所以,考慮到這一點,Hive被提出來解決難題!

數據倉庫

Hive適合做海量數據的數據倉庫工具, 因為數據倉庫中的數據有這兩個特點:最全的歷史數據(海量)、相對穩定的;所謂相對穩定,指的是數據倉庫不同於業務系統數據庫,數據經常會被更新,數據一旦進入數據倉庫,很少會被更新和刪除,只會被大量查詢。而Hive,也是具備這兩個特點

https://my.oschina.net/leejun2005/blog/189035

二、項目架構設計

在這裏先說下初期項目架構的探索,因為數據流向,其實最終就是從MYSQL----->>>>Hive中,我使用的是Jdbc方式。為什麽不使用下列工具呢?

  • Sqoop, 因為該遊戲每個服有將近80張表,然後又有很多服,以後還會更多,而每個服的庫表數據結構其實是完全一樣的,只是IP地址不一樣,使用Sqoop的話,將會需要維護越來越多的腳本,再者Sqoop沒法處理原始數據中一些帶有Hive表定義的行列分隔符
  • DataX 阿裏開源的數據同步中間件,沒做過詳細研究

version_1:

使用生產者消費者模型,中間使用內存,數據不落地,直接插入目標數據

技術分享

使用一個生產者線程從MySQL中讀取數據,並將數據依次存放在MQ中, 然後使用一個消費者線程從MQ中獲取數據,並寫入相應的txt文件中

數據倉庫:Mysql->Hive