看完這一篇資料倉庫乾貨,終於搞懂什麼是hive了

一、Hive定義

--

Hive最早來源於FaceBook ,因為FaceBook網站每天產生海量的結構化日誌資料,為了對這些資料進行管理,並且因為機器學習的需求,產⽣了Hive這們技術,並繼續發展成為⼀個成功的Apache項⽬。

1、定義

Hive是⼀個基於Hadoop的資料倉庫⼯具,可以將結構化的資料檔案對映成⼀張資料表,並可以使用類似SQL的方式來對資料檔案進行讀寫以及管理,這套Hive SQL簡稱HQL。Hive的執行引擎可以是MapReduce、Spark、Tez。

2、本質

Hive的本質是將HQL轉換成MapReduce任務,完成整個資料的分析查詢,減少編寫MapReduce的複雜度

二、Hive的優缺點

1、優點

學習成本低:提供了類SQL查詢語⾔HQL,使得熟悉SQL語⾔的開發⼈員無需關心細節,可以快速上手。

海量資料分析:底層是基於海量計算到MapReduce實現.

可擴充套件性:為超大資料集設計了計算/擴充套件能力(MR作為計算引擎,HDFS作為儲存系統),Hive可以自由的擴充套件叢集的規模,⼀般情況下不需要重啟服務。

延展性:Hive支援使用者自定義函式,使用者可以根據自己的需求來實現自己的函式。

良好的容錯性:某個資料節點出現問題HQL仍可完成執行。

統計管理:提供了統⼀的元資料管理

2、缺點

Hive的HQL表達能力有限

迭代式演算法無法表達

Hive的效率比較低

Hive自動生成的MapReduce作業,通常情況下不夠智慧化

Hive調優比較困難,粒度較粗

三、Hive的架構

1、使用者連線介面

CLI:是指Shell命令列 JDBC/ODBC:是指Hive的JAVA實現,與傳統資料庫JDBC類似。 WebUI:是指可透過瀏覽器訪問Hive。

2、Thrift server

hive的可選元件,此元件是⼀個軟體框架服務,允許客戶端使用包括Java、C++、Ruby和其他很多種語研,透過程式設計的方式遠端訪問Hive。

3、元資料

Hive將元資料儲存在資料庫中,如mysql、derby。Hive中的元資料包括(表名、表所屬的資料庫名、表的擁有者、列/分割槽欄位、表的型別(是否是外部表)、表的資料所在目錄等)

4、驅動(Driver)

解析器(SQL Parser):將HQL字串轉換成抽象語法樹AST,這⼀步⼀般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、欄位是否存在、SQL語義是否有誤。

編譯器(Compiler):對hql語句進行詞法、語法、語義的編譯(需要跟元資料關聯),編譯完成後會生成⼀個執行計劃。hive上就是編譯成mapreduce的job。

最佳化器(Optimizer):將執行計劃進行最佳化,減少不必要的列、使用分割槽、使⽤索引等。最佳化job。

執行器(Executer):將最佳化後的執行計劃提交給hadoop的yarn上執行。提交job

四、Hive與關係型資料庫的異同

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進行平行計算,因此可以支援很大規模的資料;對應的,資料庫可以支援的資料規模較小。

--

--

數據分析那些事
數據分析不是個事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/