一、架构概述

本方案采用轻量化 Docker 部署,仅运行 Hive 核心服务,完全复用外部基础设施,资源占用低、运维简单:

  • 元数据存储:外部 MySQL 服务 192.168.110.190:3306(用户名:hive / 密码:hive3204)
  • 数据存储:外部 HDFS 集群 192.168.110.193:8020
  • Docker 运行组件:Hive Metastore(元数据服务)、HiveServer2(JDBC 接入入口)
  • 镜像版本:apache/hive:4.0.0

二、前置准备

2.1 网络连通性校验
确保 Docker 宿主机可正常访问外部服务:

# 测试 MySQL 端口连通性
telnet 192.168.110.190 3306

# 测试 HDFS NameNode 端口连通性
telnet 192.168.110.193 8020

2.2 MySQL 侧初始化
登录 MySQL 执行以下命令,创建元数据库并授权:

CREATE DATABASE IF NOT EXISTS hive DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive3204';
FLUSH PRIVILEGES;

2.3 HDFS 侧初始化
登录 HDFS NameNode 节点,创建 Hive 数据目录并授权:

# 创建仓库目录和临时目录
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /tmp/hive

# 开放读写权限(生产环境建议按用户精细化分配)
hdfs dfs -chmod 777 /user/hive/warehouse
hdfs dfs -chmod 777 /tmp/hive

三、部署文件准备

3.1 目录结构

docker-hive/
├── docker-compose.yml    # 服务编排文件
├── conf/
│   └── hive-site.xml     # Hive 核心配置
└── lib/
    └── mysql-connector-java-8.0.30.jar  # MySQL JDBC 驱动

3.2 下载 MySQL JDBC 驱动

bash
mkdir -p docker-hive/lib && cd docker-hive/lib
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar

3.3 核心配置文件 conf/hive-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- ========== MySQL 元数据库配置 ========== -->
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://192.168.110.190:3306/hive?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=utf8</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive3204</value>
  </property>

  <!-- ========== HDFS 存储配置 ========== -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://192.168.110.193:8020</value>
  </property>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>hdfs://192.168.110.193:8020/user/hive/warehouse</value>
  </property>
  <property>
    <name>hive.exec.scratchdir</name>
    <value>hdfs://192.168.110.193:8020/tmp/hive</value>
  </property>

  <!-- ========== Metastore 服务配置 ========== -->
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://hive-metastore:9083</value>
  </property>
  <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>

  <!-- ========== HiveServer2 配置 ========== -->
  <property>
    <name>hive.server2.authentication</name>
    <value>NONE</value>
  </property>
  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.mapred.mode</name>
    <value>nonstrict</value>
  </property>
</configuration>

3.4 服务编排文件 docker-compose.yml
关键注意:两个服务必须显式指定 DB_DRIVER: mysql,否则镜像默认使用 derby 数据库类型,导致启动失败。

version: '3.8'

services:
  # Hive 元数据服务
  hive-metastore:
    image: apache/hive:4.0.0
    container_name: hive-metastore
    restart: always
    ports:
      - "9083:9083"
    volumes:
      - ./conf/hive-site.xml:/opt/hive/conf/hive-site.xml
      - ./lib/mysql-connector-java-8.0.30.jar:/opt/hive/lib/mysql-connector.jar
    environment:
      SERVICE_NAME: metastore
      DB_DRIVER: mysql
    networks:
      - hive-net

  # HiveServer2 服务
  hiveserver2:
    image: apache/hive:4.0.0
    container_name: hiveserver2
    restart: always
    depends_on:
      - hive-metastore
    ports:
      - "10000:10000"   # JDBC 服务端口
      - "10002:10002"   # Web UI 监控端口
    volumes:
      - ./conf/hive-site.xml:/opt/hive/conf/hive-site.xml
      - ./lib/mysql-connector-java-8.0.30.jar:/opt/hive/lib/mysql-connector.jar
    environment:
      SERVICE_NAME: hiveserver2
      DB_DRIVER: mysql
    networks:
      - hive-net

networks:
  hive-net:
    driver: bridge

