Apache Hive 安装配置
Apache Hive™ 数据仓库软件,有助于查询和管理驻留在分布式存储系统中的大型数据集。 Hive 构建于 Apache Hadoop™ 之上。它提供了一种类似于 SQL 的查询语言 HQL(Hive SQL)来查询数据的方法。
Hive 安装
基于 CentOS 7 系统安装配置环境。
下载:
wget https://dlcdn.apache.org/hive/hive-4.0.0/apache-hive-4.0.0-bin.tar.gz
解压:
tar -zxf apache-hive-4.0.0-bin.tar.gz -C /opt
Hive 配置
配置环境变量
编辑 /etc/profile
或用户根目录 .bashrc
文件以更新环境变量:
export HIVE_HOME=/opt/apache-hive-4.0.0-bin
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/lib
另外,确保[[HDFS 集群部署#^bc49c1|设置 Hadoop 环境变量]]
在 HDFS 中创建 Hive 目录
在 hadoop 分布式文件系统中,创建目录,用于存放文件。
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
设置表的的读写权限:
hdfs dfs -chmod -R g+w /user
设置 Hadoop 路径
进入 Hive 根目录:
cp conf/hive-env.sh.template conf/hive-env.sh
cp conf/hive-default.xml.template conf/hive-site.xml
在 conf/hive-env.sh
中设置 Hadoop 路径:
export HADOOP_HOME=/opt/hadoop-3.3.6
export HADOOP_HEAPSIZE=1024
export HIVE_CONF_DIR=/opt/apache-hive-4.0.0-bin/conf
配置数据库 JDBC 连接器
下载 JDBC:
下载地址 mysql-connector-j-8.3.0-1.el7.noarch.rpm
: MySQL 数据库的 JDBC 连接器
解压出 jar 包:
解压出 MySQL 的 JDBC 驱动连接器 rpm 文件中的 jar 内容:
rpm2cpio package.rpm | cpio -idmv
说明:解压出 jar 包有:MySQL Connector/J.jar
和 mysql-connector-java.jar
若使用 MariaDB 数据库,下载地址 mariadb-java-client-3.3.3.jar
: MariaDB 数据库的 JDBC 连接器
复制 jar 包:
将下载的 jdbc jar 包复制到 hive 安装目录下的 lib 中。
编辑 conf/hive-site.xml
<configuration>
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>
<!-- Hive 元数据存储配置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 使用 MySQL 作为 JDO 持久化框架连接数据库 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
</property>
<!--指定 JDBC 连接驱动程序的类名 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!--JDO持久化框架连接数据库时所需的用户名和密码 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mine</value>
</property>
</configuration>
说明:
javax.jdo.option.ConnectionURL
字段配置:jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false
指定 JDO 持久化框架连接数据库的 URL。这里的数据库用于存储 Hive 表、分区、列、数据库等元数据信息,而不直接存储用户的业务数据。mysql://localhost:3306/hivedb?
表明连接的是本地 MySQL 数据库,端口 3306,数据库名 hivedb。createDatabaseIfNotExist=true
如果数据库不存在则创建。&
是 XML 中的实体引用,表示&
符号。因为在 XML 中,&
有特殊含义,表示一个实体引用的开始。若表示实际的&
,使用&
用作分隔符。characterEncoding=UTF-8
表示使用 UTF-8 字符编码。useSSL=false
表示不使用 SSL 连接。
- 若指定的 MariaDB 数据库作为 Hive 的元数据存储,更新以下字段配置:
<!-- 使用 MariaDB 数据库作为 JDO 持久化框架连接数据库 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mariadb://localhost:3306/hivedb?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.mariadb.jdbc.Driver</value>
</property>
配置项 javax.jdo.option.ConnectionUserName
若配置的不是已知用户,需要在数据库系统中先创建并赋予权限,后续才能初始化 Hive 环境。
如 JDO 持久化框架连接数据库 hivedb
使用的用户名和密码分别是 hive
和 mine
,创建用户并赋予权限:
create user 'hive'@'%' identified by 'mine';
grant all privileges on `hivedb`.* to 'hive'@'%';
flush privileges;
初始化 Hive
schematool -initSchema -dbType mysql
返回结果:
...
beeline> Initialization script completed
schemaTool completed
Beeline 是 Apache Hive 提供的一个用于连接 HiveServer2 服务的命令行工具,可以用于执行 Hive 查询和管理 Hive 数据库。当你使用Beeline 连接到 HiveServer2 后,你可以执行 SQL 语句、查看数据库信息等。
HiveServer2 是 Apache Hive 的一个远程服务,它提供了一个多用户、多连接的 SQL 接口,用于与 Hive 查询引擎进行交互。通过 HiveServer2,用户可以使用 JDBC、ODBC、Thrift 等标准接口连接到 Hive 并执行 SQL 查询。见 HiveServer2 概述。
Metastore 通过 DataNucleus(基于 Java JDO 的对象关系映射 (ORM) 层)将对象定义保存到关系数据库 (RDBMS)。Metastore 可以配置为嵌入 Apache Derby RDBMS 或连接到外部 RDBMS。 Metastore 本身可以完全嵌入到用户进程中,也可以作为服务运行以供其他进程连接。请参阅支持的 RDBMS,了解可以使用的支持的 RDBMS 列表。
启动 Hive
启动 HiveServer2 和 Metastore 服务
hive --service hiveserver2 &
hive --service metastore
验证 HiveServer2 和 Metastore 服务启动状态
查看服务是否在指定端口上监听:
# netstat -tuln | grep 10000
tcp6 0 0 :::10000 :::* LISTEN
# netstat -tuln | grep 9083
tcp6 0 0 :::9083 :::* LISTEN
检查服务进程:
# ps -ef | grep HiveServer2
root 11862 2393 0 17:01 pts/0 00:00:00 grep --color=auto HiveServer2
# ps aux | grep hive-metastore
说明:这个返回结果表明没有 HiveServer2 服务进程,只有 grep 命令本身这个查询进程。
若停止 Hive 服务,例如 HiveServer2 和 Hive Metastore,杀死进程。
进入 beeline
命令行,执行命令 hive
:
# hive
...
Beeline version 4.0.0 by Apache Hive
beeline>
或
# beeline
注意:确保事先[[HDFS 集群部署#启动节点|启动 Hadoop 集群节点]]
连接 HiveServer2 服务器
beeline 环境下执行:
!connect jdbc:hive2://localhost:10000
说明:输入命令默认回车即可。
hive2
是指HiveServer2
。- 若已知现有数据库,可直接连接进入对应数据库:
!connect jdbc:hive2://localhost:10000/default
。
**或直接 beeline 命令连接 HiveServer2
bash shell 下直接执行:
beeline -u jdbc:hive2://localhost:10000
注意:用户数据通常存储在 HDFS 中,Hive 查询这些数据时,元数据信息由元数据数据库提供支持。Hive 客户端通过 Hive 服务(如 HiveServer2)与元数据数据库交互,以支持 Hive 查询和数据处理。
退出 Hive
exit;
参考
问题
问题1. hive 配置环境初始化失败:
# schematool -initSchema -dbType mysql
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apache-hive-4.0.0-bin/lib/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-3.3.6/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Initializing the schema to: 4.0.0
Metastore connection URL: jdbc:mariadb://localhost:3306/hivedb?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false
Metastore connection Driver : org.mariadb.jdbc.Driver
Metastore connection User: hivedb
Failed to get schema version.
Underlying cause: java.sql.SQLInvalidAuthorizationSpecException : (conn=7) Access denied for user 'hivedb'@'localhost' (using password: YES)
SQL Error code: 1045
Use --verbose for detailed stacktrace.
*** schemaTool failed ***
分析解决:检查报错的数据库用户密码是否已存在,且与 hive-site.xml
配置的一致。
问题2. 运行 hive
命令报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/htrace/core/Tracer$Builder
解决:可能 apache-hive-3.1.3-bin 中 htrace-core-3.2.0-incubating.jar 包不兼容,替换安装 apache-hive-4.0.0-bin 版本解决了。
问题3. 启动 HiveServer2 服务报错:
Caused by: java.lang.ClassNotFoundException: org.apache.hive.org.apache.commons.cli.ParseException
解决:可能存在冲突依赖。本想使用 hive 自带的 jdbc 依赖包,从 jdbc 目录复制到 lib 目录,但初始化失败。使用自己下载的 MySQL jdbc 依赖包时,需要把默认的 jdbc 依赖包从 lib 目录中删除。
问题4. 启动 HiveServer2 服务后有进程但未绑定 TCP 端口10000;检查日志 /tmp/root/hive.log
:
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
解决:将以下内容添加到 hive-site.xml
的 <configuration></configuration>
标签内:
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>