1、數據倉庫
我們常提的數倉(DataWarehouse),就是在我們已有的數據庫(他是對數據的存儲)的基礎之上,增加了對數據的OLAP(On-Line Analytical Processing),支持復雜的數據分析操作,更側重決策支持,提供直觀易懂的查詢結果,而數據庫更着重的是事務處理。換句話講,就是在數據庫已經大量存在的情況下,進一步挖掘數據資源,它包括了一整套的ETL、調度、建模在內的完整理論體系。
一句話概括:
數據庫面向事務處理任務;數據倉庫中的數據是按照一定的主題域進行組織主題。
2、數據庫和數倉區別:
DW | 數據庫 | |
用途 | 專門為數據分析設計的,涉及讀取大量數據以了解數據之間的關系和趨勢 | 用於捕獲和存儲數據 |
特性 | 數據倉庫 | 事務數據庫 |
適合的工作負載 | 分析、報告、大數據 | 事務處理 |
數據源 | 從多個來源收集和標准化的數據 | 從單個來源(例如事務系統)捕獲的數據 |
數據捕獲 | 批量寫入操作通過按照預定的批處理計划執行 | 針對連續寫入操作進行了優化,因為新數據能夠最大程度地提高事務吞吐量 |
數據標准化 | 非標准化schema,例如星型Schema或雪花型schema | 高度標准化的靜態schema |
數據存儲 | 使用列式存儲進行了優化,可實現輕松訪問和高速查詢性能 | 針對在單行型物理塊中執行高吞吐量寫入操作進行了優化 |
數據訪問 | 為最小化I/O並最大化數據吞吐量進行了優化 | 大量小型讀取操作 |
3、Hive中的數據分層
理論上一般分為三個層:ODS數據運營層、DW數據倉庫層、ADS數據服務層。基於這個基礎分層之上,再提交信息的層次,來滿足不同的業務需求。
3.1數據運營層(ODS):原始數據
ODS:Operation Data Store 數據准備區,也稱為貼源層。數據倉庫源頭系統的數據表通常會原封不動的存儲一份,稱為ODS層,是后續數據倉庫加工數據的來源。
ODS層數據的來源方式:
- 業務庫 : 經常會使用sqoop來抽取,例如每天定時抽取一次。
實時方面,可以考慮用canal監聽mysql的binlog,實時接入即可。 - 埋點日志 : 日志一般以文件的形式保存,可以選擇用flume定時同步
可以用spark streaming或者Flink來實時接入 - 消息隊列:即來自ActiveMQ、Kafka的數據等.
3.2數據倉庫層(DW):數據清洗,建模
DW數據分層,由下到上為DWD(數據明細層),DWM(數據中間層),DWS(數據服務層)。從 ODS 層中獲得的數據按照主題建立各種數據模型。這一層和維度建模會有比較深的聯系。
1> DWD:data warehouse details 細節數據層,是業務層與數據倉庫的隔離層。主要對ODS數據層做一些數據清洗和規范化的操作。(依企業業務需求)
數據清洗:去除空值、臟數據、超過極限范圍的
這一層主要是保證數據的質量和完整,方便后續層中特征分析
2> DWM:也有的稱為DWB(data warehouse base) 數據基礎層,對數據進行輕度聚合,存儲的是客觀數據,一般用作中間層,可以認為是大量指標的數據層。
這里最容易搞混,實際生產中甚至跳過這個,只有dwd和dws層,其實嚴格要求上來講,dwd層數據來源於生產系統,只對數據負責,別的不考慮。而到了dwm層,已經開始向我們的業務層靠攏,要根據數據來進行分析和輕度聚合,進行細粒度統計和沉淀。
3> DWS:data warehouse service 數據服務層,基於DWB上的基礎數據,整合匯總成分析某一個主題域的服務數據層,一般是寬表。按照業務進行划分:流量、用戶、訂單....用於提供后續的業務查詢,OLAP分析,數據分發等。
在這一層我們還會建立維度模型,常見的有雪花模型和星型模型。維度建模一般按照以下四個步驟:
1. 選擇業務過程 2. 聲明粒度 3. 確定維度 4. 確定事實。
這一層主要對ODS/DWD層數據做一些匯總。我們希望80%的業務都能通過我們的DWS層計算,而不是ODS。
3.3數據服務層/應用層(ADS):出報表
ADS:applicationData Service應用數據服務,該層主要是提供數據產品和數據分析使用的數據,一般會存儲在ES、mysql等系統中供線上系統使用。
我們通過說的報表數據,或者說那種大寬表,一般就放在這里。
4 數據來源
數據主要會有兩個大的來源:
業務庫,這里經常會使用 Sqoop 來抽取
在實時方面,可以考慮用 Canal 監聽 Mysql 的 Binlog,實時接入即可。
埋點日志,線上系統會打入各種日志,這些日志一般以文件的形式保存,我們可以選擇用 Flume 定時抽取,也可以用用 Spark Streaming 或者 Storm 來實時接入,當然,Kafka 也會是一個關鍵的角色。
還有使用filebeat收集日志,打到kafka,然后處理日志
注意: 在這層,理應不是簡單的數據接入,而是要考慮一定的數據清洗,比如異常字段的處理、字段命名規范化、時間字段的統一等,一般這些很容易會被忽略,但是卻至關重要。特別是后期我們做各種特征自動生成的時候,會十分有用。
總結:
1. 原始數據拉取過來,保持和元數據同步,不做處理形成ODS層;
2. 基於ODS層,保持數據原始粒度,對數據加工和處理(也就是清洗),提供干凈的數據作DWD層;
3. 根據ODS和DWD層數據,進行輕度匯總,保留較多維度,形成DWM層;
4. 基於以上所有DW層數據,進行高度匯總,形成DWS層。
DWS會做高度匯總,DWD和ODS粒度相同。
參考:
https://www.cnblogs.com/itboys/p/10592871.html