Hive基礎
一、基礎概念
Hive:facebook實現並開源的Hadoop的一個數據倉庫工具,底層數據存儲依賴於Hadoop的HDFS分佈式文件存儲上,將結構化數據映射到一張數據庫表中,並提供HQL的查詢功能,HQL的本質在於將HQL解析,轉換爲MapReduce任務進行數據的分析。
概括下:Hive就是基於HDFS進行數據存儲,HSQ基於MapReduce任務進行數據分析的Hadoop數據倉庫工具。
MapReduce 所面臨的問題:
- 1、人員學習成本太高
- 2、項目週期要求太短
- 3、MapReduce實現複雜查詢邏輯開發難度太大
爲什麼要使用 Hive
- 1、更友好的接口:操作接口採用類 SQL 的語法,提供快速開發的能力
- 2、更低的學習成本:避免了寫 MapReduce,減少開發人員的學習成本
- 3、更好的擴展性:可自由擴展集羣規模而無需重啓服務,還支持用戶自定義函數
二、數據倉庫與數據庫
- 數據庫:Database (Oracle, Mysql, PostgreSQL)主要用於事務處理(OLTP)
- 典型代表:常用的關係型數據庫(RDBMS):MySQL,Oracle,SqlServer等
- 數據倉庫:Datawarehouse (Amazon Redshift, Hive)主要用於數據分析(OLAP)。
- 典型代表:AWS Redshift, Greenplum, Hive等
Hive與關係型數據庫(RDBMS)對比
數據庫 | Hive | 關係型數據庫(RDBMS) |
---|---|---|
查詢語言 | HQL | SQL |
數據存儲 | HDFS(分佈式文件系統) | Row Device 或者 Local FS (本地文件系統) |
執行器 | MapReduce | Executor |
數據操作 | 覆蓋追加 | 行級更新刪除 |
數據插入 | 可批量導入 | 可單行、可批量導入 |
處理數據規模 | 大 | 小 |
執行延遲 | 高 | 低 |
分區 | 支持 | 支持 |
索引 | 0.8版本加入簡單索引 | 支持複雜索引 |
擴展性 | 高 | 有限 |
數據加載模式 | 讀時模式(快) | 寫時模式(慢) |
應用場景 | 海量數據 | 實時查詢 |
三、Hive的基本特性
- 採用批處理方式處理海量數據
- Hive需要把HiveQL語句轉換成MapReduce任務進行運行。
- 數據倉庫存儲的是靜態數據,對靜態數據的分析適合採用批處理方式,不需要快速響應給出結果,而且數據本身也不會頻繁變化。
- 提供適合數據倉庫操作的工具
- Hive本身提供了一系列對數據進行提取、轉換、加載(ETL)的工具,可以存儲、查詢和分析存儲在Hadoop中的大規模數據。
- 這些工具能夠很好地滿足數據倉庫各種應用場景。
四、Hive基礎組件
- 用戶接口模塊包括CLI、HWI、JDBC、ODBC、Thrift Server。
- CLI,Shell 終端命令行(Command Line Interface),採用交互形式使用 Hive 命令行與 Hive 進行交互,最常用(學習,調試,生產)
- JDBC/ODBC,是Hive的基於JDBC操作提供的客戶端,用戶(開發員,運維人員)通過 這連接至 Hive server 服務。
- Web UI,通過瀏覽器訪問 Hive。
- 驅動模塊(Driver)包括編譯器、優化器、執行器等,負責把HiveSQL語句轉換成一系列MapReduce作業。
Hive的核心是驅動引擎, 驅動引擎由四部分組成:- (1) 解釋器:解釋器的作用是將 HiveSQL 語句轉換爲抽象語法樹(AST)
- (2) 編譯器:編譯器是將語法樹編譯爲邏輯執行計劃
- (3) 優化器:優化器是對邏輯執行計劃進行優化
- (4) 執行器:執行器是調用底層的運行框架執行邏輯執行計劃
- 元數據存儲模塊(Metastore)是一個獨立的關係型數據庫(自帶derby數據庫,或MySQL數據庫)
- Hive 中的元數據通常包括:表的名字,表的列和分區及其屬性,表的屬性(內部表和 外部表),表的數據所在目錄。
- Metastore 默認存在自帶的Derby數據庫中。缺點就是不適合多用戶操作,並且數據存儲目錄不固定。數據庫跟着 Hive打開的路徑走,極度不方便管理。
- 解決方案:通常存我們自己創建的MySQL庫(本地或遠程),Hive 和 MySQL 之間通過 MetaStore 服務交互。
五、Hive的工作原理
① SQL語句轉換成MapReduce作業的基本原理
以Join語句和Group by語句爲例
- Join過程
- Group by過程
② HQL查詢轉換成MapReduce作業
- 第1步:由Hive驅動模塊中的編譯器對用戶輸入的SQL語言進行詞法和語法解析,將SQL語句轉化爲抽象語法樹的形式。
- 第2步:抽象語法樹的結構仍很複雜,不方便直接翻譯爲MapReduce算法程序,因此,把抽象語法書轉化爲查詢塊。
- 第3步:把查詢塊轉換成邏輯查詢計劃,裏面包含了許多邏輯操作符。
- 第4步:重寫邏輯查詢計劃,進行優化,合併多餘操作,減少MapReduce任務數量。
- 第5步:將邏輯操作符轉換成需要執行的具體MapReduce任務。
- 第6步:對生成的MapReduce任務進行優化,生成最終的MapReduce任務執行計劃。
- 第7步:由Hive驅動模塊中的執行器,對最終的MapReduce任務進行執行輸出。
注意事項
- 當啓動MapReduce程序時,Hive本身是不會生成MapReduce算法程序的,需要通過一個表示“Job執行計劃”的XML文件驅動執行內置的、原生的Mapper和Reducer模塊。
- Hive通過和JobTracker通信來初始化MapReduce任務,不必直接部署在JobTracker所在的管理節點上執行。
- 通常在大型集羣上,會有專門的網關機來部署Hive工具。網關機的作用主要是遠程操作和管理節點上的JobTracker通信來執行任務。
- 數據文件通常存儲在HDFS上,HDFS由名稱節點管理。