什么是Hive
hive是建立在Hadoop體系架構上的一層SQL抽象,使得數據相關人員是用他們最為熟悉的SQL語言就可以進行海量的數據的處理、分析和統計工作,而不是必須掌握JAVA等變成語言和具備開發MapReduce程序的能力。Hive SQL實際上是先被SQL解析器進行解析然后被Hive框架解析成一個MapReduce可執行的計划,並且按照該計划生成MapReduce任務后交給Hadoop集群處理。
由於Hive SQL 是翻譯為MapReduce任務后在Hadoop集群執行的,而Hadoop是一個批處理系統,所以Hive SQL是高延遲的,不但翻譯成的MapReduce任務執行延遲高,而且任務的提交和處理過程也是非常的耗時。因此,Hive即使處理的數據量非常的小,在執行的過程中也會有一定的延遲現象。同時,Hive不能提供數據排序和查詢緩存功能,也不提供在線事務處理,更不提供實時查詢和記錄的更新,因為HIVE本身被定義為處理大規模的離線數據集。如果需要實現實時查詢或記錄的更新,HBASE是一個不錯的選擇。
HIVE的基本架構
作為Hadoop的主要數據倉庫解決方案,底層存儲依賴於HDFS,而Hive SQL是主要交互接口,而真正的計算和執行則由MapReduce完成,它們之間的橋梁是Hive引擎。接下來,具體看下HIVE的引擎架構:
Hive的主要組件包括UI組件、Driver組件(Complier、Optimizer和Executor)、Metastore組件、CLI(Command Line Interface,命令行接口)、JDBC/ODBC、Thrift Server和Hive Web Interface(HWI)等。,接下來分別對這幾個組件進行介紹。
- Drvier組件
該組件是Hive的核心組件,該組件包括Complier(編譯器)、Optimizer(優化器)和Executor(執行器),它們的作用是對Hive SQL語句進行解析、編譯優化、生成執行計划,然后調用底層MR計算框架。
- MetaStore組件
該組件是Hive用來負責管理元數據的組件。Hive的元數據存儲在關系型數據庫中,其支持的關系型數據庫有Derby和mysql,其中Derby是Hive默認情況下使用的數據庫,它內嵌在Hive中,但是該數據庫只支持單會話,也就是說只允許一個會話鏈接,所以在生產中並不適用,其實其實在平時我們的測試環境中也很少使用。在我們日常的團隊開發中,需要支持多會話,所以需要一個獨立的元數據庫,用的最多的也就是Mysql,而且Hive內部對Mysql提供了很好的支持。
- CLI
Hive的命令行接口
- Thrift Server
該組件提供JDBC和ODBC接入的能力,用來進行可擴展且跨語言的服務開發。Hive集成了該服務,能讓不同的編程語言調用Hive的接口
- Hive Web Interface
該組件是Hive客戶端提供的一種通過網頁方式訪問Hive所提供的服務。這個接口對應Hive的HWI組件
Hive通過CLI,JDBC/ODBC或HWI接受相關的Hive SQL查詢,並通過Driver組件進行編譯,分析優化,最后編程可執行的MapReduce任務,但是具體里面是怎么執行的,看圖: