Hive的元数据默认使用derby作为存储DB,derby作为轻量级的DB,在开发、测试过程中使用比较方便,但是在实际的生产环境中,还需要考虑易用性、容灾、稳定性以及各种监控、运维工具等,这些都是derby缺乏的。
MySQL和PostgreSQL是两个比较常用的开源数据库系统,在生产环境中比较多的用来替换derby,并且强烈推荐这么做。
下面就来介绍如何配置Pg或MySQL来作为Hive元数据库。
PostgreSQL
安装postgresql
找一个合适的节点
- 安装
# yum install postgresql postgresql-contrib
# su - postgres
# initdb
- 启动:
postgres -D /var/lib/pgsql/data
or
pg_ctl -D /var/lib/pgsql/data -l logfile start
- 创建HIve库
psql
代码语言:javascript复制CREATE USER hive WITH PASSWORD 'hive';
create database hive;
grant all privileges ON DATABASE hive to hive;
设置Postgresql 数据库
修改pg_hba.conf文件
修改 /etc/postgresql/10/main/pg_hba.conf文件
代码语言:javascript复制# Database administrative login by Unix domain socket
#local all postgres peer
local all postgres trust
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
#local all all peer
local all all trust
# IPv4 local connections:
#host all all 127.0.0.1/32 md5
host all all 127.0.0.1/32 trust #允许本地登陆
host all all 192.168.158.0/24 trusr # 允许从 192.168.158. 网段的主机登陆;这里为了安全,可以只设置为Hive metastore主机ip即可。
# IPv6 local connections:
#host all all ::1/128 md5
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication all peer
#local replication all peer
#local replication all peer
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
下载PG的JDBC驱动
https://jdbc.postgresql.org/download.html
需要下载对应java版本的jdbc驱动:
放置于ambari-server 所在节点。
如何JDBC版本使用错误,metastore日志将会报如下错误:
代码语言:javascript复制2019-12-02T20:56:01,857 ERROR [main]: metastore.HiveMetaStore (HiveMetaStore.java:main(9316)) - Metastore Thrift Server threw an exception...
org.apache.hadoop.hive.metastore.api.MetaException: Error creating transactional connection factory
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:84) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:93) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:9129) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:9124) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:9394) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:9311) [hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_191]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_191]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191]
at org.apache.hadoop.util.RunJar.run(RunJar.java:318) [hadoop-common-3.1.1.3.0.1.0-187.jar:?]
at org.apache.hadoop.util.RunJar.main(RunJar.java:232) [hadoop-common-3.1.1.3.0.1.0-187.jar:?]
Caused by: org.apache.hadoop.hive.metastore.api.MetaException: Error creating transactional connection factory
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invokeInternal(RetryingHMSHandler.java:208) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:108) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:80) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
... 11 more
Caused by: javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:671) ~[datanucleus-api-jdo-4.2.4.jar:?]
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:830) ~[datanucleus-api-jdo-4.2.4.jar:?]
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:334) ~[datanucleus-api-jdo-4.2.4.jar:?]
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:213) ~[datanucleus-api-jdo-4.2.4.jar:?]
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191]
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1965) ~[hive-exec-3.1.0.3.0.1.0-187.jar:3.1.0.3.0.1.0-187]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_191]
.......
.......
Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.
at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:544)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:529)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:112)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:72)
at org.datanucleus.store.rdbms.connectionpool.HikariCPConnectionPoolFactory.createConnectionPool(HikariCPConnectionPoolFactory.java:176)
at org.datanucleus.store.rdbms.ConnectionFactoryImpl.generateDataSources(ConnectionFactoryImpl.java:213)
... 61 more
Caused by: org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.
at org.postgresql.Driver.notImplemented(Driver.java:753)
at org.postgresql.jdbc4.AbstractJdbc4Connection.isValid(AbstractJdbc4Connection.java:109)
at org.postgresql.jdbc4.Jdbc4Connection.isValid(Jdbc4Connection.java:21)
后面在stackoverflow上才找到答案:
https://stackoverflow.com/questions/25594279/method-org-postgresql-jdbc4-jdbc4connection-isvalidint-is-not-yet-implemented
在ambari服务那里点击添加新服务,点击添加Hive组件,ambari会提示如果需要使用postgresql数据库,需使用以下命令来加载驱动:
代码语言:javascript复制ambari-server setup --jdbc-db=postgres --jdbc-driver=/path/to/postgresql-9.0-801.jdbc4.jar
运行:
代码语言:javascript复制ambari-server setup --jdbc-db=postgres --jdbc-driver=/usr/local/jdk/jdk1.8.0_191/lib/postgresql-9.0-801.jdbc4.jar
运行之后会发现,该集群已经被复制到Hive metastore的安装目录下的lib目录下了。
测试连接
在ambari上填写postgresql的hive用户及库信息。点击测试连接,ok即可以下一步安装。
启动Hive
有看到说需要初始化数据库。
代码语言:javascript复制先运行schematool进行初始化:
schematool -dbType postgres -initSchema
然后执行$ hive 启动hive。
但是,发现该步骤不进行也可以。
MySQL
如果需要使用MySQL作为metastore后台数据,按照以下步骤进行配置。
安装
同样,选择一个合适的节点。
代码语言:javascript复制sudo yum -y install MariaDB-client MariaDB-server MariaDB-devel
systemctl start mariadb #启动mariadb
systemctl enable mariadb #设置开机自启动
mysqladmin -u root password '你的密码' #设置root账号密码
mysql -uroot -p #测试登录
如果在yum源内没有相应的rpm包,那就需要系在rpm或者tar包进行安装,这里不详细介绍了。
登陆之后,创建库、用户然后赋权。
代码语言:javascript复制> CREATE USER 'hive' IDENTIFIED BY '5tgb%TGB';
> CREATE DATABASE hive;
> GRANT ALL PRIVILEGES ON hive.* TO hive@’%’ IDENTIFIED BY ’hive’;
> GRANT ALL PRIVILEGES ON hive.* TO hive@’localhost’ IDENTIFIED BY ’hive’;
> flush privileges;
安装驱动
下载下面这个文件:
mysql-connector-java-5.1.43.jar
可以在网上找到,放于/usr/share/java 目录之下
并将该驱动复制到hive安装目录的lib目录下。
代码语言:javascript复制ln -s /usr/share/java/mysql-connector-java-5.1.45.jar /PATH/TO/HIVE/lib
安装Hive
在ambari上持续点击下一步,配置数据库。
然后运行:
代码语言:javascript复制ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar
点击 test connect 看是否可以连接成功。
如果可以。
点击下一步,进行hive的安装。
有看到说需要初始化数据库。
代码语言:javascript复制/PATH/TO/HIVE/bin/schematool -dbType mysql -initSchema
最后证实该步骤不进行也可以正常运行。
以上就是配置Hive元数据库的基本过程,如有疑问,可以给我留言。