Hive metastore服务以关系性数据库的方式存储Hive tables和partitions的metadata,并且提供给客户端访问这些数据的metastore service的API。下面介绍一下Metastore部署的三种模式
这里讨论的HiveServer 指的是HiveServer1 或者 HiveServer2。
嵌入式模式
嵌入式模式比较适合实验性质的练习
这是默认的metastore部署模式。这种模式下metastore存放在Derby数据库,database和metastore服务都嵌入在同一个HiveServer进程中运行。当你启动HiveServe的时候,database和metastore服务会同时启动。这种模式只需要少量简单的参数配置。但是这种模式只能同时支持一个用户的使用。
本地模式
本地模式下,Hive metastore服务还是在同一个HiveServer进程中运行,但是metastore数据库则在不同的进程上运行,并且可以在不同的主机。嵌入的mvtastore服务通过使用JDBC与metastore数据库进行交互。
远程模式
推荐使用这种模式
这中模式下的Hive metastore服务在单独的JVM进程中运行;HiveServer2,HCatalog等其它进程通过Thrift网络API(对hive.metastore.uris属性进行配置)与之交互。
metastore服务与metastore数据的交互使用JDBC(对javax.jdo.option.ConnectionURL属性配置)。数据库、HiveServer进程、metastore服务可以运行在同一主机,但是在不同的主机上运行提供更好的可用和可拓展性。
远程模式相比于本地模式最主要的优点是远程模式不需要管理员为每个Hive用户共享JDBC登录到metastore数据的信息 HCatalog requires this mode.
支持Metastore的数据库
访问 CDH4 Requirements and Supported Versions page 可以获得最新的支持数据库.推荐使用MySQL因为它在Hive用户社区是最被广泛使用的数据库,并且经受了比其它选择更多的检验测试。
配置Metastore数据库
这里以MySQL和PostgreSQL为例介绍一下要使用远程数据库,需要如何配置Hive。为Hive metastore配置属性的文档 Hive Metastore documentation 。
对于配置一个安全的集群,要获得其它的配置方法,可以访问Hive Security Configuration。
为Hive metastore配置远程MySQL数据库
推荐在1个或多个远程服务器上配置数据库,MySQL是目前最广泛使用的数据库。配置方法如下所属:
在RedHat系统下安装MySQL
$ sudo yum install mysql-server在Debian/Ubuntu下安装MySQL
$ sudo apt-get install mysql-server
安装完成后,需要启动mysqldaemon
Red Hat 系统
$ sudo service mysqld start
在 Debian/Ubuntu 系统
$ sudo service mysql start
在能够运行一个使用远程MySQL数据库的Hive metastore之前,我们需要
(1)为远程MySQL数据库配置一个connector。
(2)建立初始的数据库模式。
(3)为Hive用户配置MySQL账户。
在Red Hat6下安装MySQL connector
安装 mysql-connector-java 并且 进行symbolically link 到/usr/lib/hive/lib/directory.
$ sudo yum install mysql-connector-java $ ln -s /usr/share/java/mysql-connector-java.jar /usr/lib/hive/lib/mysql-connector-java.jar
To install the MySQL connector on a Red Hat 5 system:
下载 MySQL JDBC connector http://www.mysql.com/downloads/connector/j/5.1.html 解压后拷贝到hive的lib文件夹下面。例如
$ curl -L 'http://www.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.22.tar.gz/from/http://mysql.he.net/' | tar xz $ sudo cp mysql-connector-java-5.1.22/mysql-connector-java-5.1.22-bin.jar /usr/lib/hive/lib/
SLES system:
安装 mysql-connector-java 并且 进行symbolically link 到/usr/lib/hive/lib/directory.
$ sudo zypper install mysql-connector-java $ ln -s /usr/share/java/mysql-connector-java.jar /home/hadoop/hive-2.1.0-bin/lib/mysql-connector-java.jar(hive安装的路径)
Debian/Ubuntu system:
安装 mysql-connector-java 并且 进行symbolically link 到/usr/lib/hive/lib/directory.
$ sudo apt-get install libmysql-java $ ln -s /usr/share/java/libmysql-java.jar home/hadoop/hive-2.1.0-bin/lib/libmysql-java.jar(hive安装的路径)
//上面的方法不好,还是跟前面redhat等一样下载解压mysql-connector-java.jar,然后把这个拷贝到hive的lib文件夹下面
tar -zxvf mysql-connector-java-5.1.40.tar.gz
sudo cp mysql-connector-java-5.1.40-bin.jar /home/hadoop/hive-2.1.0-bin/lib/mysql-connector-java-5.1.40-bin.jar
配置MySQL需要强密码并且从boot启动。注意下面的过程,当前的root密码是空白,只需要每次回车来继续即可
设置MySQL root 密码:
$ sudo /usr/bin/mysql_secure_installation [...] Enter current password for root (enter for none): OK, successfully used password, moving on... [...] Set root password? [Y/n] y New password: Re-enter new password: Remove anonymous users? [Y/n] Y [...] Disallow root login remotely? [Y/n] N [...] Remove test database and access to it [Y/n] Y [...] Reload privilege tables now? [Y/n] Y All done!
保证MySQL 服务从boot启动:
- Red Hat systems:
$ sudo /sbin/chkconfig mysqld on $ sudo /sbin/chkconfig --list mysqld mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- SLES systems:
$ sudo chkconfig --add mysql
- Debian/Ubuntu systems:(Ubuntu使用sysv-rc-conf代替 sudo apt-get install sysv-rc-conf)
$ sudo sysv-rc-conf mysql on
$ sudo sysv-rc-conf --list(实现和chkconfig一样的方法
默认要使用远程模式,并且MySQL是安装在一个单独的主机上与metastore服务是分离的
如果metastore服务是运行在安装数据库的主机上,在CREATE USER 这一步把'metastorehost'用'localhost‘替换。Similarly, the value ofjavax.jdo.option.ConnectionURLin/etc/hive/conf/hive-site.xml(discussed in the next step) must bejdbc:mysql://localhost/metastore. For more information on adding MySQL users, see http://dev.mysql.com/doc/refman/5.5/en/adding-users.html.
!!只用hive的脚本初始化数据库模式,在/home/hadoop/hive-2.1.0-bin/scripts/metastore/upgrade/mysql (你自己安装hive的路径)路径下面,选择与安装的hive版本一致的脚本
例如
$ mysql -u root -p Enter password: mysql> CREATE DATABASE metastore; mysql> USE metastore; mysql> SOURCE /home/hadoop/hive-2.1.0-bin/scripts/metastore/upgrade/mysql/hive-schema-2.1.0.mysql.sql;
我们还需要为hive建立一个MySQL用户帐号来作访问metastore。要避免这个账户创建或改变存在metastore数据库模式里的表。
如果没有限制metastore的MySQL用户帐号创建或改变表,那么很有可能当使用新版本的hive的时候,用户帐号会毁掉已经创建的metastore模式!!!
mysql> CREATE USER 'hadoop'@'localhost' IDENTIFIED BY 'mypassword'; ... mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hadoop'@'localhost'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES,EXECUTE ON metastore.* TO 'hadoop'@'localhost'; mysql> FLUSH PRIVILEGES; mysql> quit;
步骤 4: 配置metastore复位以便与MySQL数据库交互
这一步将引导你如何配置hive-site.xml里面的配置属性,只有在这里配置了相关属性,才能让metastore服务与MySQL数据库交互 。尽管可以在所有的主机(客户端、metastore、HiveServe)上使用同一份hive-site.xml,但是hive.metastore.usis 是唯一需要为每个主机进行配置的属性;其余的属性只有在metastore主机上才有用。
Given a MySQL database running onmyhostand the user accounthivewith the passwordmypassword, set the configuration as follows (overwriting any existing values).
hive.metastore.local 属性在Hive0.10后就不支持了。设置hive.metastore.uris 已经足以表明你正在使用远程模式。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
<description>the URL of the MySQL database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hadoop</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Wq_01983124</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://namenode:9000/user/hive/warehouse</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property>
<!--
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/home/hadoop/hive-2.1.0/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:/home/hadoop/hive-2.1.0/metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property> <name>hive.metastore.uris</name> <value>thrift://<n.n.n.n>:9083</value> <description>IP address (or fully-qualified domain name) and port of the metastore host</description> </property>
-->
</configuration>
注意:1)hadoop要启动,hive才能使用。2)还要配置HIVE_HOME sudo ~/.bashrc 在空白的地方添加
export HIVE_HOME=/home/hadoop/hive-2.1.0-bin
export PATH=$PATH:$HIVE_HOME/bin
保存退出。
执行 source ~/.bashrc
前面配置完后,执行hive --service metastore;启动metastore;
测试:
新开一个终端
1)导入数据
hive -e 'CREATE TABLE test(v0 STRING,v1 INT)'
hive -e "LOAD DATA LOCAL INPATH '/tmp/test1' \
OVERWRITE INTO TABLE test";
2)查看结果
2.1)hive -e "show tables";可以看到新建的表
hive -e "select * from test";可以查看表中的数据
2.2)登录mysql
mysql -u hadoop -p
输入密码登录
mysql>use metastore;前面建立的metastore
mysql>select * from TBLS;显示已经在hive建立的那些表及结构等