文章

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.rpmMySQL 数据库的 JDBC 连接器

解压出 jar 包:

解压出 MySQL 的 JDBC 驱动连接器 rpm 文件中的 jar 内容:

rpm2cpio package.rpm | cpio -idmv

说明:解压出 jar 包有:MySQL Connector/J.jarmysql-connector-java.jar

若使用 MariaDB 数据库,下载地址 mariadb-java-client-3.3.3.jarMariaDB 数据库的 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&amp;characterEncoding=UTF-8&amp;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&amp;characterEncoding=UTF-8&amp;useSSL=false 指定 JDO 持久化框架连接数据库的 URL。这里的数据库用于存储 Hive 表、分区、列、数据库等元数据信息,而不直接存储用户的业务数据。
      • mysql://localhost:3306/hivedb? 表明连接的是本地 MySQL 数据库,端口 3306,数据库名 hivedb。
      • createDatabaseIfNotExist=true 如果数据库不存在则创建。
      • &amp 是 XML 中的实体引用,表示 & 符号。因为在 XML 中,& 有特殊含义,表示一个实体引用的开始。若表示实际的 &,使用 &amp 用作分隔符。
      • 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&amp;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 使用的用户名和密码分别是 hivemine,创建用户并赋予权限:

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;

参考

Hive安装使用

Hive安装配置,数据存储,表操作

Apache Hive 官方文档

beeline 使用示例

Hive工作机制及使用

问题

问题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>
本文由作者按照 CC BY 4.0 进行授权。