四、元数据初始化(首次部署必执行)

4.1 清理脏数据(如曾初始化失败)
若之前执行过错误的初始化命令,需先清空 MySQL 元数据库,避免状态不一致:

DROP DATABASE IF EXISTS hive;
CREATE DATABASE hive DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%';
FLUSH PRIVILEGES;

4.2 执行正确的 Schema 初始化
在 docker-hive 目录下执行,必须显式指定 DB_DRIVER=mysql 环境变量:

docker run --rm \
  -e DB_DRIVER=mysql \
  -v $(pwd)/conf/hive-site.xml:/opt/hive/conf/hive-site.xml \
  -v $(pwd)/lib/mysql-connector-java-8.0.30.jar:/opt/hive/lib/mysql-connector.jar \
  apache/hive:4.0.0 \
  schematool -dbType mysql -initSchema

4.3 成功标志
执行完成后终端输出 schemaTool completed,且日志中显示初始化脚本为 hive-schema-4.0.0.mysql.sql,即为成功。

五、启动服务

cd docker-hive

后台启动全部服务

docker-compose up -d

查看服务状态

docker-compose ps

说明:HiveServer2 启动需要 1~3 分钟完成初始化,期间 10000 端口未开放,属于正常现象。

六、验证部署

6.1 Beeline 命令行连接

docker exec -it hiveserver2 beeline -u jdbc:hive2://127.0.0.1:10000 -n root

6.2 功能测试 SQL

-- 查看数据库
show databases;
-- 创建测试表
create table test_hdfs(id int, name string);
-- 插入测试数据
insert into test_hdfs values(1, 'docker-hive'), (2, 'hdfs-test');
-- 查询数据
select * from test_hdfs;

6.3 验证 HDFS 数据写入
登录 HDFS 节点执行:

hdfs dfs -ls /user/hive/warehouse/test_hdfs

能看到对应的数据文件,说明 HDFS 存储对接正常。
6.4 Web UI 访问
浏览器访问 http://<Docker宿主机IP>:10002,可查看 HiveServer2 运行状态、任务监控、会话信息。

七、常用运维命令

查看实时日志

docker logs -f hive-metastore
docker logs -f hiveserver2

进入容器内部

docker exec -it hiveserver2 /bin/bash
停止服务
docker-compose stop
重启服务
docker-compose restart
停止并删除容器(保留配置和外部存储数据)
docker-compose down

八、常见问题与解决方案

8.1 元数据初始化报错:SQL 语法错误 1064
根因:未指定 DB_DRIVER=mysql,镜像默认加载 derby 数据库的 SQL 脚本,在 MySQL 中执行语法不兼容。
解决方案:执行初始化命令时添加 -e DB_DRIVER=mysql 参数,同时确保 docker-compose.yml 中也配置该环境变量。
8.2 Beeline 连接报错:Connection refused
根因:HiveServer2 尚未完成初始化,10000 端口未开放;或服务启动失败。
解决方案:
等待 2~3 分钟后重试,Hive 首次启动较慢
查看服务日志确认是否有报错:docker logs hiveserver2
检查 HDFS、MySQL 网络连通性
8.3 SLF4J 多重绑定警告
现象:日志中出现 Class path contains multiple SLF4J bindings
说明:仅为警告,不影响核心功能,实际生效的是 Log4j2 实现
消除方法(可选):删除冗余的日志实现包

docker exec -it --user root hive-metastore rm -f /opt/hadoop/share/hadoop/common/lib/slf4j-reload4j-*.jar /opt/tez/lib/slf4j-reload4j-*.jar
docker exec -it --user root hiveserver2 rm -f /opt/hadoop/share/hadoop/common/lib/slf4j-reload4j-*.jar /opt/tez/lib/slf4j-reload4j-*.jar
docker-compose restart

8.4 写入 HDFS 报错权限不足
根因:HDFS 目录 /user/hive/warehouse、/tmp/hive 无写入权限
解决方案:在 HDFS 节点执行授权命令:

hdfs dfs -chmod 777 /user/hive/warehouse
hdfs dfs -chmod 777 /tmp/hive

更多推荐