Hive是什么?
Hive是一種基于Hadoop的數(shù)據(jù)庫技術
并提供完整的sql查詢功能, .
HIVE能做什么?
- 可以將結(jié)構化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表
- 可以為生成的數(shù)據(jù)庫表提供完整的sql查詢功能(提供了一系列工具)
- 可以將sql語句轉(zhuǎn)換為MR job進行運行(內(nèi)部實現(xiàn), 當使用mapreduce作為engine的時候就轉(zhuǎn)為MR Job. 也可以用Tez, spark等引擎)
HIVE結(jié)構是什么樣的?
使用HiveQL作為查詢接口, 使用關系型數(shù)據(jù)庫存儲元數(shù)據(jù)(MetaData), 使用mapreduce作為執(zhí)行層, 使用HDFS作為存儲底層.
通過用戶接口傳入數(shù)據(jù), 把元數(shù)據(jù)放到關系型數(shù)據(jù)庫中去, 把讀寫的數(shù)據(jù)放入HDFS中去, 通過Driver, 把query轉(zhuǎn)換為MR Job并且完成相應的任務, 最后把結(jié)果反饋給用戶.
(1)用戶接口主要有三個:CLI淆衷,Client 和 WUI。其中最常用的是CLI顿痪,Cli啟動的時候蘑斧,會同時啟動一個Hive副本。Client是Hive的客戶端边翼,用戶連接至Hive Server鱼响。在啟動 Client模式的時候,需要指出Hive Server所在節(jié)點组底,并且在該節(jié)點啟動Hive Server丈积。 WUI是通過瀏覽器訪問Hive。
(2)MetaData: Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中债鸡,如mysql江滨、derby。Hive中的元數(shù)據(jù)包括表的名字厌均,表的列和分區(qū)及其屬性唬滑,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等棺弊。
(3)Driver:解釋器晶密、編譯器、優(yōu)化器完成HQL查詢語句從詞法分析模她、語法分析稻艰、編譯、優(yōu)化以及查詢計劃的生成侈净。生成的查詢計劃存儲在HDFS中尊勿,并在隨后有MapReduce調(diào)用執(zhí)行。
(4)Hive的數(shù)據(jù)存儲在HDFS中畜侦,大部分的查詢元扔、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)夏伊。
結(jié)構的每一部分是做什么的?
關于用戶接口
CLI:command line interface.
Client:Client 和 Web UI, CLI是開發(fā)過程中常用的接口
WUI:Client 和 Web UI, CLI是開發(fā)過程中常用的接口
關于元數(shù)據(jù)的存儲
元數(shù)據(jù)其中包括摇展,數(shù)據(jù)庫和表的hdfs位置、名稱、列的屬性等信息咏连。為什么會把元數(shù)據(jù)的存儲設置為單獨的盯孙,而不是存儲在HIVE里面?是為了把元數(shù)據(jù)分離出來祟滴,提高了數(shù)據(jù)的安全性和方便管理振惰。
關于Parser, Optimizer, Execution
Parser、Optimizer垄懂、Execution分別用來作HQL的解析器骑晶、編譯優(yōu)化、生成執(zhí)行計劃草慧,然后由MapReduce調(diào)用執(zhí)行桶蛔。但是不是所有的HQL命令都會生成mapreduce任務,例如select * from table_name就不會生成漫谷。
知識體系
Hive的數(shù)據(jù)模型
Hive沒有專門的數(shù)據(jù)存儲格式仔雷,也沒有為數(shù)據(jù)建立索引,用戶可以非常自由的組織Hive中的表舔示,只需要在創(chuàng)建表的時候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符碟婆,Hive就可以解析數(shù)據(jù)。
Hive中所有的數(shù)據(jù)都存儲在HDFS中惕稻,存儲結(jié)構主要包括數(shù)據(jù)庫竖共、文件、表和視圖俺祠。主要包含的子項有: Table內(nèi)部表, External Table外部表, Partition分區(qū), Bucket桶. Hive可以直接加載文本文件, 還支持sequence file, RCFile.
內(nèi)部表
Hive的內(nèi)部表與數(shù)據(jù)庫中的Table在概念上是類似公给。每一個Table在Hive中都有一個相應的目錄存儲數(shù)據(jù)。例如一個表pvs锻煌,它在HDFS中的路徑為/wh/pvs妓布,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的數(shù)據(jù)倉庫的目錄姻蚓,所有的Table數(shù)據(jù)(不包括External Table)都保存在這個目錄中宋梧。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除狰挡。
例子:
創(chuàng)建數(shù)據(jù)文件:test_inner_table.txt
創(chuàng)建表:create table test_inner_table (key string)
加載數(shù)據(jù):LOAD DATA LOCAL INPATH 'filepath' INTO TABLE test_inner_table
查看數(shù)據(jù):select * from test_inner_table; select count(*) from test_inner_table
刪除表:drop table test_inner_table
外部表
外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù)捂龄,可以創(chuàng)建Partition。
它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的加叁,而實際數(shù)據(jù)的存儲則有較大的差異倦沧。
--> 內(nèi)部表的創(chuàng)建過程和數(shù)據(jù)加載過程這兩個過程可以分別獨立完成,也可以在同一個語句中完成它匕,在加載數(shù)據(jù)的過程中展融,實際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)對訪問將會直接在數(shù)據(jù)倉庫目錄中完成豫柬。刪除表時告希,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除扑浸。
--> 而外部表只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成(CREATE EXTERNAL TABLE ……LOCATION)燕偶,實際數(shù)據(jù)是存儲在LOCATION后面指定的 HDFS 路徑中喝噪,并不會移動到數(shù)據(jù)倉庫目錄中。當刪除一個External Table時指么,僅刪除該鏈接酝惧。
例子:
創(chuàng)建數(shù)據(jù)文件:test_external_table.txt
創(chuàng)建表:create external table test_external_table (key string)
加載數(shù)據(jù):LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table
查看數(shù)據(jù):select * from test_external_table;
select count(*) from test_external_table
刪除表:drop table test_external_table
分區(qū)Partition
Partition對應于數(shù)據(jù)庫中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫中的很不相同伯诬。在Hive中晚唇,表中的一個Partition對應于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應的目錄中盗似。
例如pvs表中包含ds和city兩個Partition缺亮,則對應于ds = 20090801, ctry = US 的HDFS子目錄為/wh/pvs/ds=20090801/ctry=US;對應于 ds = 20090801, ctry = CA 的HDFS子目錄為/wh/pvs/ds=20090801/ctry=CA桥言。
創(chuàng)建數(shù)據(jù)文件:test_partition_table.txt
創(chuàng)建表:create table test_partition_table (key string) partitioned by (dt string)
加載數(shù)據(jù):LOAD DATA INPATH 'filepath' INTO TABLE test_partition_table partition (dt='2006')
查看數(shù)據(jù):select * from test_partition_table; select count(*) from test_partition_table
刪除表:drop table test_partition_table
桶
Buckets是將表的列通過Hash算法進一步分解成不同的文件存儲萌踱。它對指定列計算hash,根據(jù)hash值切分數(shù)據(jù)号阿,目的是為了并行并鸵,每一個Bucket對應一個文件。
例如將user列分散至32個bucket扔涧,首先對user列的值計算hash园担,對應hash值為0的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00000;hash值為20的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00020枯夜。如果想應用很多的Map任務這樣是不錯的選擇弯汰。
例子:
創(chuàng)建數(shù)據(jù)文件:test_bucket_table.txt
創(chuàng)建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets
加載數(shù)據(jù):LOAD DATA INPATH 'filepath' INTO TABLE test_bucket_table
查看數(shù)據(jù):select * from test_bucket_table;
set hive.enforce.bucketing = true;
視圖
視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。視圖是只讀的湖雹,它基于的基本表咏闪,如果改變,數(shù)據(jù)增加不會影響視圖的呈現(xiàn)摔吏;如果刪除鸽嫂,會出現(xiàn)問題。
如果不指定視圖的列征讲,會根據(jù)select語句后的生成据某。
示例:
create view test_view as select * from test
操作
-
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE [IF NOT EXISTS] userdb; //userdb是數(shù)據(jù)庫的名字
-
驗證數(shù)據(jù)庫列表:
hive> SHOW DATABASES; default userdb
-
JDBC程序:
import java.sql.SQLException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.sql.DriverManager; public class HiveCreateDb { private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { // Register driver and create driver instance Class.forName(driverName); // get connection Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", ""); Statement stmt = con.createStatement(); stmt.executeQuery("CREATE DATABASE userdb"); System.out.println(“Database userdb created successfully.”); con.close(); } }
保存程序在一個名為HiveCreateDb.java文件。下面的命令用于編譯和執(zhí)行這個程序诗箍。
$ javac HiveCreateDb.java
$ java HiveCreateDb
輸出:
Database userdb created successfully.
- 刪除數(shù)據(jù)庫
DROP DATABASE是刪除所有的表并刪除數(shù)據(jù)庫的語句
hive> DROP DATABASE IF EXISTS userdb;
-
創(chuàng)建表
hive> CREATE TABLE IF NOT EXISTS employee ( eid int, name String, > salary String, destination String) > COMMENT ‘Employee details’ > ROW FORMAT DELIMITED > FIELDS TERMINATED BY ‘t’ > LINES TERMINATED BY ‘n’ > STORED AS TEXTFILE;
載入數(shù)據(jù)
一般來說癣籽,在SQL創(chuàng)建表后,我們就可以使用INSERT語句插入數(shù)據(jù)。但在Hive中筷狼,可以使用LOAD DATA語句插入數(shù)據(jù)橱夭。同時將數(shù)據(jù)插入到Hive,最好是使用LOAD DATA來存儲大量記錄桑逝。
有兩種方法用來加載數(shù)據(jù):一種是從本地文件系統(tǒng)棘劣,第二種是從Hadoop文件系統(tǒng)。
語法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
LOCAL是標識符指定本地路徑楞遏。它是可選的茬暇。
OVERWRITE 是可選的,覆蓋表中的數(shù)據(jù)寡喝。
PARTITION 這是可選的
例子:
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
> OVERWRITE INTO TABLE employee;
- 修改表
用Alter Table語句倆修改表. 修改表的屬性糙俗,如,修改表名预鬓,修改列名巧骚,添加列,并刪除或替換列
語法:
ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
例子:
hive> ALTER TABLE employee RENAME TO emp;
- 刪除表
使用DROP語句來刪除表
以下查詢刪除一個名為 employee 的表:
hive> DROP TABLE IF EXISTS employee;
分區(qū)
內(nèi)置運算符
內(nèi)置函數(shù)
Hive支持以下內(nèi)置聚合函數(shù)格二。這些函數(shù)的用法類似于SQL聚合函數(shù)劈彪。
返回類型 | 簽名 | 描述 |
---|---|---|
BIGINT | count(), count(expr), count() - | 返回檢索行的總數(shù)。 |
DOUBLE | sum(col), sum(DISTINCT col) | 返回該組或該組中的列的不同值的分組和所有元素的總和顶猜。 |
DOUBLE | avg(col), avg(DISTINCT col) | 返回上述組或該組中的列的不同值的元素的平均值沧奴。 |
DOUBLE | min(col) | 返回該組中的列的最小值。 |
DOUBLE | max(col) | 返回該組中的列的最大值长窄。 |
視圖和索引
Select Where
SELECT語句用來從表中檢索的數(shù)據(jù)滔吠。 WHERE子句中的工作原理類似于一個條件。它使用這個條件過濾數(shù)據(jù)挠日,并返回給出一個有限的結(jié)果疮绷。
語法:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number];
例子:
hive> SELECT Id, Name, Dept FROM employee ORDER BY DEPT;
hive> SELECT Dept,count(*) FROM employee GROUP BY DEPT;
- Join
JOIN是子句用于通過使用共同值組合來自兩個表特定字段。它是用來從數(shù)據(jù)庫中的兩個或更多的表組合的記錄嚣潜。它或多或少類似于SQL JOIN冬骚。
JOIN是子句用于通過使用共同值組合來自兩個表特定字段。它是用來從數(shù)據(jù)庫中的兩個或更多的表組合的記錄郑原。它或多或少類似于SQL JOIN唉韭。
語法
join_table:
table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference
join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table_reference [join_condition]
示例
我們在本章中將使用下面的兩個表》咐纾考慮下面的表CUSTOMERS..
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
考慮另一個表命令如下:
+-----+---------------------+-------------+--------+
|OID | DATE | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 | 3 | 3000 |
| 100 | 2009-10-08 00:00:00 | 3 | 1500 |
| 101 | 2009-11-20 00:00:00 | 2 | 1560 |
| 103 | 2008-05-20 00:00:00 | 4 | 2060 |
+-----+---------------------+-------------+--------+
有不同類型的聯(lián)接給出如下:
JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
JOIN
JOIN子句用于合并和檢索來自多個表中的記錄。 JOIN和SQLOUTER JOIN 類似女器。連接條件是使用主鍵和表的外鍵酸役。
下面的查詢執(zhí)行JOIN的CUSTOMER和ORDER表,并檢索記錄:
hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT
FROM CUSTOMERS c JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功執(zhí)行查詢后,能看到以下回應:
+----+----------+-----+--------+
| ID | NAME | AGE | AMOUNT |
+----+----------+-----+--------+
| 3 | kaushik | 23 | 3000 |
| 3 | kaushik | 23 | 1500 |
| 2 | Khilan | 25 | 1560 |
| 4 | Chaitali | 25 | 2060 |
+----+----------+-----+--------+
LEFT OUTER JOIN
HiveQL LEFT OUTER JOIN返回所有行左表涣澡,即使是在正確的表中沒有匹配贱呐。這意味著,如果ON子句匹配的右表0(零)記錄入桂,JOIN還是返回結(jié)果行奄薇,但在右表中的每一列為NULL。
LEFT JOIN返回左表中的所有的值抗愁,加上右表馁蒂,或JOIN子句沒有匹配的情況下返回NULL。
下面的查詢演示了CUSTOMER 和ORDER 表之間的LEFT OUTER JOIN用法:
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
LEFT OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功執(zhí)行查詢后蜘腌,能看到以下回應:
ID | NAME | AMOUNT | DATE |
---|---|---|---|
1 | Ramesh | NULL | NULL |
2 | Khilan | 1560 | 2009-11-20 00:00:00 |
3 | kaushik | 3000 | 2009-10-08 00:00:00 |
3 | kaushik | 1500 | 2009-10-08 00:00:00 |
4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
5 | Hardik | NULL | NULL |
6 | Komal | NULL | NULL |
7 | Muffy | NULL | NULL |
RIGHT OUTER JOIN
HiveQL RIGHT OUTER JOIN返回右邊表的所有行沫屡,即使有在左表中沒有匹配。如果ON子句的左表匹配0(零)的記錄撮珠,JOIN結(jié)果返回一行沮脖,但在左表中的每一列為NULL。
RIGHT JOIN返回右表中的所有值芯急,加上左表勺届,或者沒有匹配的情況下返回NULL。
下面的查詢演示了在CUSTOMER和ORDER表之間使用RIGHT OUTER JOIN娶耍。
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
RIGHT OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功執(zhí)行查詢后涮因,能看到以下回應:
ID | NAME | AMOUNT | DATE |
---|---|---|---|
3 | kaushik | 3000 | 2009-10-08 00:00:00 |
3 | kaushik | 1500 | 2009-10-08 00:00:00 |
2 | Khilan | 1560 | 2009-11-20 00:00:00 |
4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
FULL OUTER JOIN
HiveQL FULL OUTER JOIN結(jié)合了左邊,并且滿足JOIN條件合適外部表的記錄伺绽。連接表包含兩個表的所有記錄养泡,或兩側(cè)缺少匹配結(jié)果那么使用NULL值填補
下面的查詢演示了CUSTOMER 和ORDER 表之間使用的FULL OUTER JOIN:
hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
FULL OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);
成功執(zhí)行查詢后,能看到以下回應:
ID | NAME | AMOUNT | DATE |
---|---|---|---|
1 | Ramesh | NULL | NULL |
2 | Khilan | 1560 | 2009-11-20 00:00:00 |
3 | kaushik | 3000 | 2009-10-08 00:00:00 |
3 | kaushik | 1500 | 2009-10-08 00:00:00 |
4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
5 | Hardik | NULL | NULL |
6 | Komal | NULL | NULL |
7 | Muffy | NULL | NULL |
3 | kaushik | 3000 | 2009-10-08 00:00:00 |
3 | kaushik | 1500 | 2009-10-08 00:00:00 |
2 | Khilan | 1560 | 2009-11-20 00:00:00 |
4 | Chaitali | 2060 | 2008-05-20 00:00:00 |
Hive的操作
一:Hive的幾種內(nèi)置服務
執(zhí)行bin/hive --service help 顯示如下:
[html] view plain copy
[master@master1 hive]$ bin/hive --service help
ls: 無法訪問/opt/spark/lib/spark-assembly-*.jar: 沒有那個文件或目錄
Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cli help hiveburninclient hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:
--auxpath : Auxillary jars
--config : Hive configuration directory
--service : Starts specific service/component. cli is default
Parameters used:
HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
HIVE_OPT : Hive options
For help on a particular service:
./hive --service serviceName --help
Debug help: ./hive --debug --help
我們可以看到上邊輸出項Server List奈应,里邊顯示出Hive支持的服務列表澜掩,beeline cli help hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat,下面介紹最有用的一些服務
1杖挣、cli:是Command Line Interface 的縮寫肩榕,是Hive的命令行界面,用的比較多惩妇,是默認服務株汉,直接可以在命令行里使用
2、hiveserver:這個可以讓Hive以提供Thrift服務的服務器形式來運行歌殃,可以允許許多個不同語言編寫的客戶端進行通信乔妈,使用需要啟動HiveServer服務以和客戶端聯(lián)系,我們可以通過設置HIVE_PORT環(huán)境變量來設置服務器所監(jiān)聽的端口氓皱,在默認情況下路召,端口號為10000勃刨,這個可以通過以下方式來啟動Hiverserver:
bin/hive --service hiveserver -p 10002
其中-p參數(shù)也是用來指定監(jiān)聽端口的3、hwi:其實就是hive web interface的縮寫它是hive的web借口股淡,是hive cli的一個web替代方案
4身隐、jar:與hadoop jar等價的Hive接口,這是運行類路徑中同時包含Hadoop 和Hive類的Java應用程序的簡便方式
5唯灵、metastore:在默認的情況下贾铝,metastore和hive服務運行在同一個進程中,使用這個服務埠帕,可以讓metastore作為一個單獨的進程運行垢揩,我們可以通過METASTOE——PORT來指定監(jiān)聽的端口號
二:Hive的三種啟動方式
- 1, hive 命令行模式
進入hive安裝目錄搞监,輸入bin/hive的執(zhí)行程序水孩,或者輸入 hive –service cli
用于linux平臺命令行查詢,查詢語句基本跟mysql查詢語句類似
2琐驴, hive web界面的啟動方式
bin/hive –service hwi (& 表示后臺運行)
用于通過瀏覽器來訪問hive俘种,感覺沒多大用途,瀏覽器訪問地址是:127.0.0.1:9999/hwi
- 3绝淡, hive 遠程服務 (端口號10000) 啟動方式
bin/hive –service hiveserver2 &(&表示后臺運行)
用java宙刘,python等程序?qū)崿F(xiàn)通過jdbc等驅(qū)動的訪問hive就用這種起動方式了,這個是程序員最需要的方式了
三:hiveServer/HiveServer2
1:簡單介紹
兩者都允許遠程客戶端使用多種編程語言牢酵,通過HiveServer或者HiveServer2悬包,客戶端可以在不啟動CLI的情況下對Hive中的數(shù)據(jù)進行操作,連這個和都允許遠程客戶端使用多種編程語言如java馍乙,python等向hive提交請求布近,取回結(jié)果(從hive0.15起就不再支持hiveserver了),但是在這里我們還是要說一下hiveserver
HiveServer或者HiveServer2都是基于Thrift的丝格,但HiveSever有時被稱為Thrift server撑瞧,而HiveServer2卻不會。既然已經(jīng)存在HiveServer显蝌,為什么還需要HiveServer2呢预伺?這是因為HiveServer不能處理多于一個客戶端的并發(fā)請求,這是由于HiveServer使用的Thrift接口所導致的限制曼尊,不能通過修改HiveServer的代碼修正酬诀。因此在Hive-0.11.0版本中重寫了HiveServer代碼得到了HiveServer2,進而解決了該問題骆撇。HiveServer2支持多客戶端的并發(fā)和認證瞒御,為開放API客戶端如JDBC、ODBC提供更好的支持艾船。-
2:兩者的區(qū)別
Hiveserver1 和hiveserver2的JDBC區(qū)別:
HiveServer version Connection URL Driver ClassHiveServer2 jdbc:hive2://: org.apache.hive.jdbc.HiveDriver HiveServer1 jdbc:hive://: org.apache.hadoop.hive.jdbc.HiveDriver
3:學習HiveServer和HiveServer2
HiveServer:
在命令行輸入hive --service hiveserver –help查看hiveserver的幫助信息:
[html] view plain copy
[hadoop@hadoop~]$ hive --service hiveserver --help
Starting Hive Thrift Server
usage:hiveserver
-h,--help Print help information
--hiveconf <propertyproperty=value> Use value for given property
--maxWorkerThreads <arg> maximum number of worker threads,
default:2147483647
--minWorkerThreads <arg> minimum number of worker threads,
default:100
-p <port> Hive Server portnumber, default:10000
-v,--verbose Verbose mode
啟動hiveserver服務葵腹,可以得知默認hiveserver運行在端口10000高每,最小100工作線程屿岂,最大2147483647工作線程践宴。
[html] view plain copy
[hadoop@hadoop~]$ hive --service hiveserver -v
Starting Hive Thrift Server
14/08/01 11:07:09WARN conf.HiveConf: DEPRECATED: hive.metastore.ds.retry.* no longer has anyeffect. Use hive.hmshandler.retry.*instead
Starting hive serveron port 10000 with 100 min worker threads and 2147483647 maxworker threads
以上的hiveserver在hive1.2.1中并不會出現(xiàn),官網(wǎng)的說法是:
HiveServer is scheduled to be removed from Hive releases starting Hive 0.15. See HIVE-6977. Please switch over to HiveServer2.
Hiveserver2
Hiveserver2允許在配置文件hive-site.xml中進行配置管理爷怀,具體的參數(shù)為:
[html] view plain copy
hive.server2.thrift.min.worker.threads– 最小工作線程數(shù)阻肩,默認為5。
hive.server2.thrift.max.worker.threads – 最小工作線程數(shù)运授,默認為500烤惊。
hive.server2.thrift.port– TCP 的監(jiān)聽端口,默認為10000吁朦。
hive.server2.thrift.bind.host– TCP綁定的主機柒室,默認為localhost
也可以設置環(huán)境變量HIVE_SERVER2_THRIFT_BIND_HOST和HIVE_SERVER2_THRIFT_PORT覆蓋hive-site.xml設置的主機和端口號。從Hive-0.13.0開始逗宜,HiveServer2支持通過HTTP傳輸消息雄右,該特性當客戶端和服務器之間存在代理中介時特別有用。與HTTP傳輸相關的參數(shù)如下:
[html] view plain copy
hive.server2.transport.mode – 默認值為binary(TCP)纺讲,可選值HTTP擂仍。
hive.server2.thrift.http.port– HTTP的監(jiān)聽端口,默認值為10001熬甚。
hive.server2.thrift.http.path – 服務的端點名稱逢渔,默認為 cliservice。
hive.server2.thrift.http.min.worker.threads– 服務池中的最小工作線程乡括,默認為5肃廓。
hive.server2.thrift.http.max.worker.threads– 服務池中的最小工作線程,默認為500诲泌。
啟動Hiveserver2有兩種方式盲赊,一種是上面已經(jīng)介紹過的hive --service hiveserver2,另一種更為簡潔档礁,為hiveserver2角钩。使用hive--service hiveserver2 –H或hive--service hiveserver2 –help查看幫助信息:
[html] view plain copy
Starting HiveServer2
Unrecognizedoption: -h
usage:hiveserver2
-H,--help Print help information
--hiveconf <propertyproperty=value> Use value for given property
默認情況下,HiveServer2以提交查詢的用戶執(zhí)行查詢(true)呻澜,如果hive.server2.enable.doAs設置為false递礼,查詢將以運行hiveserver2進程的用戶運行。為了防止非加密模式下的內(nèi)存泄露羹幸,可以通過設置下面的參數(shù)為true禁用文件系統(tǒng)的緩存:
[html] view plain copy
fs.hdfs.impl.disable.cache – 禁用HDFS文件系統(tǒng)緩存脊髓,默認值為false。
fs.file.impl.disable.cache – 禁用本地文件系統(tǒng)緩存栅受,默認值為false将硝。
-
4:配置使用hiveserver2(Hive 2.0為例)
sudo vim hive-site.xml 1):配置監(jiān)聽端口和路徑 <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>192.168.48.130</value> </property> 2):設置impersonation 這樣hive server會以提交用戶的身份去執(zhí)行語句恭朗,如果設置為false,則會以起hive server daemon的admin user來執(zhí)行語句 <property> <name>hive.server2.enable.doAs</name> <value>true</value> </property>
3):hiveserver2節(jié)點配置
Hiveserver2已經(jīng)不再需要hive.metastore.local這個配置項了(hive.metastore.uris為空依疼,則表示是metastore在本地痰腮,否則
就是遠程)遠程的話直接配置hive.metastore.uris即可
<property>
<name>hive.metastore.uris</name>
<value>thrift://xxx.xxx.xxx.xxx:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to con
nect to remote metastore.</description>
</property>
4):zookeeper配置
[html] view plain copy
<property>
<name>hive.support.concurrency</name>
<description>Enable Hive's Table Lock Manager Service</description>
<value>true</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<description>Zookeeper quorum used by Hive's Table Lock Manager</description>
<value>master1:2181,slave1:2181,slave2:2181</value>
</property>
注意:沒有配置hive.zookeeper.quorum會導致無法并發(fā)執(zhí)行hive ql請求和導致數(shù)據(jù)異常
5):hiveserver2的Web UI配置
Hive 2.0 以后才支持Web UI的,在以前的版本中并不支持
[html] view plain copy
<property>
<name>hive.server2.webui.host</name>
<value>192.168.48.130</value>
<description>The host address the HiveServer2 WebUI will listen on</description>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
<description>The port the HiveServer2 WebUI will listen on. This can beset to 0 o
r a negative integer to disable the web UI</description>
</property>
啟動服務:
1):啟動metastore
bin/hive --service metastore &
默認端口為9083
2):啟動hiveserver2
bin/hive --service hiveserver2 &
3):測試
Web UI:http://192.168.48.130:10002/
Hive內(nèi)置服務文章出處:@http://blog.csdn.net/gamer_gyt