Hive是什么?
Hive是一种基于Hadoop的数据库技术
并提供完整的sql查询功能, .
HIVE能做什么?
- 可以将结构化的数据文件映射为一张数据库表
- 可以为生成的数据库表提供完整的sql查询功能(提供了一系列工具)
- 可以将sql语句转换为MR job进行运行(内部实现, 当使用mapreduce作为engine的时候就转为MR Job. 也可以用Tez, spark等引擎)
HIVE结构是什么样的?
使用HiveQL作为查询接口, 使用关系型数据库存储元数据(MetaData), 使用mapreduce作为执行层, 使用HDFS作为存储底层.
通过用户接口传入数据, 把元数据放到关系型数据库中去, 把读写的数据放入HDFS中去, 通过Driver, 把query转换为MR Job并且完成相应的任务, 最后把结果反馈给用户.
(1)用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
(2)MetaData: Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)Driver:解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
结构的每一部分是做什么的?
关于用户接口
CLI:command line interface.
Client:Client 和 Web UI, CLI是开发过程中常用的接口
WUI:Client 和 Web UI, CLI是开发过程中常用的接口
关于元数据的存储
元数据其中包括,数据库和表的hdfs位置、名称、列的属性等信息。为什么会把元数据的存储设置为单独的,而不是存储在HIVE里面?是为了把元数据分离出来,提高了数据的安全性和方便管理。
关于Parser, Optimizer, Execution
Parser、Optimizer、Execution分别用来作HQL的解析器、编译优化、生成执行计划,然后由MapReduce调用执行。但是不是所有的HQL命令都会生成mapreduce任务,例如select * from table_name就不会生成。
知识体系
Hive的数据模型
Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。主要包含的子项有: Table内部表, External Table外部表, Partition分区, Bucket桶. Hive可以直接加载文本文件, 还支持sequence file, RCFile.
内部表
Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。例如一个表pvs,它在HDFS中的路径为/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。
例子:
创建数据文件:test_inner_table.txt
创建表:create table test_inner_table (key string)
加载数据:LOAD DATA LOCAL INPATH 'filepath' INTO TABLE test_inner_table
查看数据:select * from test_inner_table; select count(*) from test_inner_table
删除表:drop table test_inner_table
外部表
外部表指向已经在HDFS中存在的数据,可以创建Partition。
它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
--> 内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。
--> 而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。
例子:
创建数据文件:test_external_table.txt
创建表:create external table test_external_table (key string)
加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table
查看数据:select * from test_external_table;
select count(*) from test_external_table
删除表:drop table test_external_table
分区Partition
Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。
例如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。
创建数据文件:test_partition_table.txt
创建表:create table test_partition_table (key string) partitioned by (dt string)
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_partition_table partition (dt='2006')
查看数据:select * from test_partition_table; select count(*) from test_partition_table
删除表:drop table test_partition_table
桶
Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个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任务这样是不错的选择。
例子:
创建数据文件:test_bucket_table.txt
创建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_bucket_table
查看数据:select * from test_bucket_table;
set hive.enforce.bucketing = true;
视图
视图与传统数据库的视图类似。视图是只读的,它基于的基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。
如果不指定视图的列,会根据select语句后的生成。
示例:
create view test_view as select * from test
操作
-
创建数据库
CREATE DATABASE [IF NOT EXISTS] userdb; //userdb是数据库的名字
-
验证数据库列表:
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文件。下面的命令用于编译和执行这个程序。
$ javac HiveCreateDb.java
$ java HiveCreateDb
输出:
Database userdb created successfully.
- 删除数据库
DROP DATABASE是删除所有的表并删除数据库的语句
hive> DROP DATABASE IF EXISTS userdb;
-
创建表
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;
载入数据
一般来说,在SQL创建表后,我们就可以使用INSERT语句插入数据。但在Hive中,可以使用LOAD DATA语句插入数据。同时将数据插入到Hive,最好是使用LOAD DATA来存储大量记录。
有两种方法用来加载数据:一种是从本地文件系统,第二种是从Hadoop文件系统。
语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
LOCAL是标识符指定本地路径。它是可选的。
OVERWRITE 是可选的,覆盖表中的数据。
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;
分区
内置运算符
内置函数
Hive支持以下内置聚合函数。这些函数的用法类似于SQL聚合函数。
返回类型 | 签名 | 描述 |
---|---|---|
BIGINT | count(), count(expr), count() - | 返回检索行的总数。 |
DOUBLE | sum(col), sum(DISTINCT col) | 返回该组或该组中的列的不同值的分组和所有元素的总和。 |
DOUBLE | avg(col), avg(DISTINCT col) | 返回上述组或该组中的列的不同值的元素的平均值。 |
DOUBLE | min(col) | 返回该组中的列的最小值。 |
DOUBLE | max(col) | 返回该组中的列的最大值。 |
视图和索引
Select Where
SELECT语句用来从表中检索的数据。 WHERE子句中的工作原理类似于一个条件。它使用这个条件过滤数据,并返回给出一个有限的结果。
语法:
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是子句用于通过使用共同值组合来自两个表特定字段。它是用来从数据库中的两个或更多的表组合的记录。它或多或少类似于SQL JOIN。
JOIN是子句用于通过使用共同值组合来自两个表特定字段。它是用来从数据库中的两个或更多的表组合的记录。它或多或少类似于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 |
+-----+---------------------+-------------+--------+
有不同类型的联接给出如下:
JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
JOIN
JOIN子句用于合并和检索来自多个表中的记录。 JOIN和SQLOUTER JOIN 类似。连接条件是使用主键和表的外键。
下面的查询执行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);
成功执行查询后,能看到以下回应:
+----+----------+-----+--------+
| 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还是返回结果行,但在右表中的每一列为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);
成功执行查询后,能看到以下回应:
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结果返回一行,但在左表中的每一列为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);
成功执行查询后,能看到以下回应:
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结合了左边,并且满足JOIN条件合适外部表的记录。连接表包含两个表的所有记录,或两侧缺少匹配结果那么使用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);
成功执行查询后,能看到以下回应:
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的几种内置服务
执行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服务以和客户端联系,我们可以通过设置HIVE_PORT环境变量来设置服务器所监听的端口,在默认情况下,端口号为10000,这个可以通过以下方式来启动Hiverserver:
bin/hive --service hiveserver -p 10002
其中-p参数也是用来指定监听端口的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来指定监听的端口号
二:Hive的三种启动方式
- 1, hive 命令行模式
进入hive安装目录,输入bin/hive的执行程序,或者输入 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等程序实现通过jdbc等驱动的访问hive就用这种起动方式了,这个是程序员最需要的方式了
三:hiveServer/HiveServer2
1:简单介绍
两者都允许远程客户端使用多种编程语言,通过HiveServer或者HiveServer2,客户端可以在不启动CLI的情况下对Hive中的数据进行操作,连这个和都允许远程客户端使用多种编程语言如java,python等向hive提交请求,取回结果(从hive0.15起就不再支持hiveserver了),但是在这里我们还是要说一下hiveserver
HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有时被称为Thrift server,而HiveServer2却不会。既然已经存在HiveServer,为什么还需要HiveServer2呢?这是因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供更好的支持。-
2:两者的区别
Hiveserver1 和hiveserver2的JDBC区别:
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中并不会出现,官网的说法是:
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中进行配置管理,具体的参数为:
[html] view plain copy
hive.server2.thrift.min.worker.threads– 最小工作线程数,默认为5。
hive.server2.thrift.max.worker.threads – 最小工作线程数,默认为500。
hive.server2.thrift.port– TCP 的监听端口,默认为10000。
hive.server2.thrift.bind.host– TCP绑定的主机,默认为localhost
也可以设置环境变量HIVE_SERVER2_THRIFT_BIND_HOST和HIVE_SERVER2_THRIFT_PORT覆盖hive-site.xml设置的主机和端口号。从Hive-0.13.0开始,HiveServer2支持通过HTTP传输消息,该特性当客户端和服务器之间存在代理中介时特别有用。与HTTP传输相关的参数如下:
[html] view plain copy
hive.server2.transport.mode – 默认值为binary(TCP),可选值HTTP。
hive.server2.thrift.http.port– HTTP的监听端口,默认值为10001。
hive.server2.thrift.http.path – 服务的端点名称,默认为 cliservice。
hive.server2.thrift.http.min.worker.threads– 服务池中的最小工作线程,默认为5。
hive.server2.thrift.http.max.worker.threads– 服务池中的最小工作线程,默认为500。
启动Hiveserver2有两种方式,一种是上面已经介绍过的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以提交查询的用户执行查询(true),如果hive.server2.enable.doAs设置为false,查询将以运行hiveserver2进程的用户运行。为了防止非加密模式下的内存泄露,可以通过设置下面的参数为true禁用文件系统的缓存:
[html] view plain copy
fs.hdfs.impl.disable.cache – 禁用HDFS文件系统缓存,默认值为false。
fs.file.impl.disable.cache – 禁用本地文件系统缓存,默认值为false。
-
4:配置使用hiveserver2(Hive 2.0为例)
sudo vim hive-site.xml 1):配置监听端口和路径 <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会以提交用户的身份去执行语句,如果设置为false,则会以起hive server daemon的admin user来执行语句 <property> <name>hive.server2.enable.doAs</name> <value>true</value> </property>
3):hiveserver2节点配置
Hiveserver2已经不再需要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会导致无法并发执行hive ql请求和导致数据异常
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内置服务文章出处:@http://blog.csdn.net/gamer_gyt