首先我們得明白什么是數據倉庫?
數據倉庫,英文名稱為Data warehouse,可簡寫為DW或DWH。數據倉庫的目的是構建面向分析的集成化數據環境,為企業提供決策支持(Decision Support)。它出於分析性報告和決策支持目的而創建。
數據倉庫本身並不“生產”任何數據,同時自身也不需要“消費”任何的數據,數據來源於外部,並且開放給外部應用,這也是為什么叫“倉庫”,而不叫“工廠”的原因。
數據倉庫的主要特征:數據倉庫是 面向主題的(Subject-Oriented )、 集成的(Integrated)、非易失的(Non-Volatile)和 時變的(Time-Variant )數據集合,用以支持管理決策。
數據倉庫與數據庫的區別:數據庫與數據倉庫的區別實際講的是 OLTP 與 OLAP 的區別。
操作型處理,叫聯機事務處理 OLTP(On-Line Transaction Processing),也可以稱面向交易的處理系統,它是針對具體業務在數據庫聯機的日常操作,通常對少數記錄進行查詢、修改。用戶較為關心操作的響應時間、數據的安全性、完整性和並發支持的用戶數等問題。傳統的數據庫系統作為數據管理的主要手段,主要用於操作型處理。
分析型處理,叫聯機分析處理 OLAP(On-Line Analytical Processing)一般針對某些主題的歷史數據進行分析,支持管理決策。
首先我們要明白,數據倉庫的出現,並不是要取代數據庫。概況起來,可以從以下幾個方面去看待數據倉庫跟數據庫的區別:
- 數據庫是面向事務的設計,數據倉庫是面向主題設計的。
- 數據庫一般存儲業務數據,數據倉庫存儲的一般是歷史數據。
- 數據庫設計是盡量避免冗余,一般針對某一業務應用進行設計,比如一張簡單的 User 表,記錄用戶名、密碼等簡單數據即可,符合業務應用,但是不符合分析。數據倉庫在設計是有意引入冗余,依照分析需求,分析維度、分析指標進行設計。
- 數據庫是為捕獲數據而設計,數據倉庫是為分析數據而設計。
關於數據倉庫分層架構:按照數據流入流出的過程,數據倉庫架構可分為三層—— 源數據、數據倉庫、數據應用。
數據倉庫的數據來源於不同的源數據,並提供多樣的數據應用,數據自下而上流入數據倉庫后向上層開放應用,而數據倉庫只是中間集成化數據管理的一個平台。
源數據層(ODS):此層數據無任何更改,直接沿用外圍系統數據結構和數據,不對外開放;為臨時存儲層,是接口數據的臨時存儲區域,為后一步的數據處理做准備。
細節層(DW):為數據倉庫層,DW 層的數據應該是一致的、准確的、干凈的數據,即對源系統數據進行了清洗(去除了雜質)后的數據。
應用層(DA 或 APP):前端應用直接讀取的數據源;根據報表、專題分析需求而計算生成的數據。
數據倉庫從各數據源獲取數據及在數據倉庫內的數據轉換和流動都可以認為是 ETL(抽取 Extra, 轉化 Transfer, 裝載 Load)的過程,ETL 是數據倉庫的流水線,也可以認為是數據倉庫的血液,它維系着數據倉庫中數據的新陳代謝,而數據倉庫日常的管理和維護工作的大部分精力就是保持 ETL 的正常和穩定。
為什么要對數據倉庫分層?
用空間換時間,通過大量的預處理來提升應用系統的用戶體驗(效率),因此數據倉庫會存在大量冗余的數據;不分層的話,如果源業務系統的業務規則發生變化將會影響整個數據清洗過程,工作量巨大。
通過數據分層管理可以簡化數據清洗的過程,因為把原來一步的工作分到了多個步驟去完成,相當於把一個復雜的工作拆成了多個簡單的工作,把一個大的黑盒變成了一個白盒,每一層的處理邏輯都相對簡單和容易理解,這樣我們比較容易保證每一個步驟的正確性,當數據發生錯誤的時候,往往我們只需要局部調整某個步驟即可。
數據倉庫元數據管理
元數據(Meta Date),其實應該叫做解釋性數據,或者數據字典,即數據的數據。主要記錄數據倉庫中模型的定義、各層級間的映射關系、監控數據倉庫的數據狀態及 ETL 的任務運行狀態。一般會通過元數據資料庫(MetadataRepository)來統一地存儲和管理元數據,其主要目的是使數據倉庫的設計、部署、操作和管理能達成協同和一致。
元數據是數據倉庫管理系統的重要組成部分,元數據管理是企業級數據倉庫中的關鍵組件,貫穿數據倉庫構建的整個過程,直接影響着數據倉庫的構建、使用和維護。
注:
- 構建數據倉庫的主要步驟之一是 ETL。這時元數據將發揮重要的作用,它定義了源數據系統到數據倉庫的映射、數據轉換的規則、數據倉庫的邏輯結構、數據更新的規則、數據導入歷史記錄以及裝載周期等相關內容。數據抽取和轉換的專家以及數據倉庫管理員正是通過元數據高效地構建數據倉庫。
- 用戶在使用數據倉庫時,通過元數據訪問數據,明確數據項的含義以及定制報表。
- 數據倉庫的規模及其復雜性離不開正確的元數據管理,包括增加或移除外部數據源,改變數據清洗方法,控制出錯的查詢以及安排備份等。
由上可見,元數據不僅定義了數據倉庫中數據的模式、來源、抽取和轉換規則等,而且是整個數據倉庫系統運行的基礎,元數據把數據倉庫系統中各個松散的組件聯系起來,組成了一個有機的整體。
那么重點來了,什么是hive呢?
Hive是基於hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類SQL查詢功能。本質是將SQL轉換為MapReduce程序。
hive的主要用途:用來做離線數據分析,比直接用MapReduce程序開發效率更高。
直接使用MapReduce所面臨的問題:
- 人員學習成本太高
- 項目周期要求太短
- MapReduce 實現復雜查詢邏輯開發難度太大
為什么使用hive:
- 操作接口采用類 SQL 語法,提供快速開發的能力。
- 避免了去寫 MapReduce,減少開發人員的學習成本。
- 功能擴展很方便。
再來看一下hive的架構圖
Hive基本組成
- 用戶接口:包括 CLI、JDBC/ODBC、WebGUI。
- 元數據存儲:通常是存儲在關系數據庫如 mysql , derby 中。
- 解釋器、編譯器、優化器、執行器。
Hive 各組件的基本功能
用戶接口主要由三個:CLI、JDBC/ODBC 和 WebGUI。其中,CLI(command lineinterface)為 shell 命令行;JDBC/ODBC 是 Hive 的 JAVA 實現,與傳統數據庫 JDBC 類似;WebGUI 是通過瀏覽器訪問 Hive。
元數據存儲:Hive 將元數據存儲在數據庫中。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在 HDFS 中,並在隨后有MapReduce 調用執行。
Hive 與 Hadoop 的關系
Hive 利用 HDFS存儲數據,利用 MapReduce 查詢分析數據 。
Hive與傳統數據庫對比
hive 用於海量數據的離線數據分析。hive 具有 sql 數據庫的外表,但應用場景完全不同,hive 只適合用來做批量數據統計分析。更直觀的對比看下面這幅圖: