Hive是如何在Hadoop集群中工作的?

Hive Hadoop HDFS MySQL 我為技術狂 2017-06-14

hive是建設在Hadoop之上,Hive包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、MetaStore和Driver(Complier、Optimizer和Executor)。

Hive是如何在Hadoop集群中工作的?

1) Driver組件:包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優化,生成執行計劃,然後調用底層的MapReduce計算框架。

2) Metastore組件:元數據服務組件存儲hive的元數據,hive的元數據存儲在關係數據庫裡,hive支持的關係數據庫有derby、mysql。Hive還支持把metastore服務安裝到遠程的服務器集群裡,從而解耦hive服務和metastore服務。

3) Thrift服務:thrift是facebook開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的編程語言調用hive的接口。

4) CLI:command line interface,命令行接口。

5) Thrift客戶端:hive架構的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。

6) WEBGUI:hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。

用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是CLI,公司內可通過堡壘機連接ssh [email protected],直接輸入hive,就可連接到HiveServer。

Hive的metastore組件是hive元數據集中存放地。Metastore組件包括兩個部分:metastore服務和後臺數據的存儲。後臺數據存儲的介質就是關係數據庫,例如hive默認的嵌入式磁盤數據庫derby,還有mysql數據庫。Metastore服務是建立在後臺數據存儲介質之上,並且可以和hive服務進行交互的服務組件,默認情況下,metastore服務和hive服務是安裝在一起的,運行在同一個進程當中。我也可以把metastore服務從hive服務裡剝離出來,metastore獨立安裝在一個集群裡,hive遠程調用metastore服務,這樣我們可以把元數據這一層放到防火牆之後,客戶端訪問hive服務,就可以連接到元數據這一層,從而提供了更好的管理性和安全保障。使用遠程的metastore服務,可以讓metastore服務和hive服務運行在不同的進程裡,這樣也保證了hive的穩定性,提升了hive服務的效率。

對於數據存儲,Hive沒有專門的數據存儲格式,可以非常自由的組織Hive中的表,只需要在創建表的時候告訴Hive數據中的列分隔符和行分隔符,Hive就可以解析數據。Hive中所有的數據都存儲在HDFS中,存儲結構主要包括數據庫、文件、表和視圖。Hive中包含以下數據模型:Table內部表,External Table外部表,Partition分區,Bucket桶。Hive默認可以直接加載文本文件,還支持sequence file 、RCFile。

Hive的數據模型介紹如下:

1) Hive數據庫

類似傳統數據庫的DataBase,例如 hive >create database test_database;

2) 內部表

Hive的內部表與數據庫中的表在概念上是類似。每一個Table在Hive中都有一個相應的目錄存儲數據。例如一個表hive_test,它在HDFS中的路徑為/home/hdp_lbg_ectech/warehouse/hdp_lbg_ectech_bdw.db/hive_test,其中/home/hdp_lbg_ectech/warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的數據倉庫的目錄,所有的Table數據(不包括外部表)都保存在這個目錄中。刪除表時,元數據與數據都會被刪除。

建表語句示例:

CREATE EXTERNAL TABLE hdp_lbg_ectech_bdw.hive_test

(`userid` string COMMENT'')

ROW FORMAT DELIMITED FIELDS TERMINATED BY'\001';

load data inpath ‘/home/hdp_lbg_ectech/resultdata/test.txt’overwrite into table hive_test;

3) 外部表

外部表指向已經在HDFS中存在的數據,可以創建分區。它和內部表在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。內部表在加載數據的過程中,實際數據會被移動到數據倉庫目錄中。刪除表時,表中的數據和元數據將會被同時刪除。而外部表只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數據是存儲在LOCATION後面指定的 HDFS 路徑中,並不會移動到數據倉庫目錄中。當刪除一個外部表時,僅刪除該表的元數據,而實際外部目錄的數據不會被刪除,推薦使用這種模式。

4) 分區

Partition相當於數據庫中的列的索引,但是Hive組織方式和數據庫中的很不相同。在Hive中,表中的一個分區對應於表下的一個目錄,所有的分區數據都存儲在對應的目錄中。

一般是按時間、地區、類目來分區,便於局部查詢,避免掃描整個數據源。

5) 桶

Buckets是將表的列通過Hash算法進一步分解成不同的文件存儲。它對指定列計算hash,根據hash值切分數據,目的是為了並行,每一個Bucket對應一個文件。例如將userid列分散至32個bucket,首先對userid列的值計算hash,對應hash值為0的HDFS目錄為/home/hdp_lbg_ectech/resultdata/part-00000;hash值為20的HDFS目錄為/home/hdp_lbg_ectech/resultdata/part-00020。

6) Hive的視圖

視圖與傳統數據庫的視圖類似。目前只有邏輯視圖,沒有物化視圖;視圖只能查詢,不能Load/Insert/Update/Delete數據;視圖在創建時候,只是保存了一份元數據,當查詢視圖的時候,才開始執行視圖對應的那些子查詢;

如何用4個月學會Hadoop?

Hive是如何在Hadoop集群中工作的?

準備學Hadoop的同學可以找套視頻來看,當初給同事學Hadoop給他找了幾本書基本看不懂。

後來他別人給他一套視頻跟著學,4個月就學會了,我看了一下那個視頻從0基礎入門Hadoop,到中各個組件的講解都很詳細,最重要是有很多真實的案例。

把這個方法告訴大家,希望你們能少走彎路。

ganshiyu1026

需要視頻的童鞋可以力口上面這個鵬友圈。

相關推薦

推薦中...