看完這一篇資料倉庫乾貨,終於搞懂什麼是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進行平行計算,因此可以支援很大規模的資料;對應的,資料庫可以支援的資料規模較小。