原文:https://www.jianshu.com/p/4e72b22edf49
1、數據倉庫與數據庫
數據倉庫是數據庫概念的升級,和數據庫相比,數據倉庫要比數據庫更加龐大;
數據倉庫主要用於分析數據,數據庫主要用於捕獲數據;
數據倉庫主要存儲歷史數據,數據庫存儲在線交易數據;
數據倉庫的基本元素是維度表,數據庫的基本元素是事實表。
數據倉庫的組成部分包括數據抽取工具、數據庫、信息發布系統、數據倉庫管理、元數據、數據集市、訪問工具。
數據倉庫的數據建模分為四個階段,分別是業務建模、領域概念建模、邏輯建模、物理建模。
2、為什么要數據倉庫
為什么要建設數據倉庫呢? 在傳統數據庫里面, 我們有很多東西是實現不了的;
比如:
1) 問:我想看到任何一個用戶的任何時間的任何一個狀態! ,就相當於4維和5維的關系,我們無法看到昨天任何一個人的任何一個細節,我們看到的都是當前的, mysql數據庫也一樣,只是最終狀態的展現,不保存歷史, 當然,這和mysql建模也有關系.
答:mysql數據庫是無法實現的, 因為沒有保存歷史. 但是hive可以
2) 問:mysql的數據怎么用作模型數據,怎么實現算法
答:mysql可以導下來excal表格數據,然后用excal表格數據作為數據源,但是當時太low, 如果數據量稍微一大,就GG了, 但是hive可以, 不需要導,直接讀取就行
3) 問:mysql數據量如果多了,怎么辦?
答:mysql數據量如果多了, 可以優化,可以增加表,增加庫,增加配置等,但這不是最終解決辦法,但是hive可以, 理論上可以無限疊加數據,只要你磁盤足夠.
等等等等,實際應用中的例子太多了;
3、數據倉庫的好處
如果mysql沒有使用kuttle等傳統調度工具的話, 很難受的,每一次提取數據都得從底層去提取, 太耗功率,而且容錯率極低.
數據倉庫就不一樣了, 所有的數據都開發成中間件, 都整理好成維度表,按照分區,增全量,干干凈凈,整整潔潔,數據提取,展示超級方便!
4、數據倉庫的建設
業務數據庫 -> sa(按照業務需要根據時間抽取增全量,一般都是增量,無分區,每天最新分區) -> ods(數據明細層,有分區,每一天的sa層數據=ods的一個分區) -> dws(輕度匯總層,
將所有的需要計算的數據,都提前計算好,放到dws層,按照情況定不定分區,我們做維度漸變,需要分區,)
業務數據庫(mysql) ->sa(通過sqoop抽取) -> ods -> dws -> dwd -> dm -> app層
sa(緩沖層): 直接從mysql和MB用Sqoop抽取的,每天只保存一份,根據需求卡時間抽,包括全量增量
ods(數據明細層): 數據明細層,有分區,每一天的sa層數據=ods的一個分區,這一層的數據經過簡單的ETL清洗,比如說去除一些不合邏輯的,去重的,字段命名不規范的.
dws(輕度匯總層):這一層的目的就是報表不需要再從ods層拿數據,如果有一個字段需要從ods層拿數據,那就是dw層沒有做的好, 從ODS層中對用戶的行為做一個初步的匯總,比如說
要統計最近一周的投資人數,投資金額,投資次數,登錄次數啊,頻率啊,債轉成功次數啊,金額啊,受讓次數啊,等等,都可以做啊,也是按照主題去匯總的。這里的分區看公司的取舍吧,我們
加了分區, 犧牲了磁盤空間, 用作漸變維度。
dwd(維度表,和dws是平行的):這一層主要解決常用不變的維度信息,讓維度做一個輕度的匯總,我們可以不需要從各個源數據里面去重新找了, 比如說用戶的常用身份信息,身份證,手
機號碼,登錄地址,居住城市,學歷等其他很多信息,這些信息來源於不同的表,我們也可以做一個輕度匯總。維度表一般不加分區,但是我們也加了分區的,也需要漸變維度,做一個漸
變維度。每天一份全量。 dwd和dws的區別就是,dwd是一些維度信息, dws是業務的一些維度信息,其實如果稍微籠統的話,兩者是可以合並在一起的.
dm(報表層):這一層不多解釋了,展示的報表層,我們磁盤多,加個分區把. 我們的業務人員(如運營,產品等)從HUE平台自己寫sql查詢
app(展示層): 也加分區,這一層和dm層的區別就是,這一層的數據都是要進mysql的, 然后通過mysql展示導web界面。而dm層所有的數據都不要進mysql,如果進了mysql,
就不再dm層了,直接到app層了
5、數據倉庫中會遇到的問題
問題: 在從mysql數據抽取的時候,mysql數據會發生變化,而我們抽取過來的數據卻是沒有變化之前的
如果這點差別業務允許的話,自動忽略吧.
解決辦法1: 集中資源先把所有數據抽取過來,先抽取過來后, 再ETL.你抽取的越快, 數據的差異越小,一般也在允許范圍內.如果連這點差異都不能忍受的話,只能按照方法二了
解決辦法2: 我們之前使用canal監控mysql變化日志, 然后跑日志,實現數據完全同步,這一塊我們實現了, 但是我沒有親自做過.很遺憾.
解決辦法還有很多,以后等我找到更好的辦法后,再分享!