Hive結構

轉自http://lib.csdn.net/article/hive/49922

Hive 是建立在 Hadoop 上的數據倉庫基礎構架
它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。
Hive 定義了簡單的類 SQL 查詢語言,稱爲 QL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。

Hive 架構

Hive 的結構可以分爲以下幾部分:
- 用戶接口:包括 CLI, Client, WUI
- 元數據存儲:通常是存儲在關係數據庫如 mysql, derby 中
- 解釋器、編譯器、優化器、執行器
- Hadoop:用 HDFS 進行存儲,利用MapReduce 進行計算

  1. 用戶接口主要有三個:CLI,Client和 WUI。
    • 其中最常用的是 CLI,CLI 啓動的時候,會同時啓動一個 Hive 副本。
    • Client 是 Hive 的客戶端,用戶連接至 Hive Server。在啓動 Client 模式的時候,需要指出 Hive Server 所在節點,並且在該節點啓動 Hive Server。
    • WUI 是通過瀏覽器訪問 Hive。
  2. Hive 將元數據存儲在數據庫中,如 mysql、derby。
    Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
  3. 解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。
    生成的查詢計劃存儲在 HDFS 中,並在隨後有 MapReduce 調用執行。
  4. Hive 的數據存儲在 HDFS 中
    大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from tbl 不會生成 MapRedcue 任務)。

Hive和Hadoop關係

Hive 構建在 Hadoop 之上
- HQL 中對查詢語句的解釋、優化、生成查詢計劃是由 Hive 完成的
- 所有的數據都是存儲在 Hadoop 中
- 查詢計劃被轉化爲 MapReduce 任務,在 Hadoop 中執行(有些查詢沒有 MR 任務,如:select * from table)
- Hadoop和Hive都是用UTF-8編碼的

Hive

Hive RDBMS
查詢語言 HQL SQL
數據索引 HDFS Raw Device or Local Fs
索引
執行 MapReduce Excutor
執行延遲
處理數據規模

1. 查詢語言:由於 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發。
2. 數據存儲位置:Hive 是建立在Hadoop 之上的,所有 Hive 的數據都是存儲在HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。
3. 數據格式:Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性列分隔符(通常爲空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由於在加載數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS
目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。
4. 數據更新:由於 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive 中不支持對數據的改寫和添加,所有的數據都是在加載的時候中確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 添加數據,使用 UPDATE… SET 修改數據。
5. 索引:之前已經說過,Hive 在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapReduce 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了
Hive 不適合在線數據查詢
6. 執行:Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的(類似 select * from tbl 的查詢不需要 MapReduce)。而數據庫通常有自己的執行引擎。
7. 執行延遲:之前提到,Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架。由於 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive 的並行計算顯然能體現出優勢。
8. 可擴展性 :由於 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。
9. 數據規模:由於 Hive 建立在集羣上並可以利用 MapReduce 進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章