Docker 部署 Hive 对接外部 MySQL + 外部 HDFS 完整手册
一、架构概述
本方案采用轻量化 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&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&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
更多推荐
所有评论(0)