一、Hive介紹
Apache官網給出的logo,一半是Hadoop大象的頭,一半是蜜蜂的身體,也是寓意着它是基於Hadoop,哈哈,純屬個人理解,進入正題。
Hive是基於Hadoop的一個數據倉庫工具,可以將sql語句轉換成MapReduce任務來運行。可以用來數據提取、轉化、加載(ETL),這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。
Hive定義了簡單的類sql查詢語言,成為HiveQL,它允許熟悉SQL的用戶查詢數據。
HiveSQL:Hive通過類sql的語法,來進行分布式的計算。HQL用起來和SQL非常的相似,Hive在執行的過程中會將HQL轉換為MapReduce去執行,所以Hive其實就是基於Hadoop的一種分布式計算框架,底層依然是MapReduce程序,因此它本質上還是一種離線大數據分析工具。
二、Hive的適用場景
Hive是構建在靜態(離線)批處理的Hadoop之上,Hadoop通常有較高的延遲並且在作業提交和調度的時候需要大量的開銷。因此,Hive並不能在大規模數據上實現低延遲快速的查詢。
Hive查詢操作過程嚴格遵守Hadoop MapReduce的作業執行模型,Hive將用戶的HiveQL語句通過解釋器轉換為MapReduce作業提交到Hadoop集群 中,Hadoop監控作業執行過程,然后返回作業執行結果給用戶。Hive並非為聯機事務處理而設計,Hive並不提供實時的查詢和基於行級的數據更新操作。Hive的最佳使用場景:大規模數據的離線批處理作業,例如網絡日志分析等。
三、Hive的體系結構
用戶接口主要有3個:CLI,JDBC和WUI
①CLI,最常用的模式:實際上平時在>hive命令下操作,就是CLI用戶接口
②JDBC,通過java代碼操作,需要啟動hiveserver,然后連接操作
MetaStroe元數據庫
Hive將元數據存儲在數據庫中,如mysql,derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
解釋器(Compiler)、優化器(optimizer)、執行器(executor)組件
這三個組件:HQL語句從詞法分析、語法分析、編譯、優化、以及查詢計划的生成。生成的查詢計划存儲在HDFS中,並在隨后有MapReduce調用執行
Hadoop
Hive的數據存儲在Hadoop中,大部分的查詢、計算由MapReduce完成
四、Hive的原理分析
通過上圖來分析Hive的原理(HQL的底層執行過程):
①客戶端提交一條HQL語句(左側UI部分)
②Driver將該HQL轉發給Compiler(編譯組件)對HQL進行詞法分析、語法分析。在此,編譯器要知道hql語句到底操作哪張表。
③底層查詢元數據庫(MetaStroe)尋找表信息(默認是derby數據庫,后續會換成mysql)
④返回元信息
⑤Compiler編譯器提交hql語句分析方案
⑥執行流程
i.executor執行器收到方案后,執行方案,在此需要注意:執行器在此執行方案時,會進行判斷:如果不涉及MR組件,比如為表添加分區信息,簡單的查詢操作等,此時會直接與元數據庫進行交互,然后去HDFS直接尋找具體數據;如果方案需要轉換成MRJob,則會將job提交給Hadoop的JobTracker(后續為Yarn)
ii.MR Job執行完成,並且將結果寫入HDFS中
iii.執行器與HDFS交互,獲取結果文件信息
⑦如果客戶端提交的hql語句是帶有查詢結果性,則會發生7~8~9,完成結果的查詢。