5分钟容器化部署Apache Hive 3.1.2:Docker Compose全栈解决方案

还在为Hive的复杂安装过程头疼?传统部署需要手动配置JDK、Hadoop、MySQL驱动,光是解决版本兼容问题就能耗掉半天时间。本文将带你用Docker Compose一键部署完整的Hive 3.1.2环境,包含伪分布式Hadoop和MySQL 8.0元数据库,所有组件都已预配置好网络连接和权限设置。

1. 环境准备与Docker配置

在CentOS 7上执行以下命令安装Docker和Docker Compose:

# 安装Docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker && sudo systemctl enable docker

# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

验证安装是否成功:

docker --version && docker-compose --version

提示:如果遇到权限问题,可以将当前用户加入docker组: sudo usermod -aG docker $USER ,然后退出重新登录

2. 编写Docker Compose文件

创建 docker-compose.yml 文件,内容如下:

version: '3'

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: namenode
    ports:
      - "9870:9870"
      - "9000:9000"
    volumes:
      - hadoop_namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
    env_file:
      - ./hadoop.env

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: datanode
    depends_on:
      - namenode
    volumes:
      - hadoop_datanode:/hadoop/dfs/data
    env_file:
      - ./hadoop.env

  hive-server:
    image: apache/hive:3.1.2
    container_name: hive-server
    depends_on:
      - namenode
      - mysql
    ports:
      - "10000:10000"
      - "10002:10002"
    env_file:
      - ./hive.env
    environment:
      - SERVICE_NAME=hiveserver2
    volumes:
      - ./hive-site.xml:/opt/hive/conf/hive-site.xml
      - ./hive-log4j2.properties:/opt/hive/conf/hive-log4j2.properties

  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: hive
      MYSQL_USER: hive
      MYSQL_PASSWORD: hive
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql-init.sql:/docker-entrypoint-initdb.d/mysql-init.sql

volumes:
  hadoop_namenode:
  hadoop_datanode:
  mysql_data:

创建 hadoop.env 环境变量文件:

CORE_CONF_fs_defaultFS=hdfs://namenode:9000
CORE_CONF_hadoop_proxyuser_hue_hosts=*
CORE_CONF_hadoop_proxyuser_hue_groups=*

创建 hive.env 环境变量文件:

HIVE_CUSTOM_CONF_DIR=/opt/hive/conf
SERVICE_NAME=hiveserver2

3. 关键配置文件详解

3.1 hive-site.xml配置

创建 hive-site.xml 文件,这是Hive最关键的配置文件:

<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://mysql:3306/hive?createDatabaseIfNotExist=true</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
  </property>
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://hive-server:9083</value>
  </property>
  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hive-server</value>
  </property>
  <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
  </property>
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
</configuration>

3.2 MySQL初始化脚本

创建 mysql-init.sql 文件,用于初始化MySQL数据库:

CREATE DATABASE IF NOT EXISTS hive;
CREATE USER 'hive'@'%' IDENTIFIED BY 'hive';
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%';
FLUSH PRIVILEGES;

4. 启动与验证服务

4.1 启动所有服务

执行以下命令启动整个栈:

docker-compose up -d

服务启动后,可以通过以下命令查看各容器状态:

docker-compose ps

正常情况应该看到类似输出:

    Name                  Command               State                          Ports
--------------------------------------------------------------------------------------------------
datanode      /entrypoint.sh /run.sh          Up      8042/tcp, 8088/tcp, 9864/tcp, 9866/tcp
hive-server   /opt/hive/bin/start.sh          Up      10000/tcp, 10002/tcp, 9083/tcp
mysql         docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp, 33060/tcp
namenode      /entrypoint.sh /run.sh          Up      0.0.0.0:9000->9000/tcp, 9870/tcp

4.2 验证Hive服务

进入Hive容器执行查询:

docker exec -it hive-server /opt/hive/bin/beeline -u jdbc:hive2://localhost:10000

在Beeline命令行中执行测试SQL:

CREATE TABLE test (id INT, name STRING);
INSERT INTO test VALUES (1, 'hello'), (2, 'world');
SELECT * FROM test;

4.3 访问Web界面

  • Hadoop NameNode UI: http://服务器IP:9870
  • Hive Server2 UI: http://服务器IP:10002

5. 常见问题排查

如果遇到服务启动失败,可以查看各容器的日志:

# 查看Hive日志
docker logs hive-server

# 查看MySQL日志
docker logs mysql

# 查看Hadoop NameNode日志
docker logs namenode

常见问题及解决方案:

问题现象 可能原因 解决方案
Hive无法连接MySQL MySQL服务未启动或网络配置错误 检查mysql容器是否运行正常,确认hive-site.xml中的连接URL使用容器名mysql
Beeline连接超时 HiveServer2未正常启动 检查hive-server容器日志,确认10000端口监听正常
元数据初始化失败 MySQL权限不足 确认mysql-init.sql已正确执行,hive用户有足够权限

注意:首次启动时Hive会初始化元数据库,可能需要2-3分钟时间,请耐心等待

这套方案最大的优势在于所有组件都已容器化,不需要在宿主机安装任何依赖。当不再需要Hive环境时,只需执行 docker-compose down -v 即可彻底清理,不会在系统中留下任何痕迹。对于需要频繁创建和销毁测试环境的开发者来说,这无疑是最优雅的解决方案。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