Hive的入門知識

Hive是什么?

Hive是一種基于Hadoop的數(shù)據(jù)庫技術
并提供完整的sql查詢功能, .

HIVE能做什么?

  1. 可以將結(jié)構化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表
  2. 可以為生成的數(shù)據(jù)庫表提供完整的sql查詢功能(提供了一系列工具)
  3. 可以將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任務)夏伊。

image

結(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就不會生成漫谷。

知識體系

image

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 Class

     HiveServer2                          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

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末律罢,一起剝皮案震驚了整個濱河市膀值,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌误辑,老刑警劉巖沧踏,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巾钉,居然都是意外死亡翘狱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門砰苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潦匈,“玉大人,你說我怎么就攤上這事师骗±龋” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵辟癌,是天一觀的道長寒屯。 經(jīng)常有香客問我,道長黍少,這世上最難降的妖魔是什么寡夹? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮厂置,結(jié)果婚禮上菩掏,老公的妹妹穿的比我還像新娘。我一直安慰自己昵济,他們只是感情好智绸,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著访忿,像睡著了一般瞧栗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上海铆,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天迹恐,我揣著相機與錄音,去河邊找鬼卧斟。 笑死殴边,一個胖子當著我的面吹牛憎茂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锤岸,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼竖幔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了能耻?” 一聲冷哼從身側(cè)響起宵喂,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤农猬,失蹤者是張志新(化名)和其女友劉穎羹呵,沒想到半個月后钧萍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫩与,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拧簸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年域蜗,在試婚紗的時候發(fā)現(xiàn)自己被綠了绢陌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片透乾。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡洪燥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乳乌,到底是詐尸還是另有隱情捧韵,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布汉操,位于F島的核電站再来,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磷瘤。R本人自食惡果不足惜芒篷,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望采缚。 院中可真熱鬧针炉,春花似錦、人聲如沸扳抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赌渣。三九已至昌犹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸿竖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓每强,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舀射。 傳聞我的和親對象是個殘疾皇子邢羔,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容