Hive安装:Metastore配置和常见错误处理
文章目录
1 方法简介
Hive的本身结构决定了其需要把一部分数据存储在关系数据库上,这一部分就是元数据metadata,而这种机制叫做metastore。Hive可以选择使用内置的derby或者外置的JDBC数据库来做metastore。
本文主要介绍的是使用mysql数据库作为hive的metastore载体。主要步骤为(1)安装Hive(2)安装mysql(3)在mysql中配置相应用户(4)配置JDBC支持(5)在Hive中配置metastore属性。
2 步骤
环境:Mac OS,已经安装了Hadoop(版本2.10.1)。
2.1 安装Hive
下载Hive软件包 http://www.apache.org/dyn/closer.cgi/hive/
解压,然后加入环境变量,例如:
export HIVE_HOME=$PWD/apache-hive-2.3.7-bin
export PATH=$PATH:$HIVE_HOME/bin
2.2 安装mysql
直接使用brew安装,本人在官网上下载的安装包安装后一直提示密码错误,但用brew安装的可以直接使用。(安装的是8.0.22)
brew install mysql
注:这样安装的mysql可以通过如下方式启动
brew services start mysql
2.3 在mysql中配置相应用户
为Hive的metastore创建一个用户,让其可以存取表。
创建用户(用户名为HIVEUSERNAME,密码为HIVEPASSWORD):
CREATE USER 'HIVEUSERNAME'@'%' IDENTIFIED BY 'HIVEPASSWORD';
为其授予权限(实际上其中的*.*
可能造成权限滥用,可以将其限制为metastore的数据库HIVEMETADB.*):
GRANT ALL PRIVILEGES ON *.* TO 'HIVEUSERNAME'@'%' WITH GRANT OPTION;
刷新权限表:
FLUSH PRIVILEGES;
2.4 配置JDBC支持
Hive的metastore可以通过JDBC的接口访问数据库(因为Hadoop基于Java,所以依赖包都是Java的),需要下载对应的支持,例如mysql的Java语言Connector可以直接在其官网上下载:https://dev.mysql.com/downloads/connector/j/
然后将tar包解压,解压出的jar放到Hive的lib文件夹下。然后,在Hive的配置文件hive-site.xml中修改:
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
注:关于javax.jdo.option.ConnectionDriverName属性,有的教程说设置为com.mysql.jdbc.Driver,如果这样做的话运行时有提示如下
Loading class
com.mysql.jdbc.Driver
. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver
. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
,即com.mysql.jdbc.Driver已经被com.mysql.cj.jdbc.Driver取代,已过时但仍可用。
2.5 在Hive中配置metastore
最后一步就是将HIve通过2.3中配置的用户登录到mysql数据库上,配置文件hive-site.xml中配置如下属性:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://MYSQLHOST:PORT/HIVEMETADB?createDatabaseIfNotExist=true</value>
</property>
注意,其中jdbc:mysql://MYSQLHOST:PORT/HIVEMETADB
指定连接器(JDBC)、数据库服务(mysql)、IP和端口(MYSQLHOST:PORT)、metastore所用数据库(HIVEMETADB);createDatabaseIfNotExist=true
指定如果不存在HIVEMETADB则创建,否则直接访问。
以及用户名和密码(就是在2.3中配置的HIVEUSERNAME和HIVEPASSWORD):
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>HIVEUSERNAME</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>HIVEPASSWORD</value>
</property>
还有一个步骤就是使用Apache的工具schematool初始化metastore。
schematool -dbType mysql -initSchema
注:dbType参数后即为数据库服务类型,如果使用derby就使用-dbType derby
3 常见问题举例
3.1 无法创建SessionHiveMetaStoreClient实例
报错原文:
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
解决:
没有配置好Hive的metastore支持,需要(1)到mysql(服务已经启动,地址在mysql://MYSQLHOST:PORT处)中设置好分给hive的数据库用户(8.0版本后的mysql按照如下语句):
CREATE USER 'HIVEUSERNAME'@'%' IDENTIFIED BY 'HIVEPASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'HIVEUSERNAME'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
(2)到hive-site.xml文件里重新配置如下属性:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://MYSQLHOST:PORT/HIVEMETADB?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>HIVEUSERNAME</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>HIVEPASSWORD</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
(3)初始化schema:
schematool -dbType mysql -initSchema
另外还可以尝试更改如下配置:
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
3.2 创建事务连接错误
报错原文:
MetaException(message:Error creating transactional connection factory)
解决:
没有添加对于mysql的支持包,需要到MySQL的官网上下载相应版本的Connector/J(即Java mysql connector),例如在https://dev.mysql.com/downloads/connector/j/ 上有最新版本mysql对应的连接器。将tar.gz下载后解压,解压出来的jar包放到HIVE_HOME/lib文件夹下。
3.3 绝对路径中包含相对路径
报错原文:
FAILED: IllegalArgumentException java.net.URISyntaxException: Relative path in absolute URI:
解决:替换掉hive-site.xml中所有的${system:java.io.tmpdir}
,改为确定的绝对路径,例如/tmp/hivetmp
。
3.4 无法创建目录
报错原文:
Exception in thread “main” java.lang.RuntimeException: Couldn’t create directory
解决:含有无法访问(一般是权限不够)的路径,例如某些教程将上述的${system:java.io.tmpdir}
改成/hive/tmp
,这样做直接将文件夹存到根目录下是会报这个错误的;应当存到明确可以访问的位置。
3.5 仓库目录无法创建
报错原文:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException (message:file:/user/hive/warehouse/example is not a directory or unable to create one)
解决:配置仓库位置
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/WAREHOUSE/PATH</value>
</property>
4 参考
https://www.cnblogs.com/rmxd/p/11318609.html
https://www.cnblogs.com/taojietaoge/p/11029529.html
https://blog.csdn.net/Architect_CSDN/article/details/102489312
https://docs.cloudera.com/runtime/7.2.2/hive-metastore/topics/hive-configure-hms-database-properties.html
https://blog.csdn.net/wuliusir/article/details/49156943