Hive安装:Metastore配置和常见错误处理

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 is com.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

猜你喜欢

转载自blog.csdn.net/O_1CxH/article/details/110291891