在学习Hive的配置管理参数时,曾将参数分为四类:Hive管理参数、Hive元存储(Metastore)管理参数、与Hadoop交互的管理参数、用于传递运行时信息的参数,当时并没有对Metastore参数进行深入的学习,现在就开始学习这部分的内容。
Hive中表和分区的所有元数据都存储在Hive的元存储(Metastore)中。元数据使用JPOX(Java Persistent Objects)对象关系映射解决方案进行持久化,所以任何被JPOX支持的存储都可以被Hive使用。大多数商业关系型数据库和许多开源的数据存储都被支持,所以就可以被Hive使用存储元数据。Hive支持三种不同的元存储服务器,分别为:内嵌式元存储、本地元存储、远程元存储,每种存储方式使用不同的配置参数,相关的配置参数如下表所示:
配置参数 | 描述 |
javax.jdo.option.ConnectionURL | 包含元数据的数据存储的JDBC连接字符串。默认值为jdbc:derby:;databaseName=metastore_db;create=true。 |
javax.jdo.option.ConnectionDriverName | 包含元数据的数据存储的JDBC驱动类名称。默认值为org.apache.derby.jdbc.EmbeddedDriver。 |
hive.metastore.uris | Hive连接到该URI请求远程元存储的元数据。默认值为空。 |
hive.metastore.local | 本地或者远程数据存储 (Hive-0.10已经不再使用该参数: 如果hive.metastore.uris 为空值则为本地模式,否则为远程模式)。 |
hive.metastore.warehouse.dir | 本地表的默认位置,默认值为/user/hive/warehouse。 |
hive.metastore.metadb.dir | |
hive.metastore.rawstore.impl | 实现org.apache.hadoop.hive.metastore.rawstore接口的类,该类用于存储和检索行元数据对象,如表、数据库。 |
hive.metastore.ds.connection.url.hook | 提取JDO连接URL的钩子名称,若为空,则使用javax.jdo.option.ConnectionURL中的值。 |
hive.metastore.server.min.threads | Thrift服务器池中工作线程的最小数量,默认值为200。 |
hive.metastore.server.max.threads | Thrift 服务器池中工作线程的最大数量,默认值为10000。 |
hive.hmshandler.retry.attempts | 在JDO数据存储出现错误后尝试连接的次数默认值为1。 |
hive.hmshandler.retry.interval | 尝试间隔的毫秒数,默认值为1000。 |
前面提到Hive支持三种元存储方式,默认方式为内嵌式元存储。下面分别对三种存储方式如何配置进行学习。
内嵌式元存储
内嵌式元存储主要用于单元测试,在该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库。内嵌式元存储的配置如下:
配置参数 | 值 | 描述 |
javax.jdo.option.ConnectionURL | jdbc:derby:;databaseName=metastore_db;create=true | 包含元数据的数据存储的JDBC连接字符串。 |
javax.jdo.option.ConnectionDriverName | org.apache.derby.jdbc.EmbeddedDriver | JDBC驱动类。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | 本地表的默认位置。 |
hive.metastore.uris | 空值 | 内嵌式也是本地模式,所以为空值。 |
本地元存储
在本地模式下,每个Hive客户端都会打开到数据存储的连接并在该连接上请求SQL查询。下表展示了如何在MySQL数据库服务器中建立元存储,确保在Hive查询被执行的机器上是可以访问该数据库服务器的,同时确保JDBC类库在Hive客户端的类路径中。
配置参数 | 值 | 描述 |
javax.jdo.option.ConnectionURL | jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true | 元数据存储在MySQL数据库中。 |
javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver | MySQL JDBC驱动类。 |
javax.jdo.option.ConnectionUserName | <user name> | 连接MySQL的用户名。 |
javax.jdo.option.ConnectionPassword | <password> | 连接MySQL的密码。 |
hive.metastore.uris | 空值 | 本地模式下为空值。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | Hive表的默认位置。 |
远程元存储
在远程模式下,所有的Hive客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据。元数据服务器和客户端之间使用Thrift协议通信,从Hive-0.5.0开始,可以执行下面的命令启动Thrift服务器:
hive--service metastore
下面以MySQL为例,分别学习服务器端和客户端的配置,服务器端的配置如下表所示:
配置参数 | 值 | 描述 |
javax.jdo.option.ConnectionURL | jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true | 元数据存储在MySQL数据库中。 |
javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver | MySQL JDBC驱动类。 |
javax.jdo.option.ConnectionUserName | <user name> | 连接MySQL的用户名。 |
javax.jdo.option.ConnectionPassword | <password> | 连接MySQL的密码。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | Hive表的默认位置。 |
客户端的配置为:
配置参数 | 值 | 描述 |
hive.metastore.uris | thrift://<host_name>:<port> | Thrift元存储服务器的主机和端口号。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | Hive表的默认位置。 |
在启动客户端和元存储服务器之前需要将JDBC驱动类库放到$HIVE_HOME/lib目录下。
Hive中metastore(元数据存储)的三种方式:
[一]、内嵌Derby方式
这个是Hive默认的启动模式,一般用于单元测试,这种存储方式有一个缺点:在同一时间只能有一个进程连接使用数据库。
hive-site.xml 中jdbc URL、驱动、用户名、密码等的配置信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<property>
<name>
javax.jdo.option.ConnectionURL
</name>
<value>
jdbc:derby:;databaseName=metastore_db;create=true
</value>
<description>
JDBC connect string for a JDBC metastore
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionDriverName
</name>
<value>
org.apache.derby.jdbc.EmbeddedDriver
</value>
<description>
Driver class name for a JDBC metastore
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionUserName
</name>
<value>
APP
</value>
<description>
username to use against metastore database
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionPassword
</name>
<value>
mine
</value>
<description>
password to use against metastore database
</description>
</property>
<property>
<name>
hive.metastore.warehouse.dir
</name>
<value>
file:///Users/micmiu/tmp/hive/warehouse
</value>
<description>
unit test data goes in here on your local filesystem
</description>
</property>
<!-- micmiu.com -->
|
执行初始化命令:schematool -dbType derby -initSchema
查看初始化后的信息: schematool -dbType derby -info
配置完成后就可在shell中以CLI的方式访问hive 进行操作验证。
[二]、Local方式
以本地Mysql数据库为例:创建好用户:hive;database:hive。
配置文件 hive-site.xml 中jdbc URL、驱动、用户名、密码等属性值配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<property>
<name>
javax.jdo.option.ConnectionURL
</name>
<value>
jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true
</value>
<description>
JDBC connect string for a JDBC metastore
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionDriverName
</name>
<value>
com.mysql.jdbc.Driver
</value>
<description>
Driver class name for a JDBC metastore
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionUserName
</name>
<value>
hive
</value>
<description>
username to use against metastore database
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionPassword
</name>
<value>
micmiu
</value>
<description>
password to use against metastore database
</description>
</property>
<property>
<name>
hive.metastore.warehouse.dir
</name>
<!-- base hdfs path -->
<value>
/user/hive/warehouse
</value>
<description>
location of default database for the warehouse
</description>
</property>
<!-- micmiu.com -->
|
ps:需要把mysql的驱动包copy到目录 <HIVE_HOME>/lib 中
如果是第一次需要执行初始化命令:schematool -dbType mysql -initSchema
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
micmiu
-
mbp
:
mysql
micmiu
$
schematool
-
dbType
mysql
-
initSchema
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
input
.
dir
.
recursive
is
deprecated
.
Instead
,
use
mapreduce
.
input
.
fileinputformat
.
input
.
dir
.
recursive
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
max
.
split
.
size
is
deprecated
.
Instead
,
use
mapreduce
.
input
.
fileinputformat
.
split
.
maxsize
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
min
.
split
.
size
is
deprecated
.
Instead
,
use
mapreduce
.
input
.
fileinputformat
.
split
.
minsize
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
min
.
split
.
size
.
per
.
rack
is
deprecated
.
Instead
,
use
mapreduce
.
input
.
fileinputformat
.
split
.
minsize
.
per
.
rack
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
min
.
split
.
size
.
per
.
node
is
deprecated
.
Instead
,
use
mapreduce
.
input
.
fileinputformat
.
split
.
minsize
.
per
.
node
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
reduce
.
tasks
is
deprecated
.
Instead
,
use
mapreduce
.
job
.
reduces
14
/
02
/
17
14
:
46
:
08
INFO
Configuration
.
deprecation
:
mapred
.
reduce
.
tasks
.
speculative
.
execution
is
deprecated
.
Instead
,
use
mapreduce
.
reduce
.
speculative
Metastore
connection
URL
:
jdbc
:
mysql
:
//localhost/hive?createDatabaseIfNotExist=true
Metastore
Connection
Driver
:
com
.
mysql
.
jdbc
.
Driver
Metastore
connection
User
:
hive
Starting
metastore
schema
initialization
to
0.12.0
Initialization
script
hive
-
schema
-
0.12.0.mysql.sql
Initialization
script
completed
schemaTool
completeted
|
查看初始化后信息 schematool -dbType mysql -info
初始化后查看mysql中表情况:show tables;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
mysql
&
gt
;
show
tables
;
+
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
|
Tables_in_hive
|
+
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
|
BUCKETING_COLS
|
|
CDS
|
|
COLUMNS_V2
|
|
DATABASE_PARAMS
|
|
DBS
|
|
DB_PRIVS
|
|
DELEGATION_TOKENS
|
|
GLOBAL_PRIVS
|
|
IDXS
|
|
INDEX_PARAMS
|
|
MASTER_KEYS
|
|
NUCLEUS_TABLES
|
|
PARTITIONS
|
|
PARTITION_EVENTS
|
|
PARTITION_KEYS
|
|
PARTITION_KEY_VALS
|
|
PARTITION_PARAMS
|
|
PART_COL_PRIVS
|
|
PART_COL_STATS
|
|
PART_PRIVS
|
|
ROLES
|
|
ROLE_MAP
|
|
SDS
|
|
SD_PARAMS
|
|
SEQUENCE_TABLE
|
|
SERDES
|
|
SERDE_PARAMS
|
|
SKEWED_COL_NAMES
|
|
SKEWED_COL_VALUE_LOC_MAP
|
|
SKEWED_STRING_LIST
|
|
SKEWED_STRING_LIST_VALUES
|
|
SKEWED_VALUES
|
|
SORT_COLS
|
|
TABLE_PARAMS
|
|
TAB_COL_STATS
|
|
TBLS
|
|
TBL_COL_PRIVS
|
|
TBL_PRIVS
|
|
TYPES
|
|
TYPE_FIELDS
|
|
VERSION
|
+
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
41
rows
in
set
(
0.00
sec
)
|
配置完成后就可在shell中以CLI的方式访问hive 进行操作验证。
[三]、Remote方式
以Mysql数据库(192.168.6.77)为例:创建好用户:hive;database:hive_meta。Remote方式需要分别配置服务端和客户端的配置文件:
服务端的 hive-site.xml 中jdbc URL、驱动、用户名、密码等属性值配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<property>
<name>
javax.jdo.option.ConnectionURL
</name>
<value>
jdbc:mysql://192.168.6.77/hive_meta?createDatabaseIfNotExist=true
</value>
<description>
JDBC connect string for a JDBC metastore
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionDriverName
</name>
<value>
com.mysql.jdbc.Driver
</value>
<description>
Driver class name for a JDBC metastore
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionUserName
</name>
<value>
hive
</value>
<description>
username to use against metastore database
</description>
</property>
<property>
<name>
javax.jdo.option.ConnectionPassword
</name>
<value>
micmiu
</value>
<description>
password to use against metastore database
</description>
</property>
<property>
<name>
hive.metastore.warehouse.dir
</name>
<!-- base hdfs path -->
<value>
/user/hive/warehouse
</value>
<description>
base hdfs path :location of default database for the warehouse
</description>
</property>
<!-- micmiu.com -->
|
ps:需要把mysql的驱动包copy到目录 <HIVE_HOME>/lib 中
如果是第一次需要执行初始化命令:schematool -dbType mysql -initSchema
客户端中配置内容修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- thrift://<host_name>:<port> 默认端口是9083 -->
<property>
<name>
hive.metastore.uris
</name>
<value>
thrift://192.168.6.77:9083
</value>
<description>
Thrift uri for the remote metastore. Used by metastore client to connect to remote metastore.
</description>
</property>
<!-- hive表的默认存储路径 -->
<property>
<name>
hive.metastore.warehouse.dir
</name>
<value>
/user/hive/warehouse
</value>
<description>
location of default database for the warehouse
</description>
</property>
|
hive metastore 服务端启动命令:
hive --service metastore -p <port_num>
如果不加端口默认启动:hive --service metastore
,则默认监听端口是:9083 ,注意客户端中的端口配置需要和启动监听的端口一致。服务端启动正常后,客户端就可以执行hive操作了。
HIVE配置mysql metastore
hive中除了保存真正的数据以外还要额外保存用来描述库、表、数据的数据,称为hive的元数据。这些元数据又存放在何处呢?
如果不修改配置hive默认使用内置的derby数据库存储元数据。
derby是apache开发的基于java的文件型数据库。
可以检查之前执行命令的目录,会发现其中产生了一个metastore.db的文件,这就是derby产生的用来保存元数据的数据库文件。
derby数据库仅仅用来进行测试,真正使用时会有很多限制。
最明显的问题是不能支持并发。
经测试可以发现,在同一目录下使用无法同时开启hive,不同目录下可以同时开启hive但是会各自产生metastore.db文件造成数据无法共同访问。
所以真正生产环境中我们是不会使用默认的derby数据库保存hive的元数据的。
hive目前支持derby和mysql来存储元数据。
配置hive使用mysql保存元数据信息:
删除hdfs中的/user/hive
hadoop fs -rmr /user/hive
复制hive/conf/hive-default.xml.template为hive-site.xml
cp hive-default.xml.template hive-site.xml
在<configuration>中进行配置
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
!!手动创建hive元数据库,注意此库必须是latin1,否则会出现奇怪问题!所以推荐手动创建!并且创建库之前不能有任意的hive操作,否则自动创建出来的库表将使用mysql默认的字符集,仍然报错!
!!另一种方法是修改mysql的配置文件,让mysql默认编码集就是latin1,这样hive自动创建的元数据库就是latin1的了,但是这已修改将会影响整个mysql数据库,如果mysql中有其他库,这种方式并不好。
create database hive character set latin1;
将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下
如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)
mysql -uroot -p
#(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
再进入hive命令行,试着创建库表发现没有问题。
测试发现开启多个连接没有问题。
连接mysql,发现多了一个hive库。其中保存有hive的元数据。DBS-数据库的元数据信息,TBLS-表信息。COLUMNS_V2表中字段信息,SDS-表对应hdfs目录