HBase+Hadoop单机版Docker部署指南

环境准备

系统要求

  • Docker 20.10 及以上版本

  • Docker Compose 2.0 及以上版本

  • 至少 4GB 内存(推荐 8GB 以上)

  • 至少 20GB 可用磁盘空间

版本选择

  • Hadoop: 3.4.2 (最新稳定版)

  • HBase: 2.5.13 (最新稳定版)

  • Java: 8 (兼容 HBase 和 Hadoop)

部署步骤

1. 创建项目目录


mkdir hbase-hadoop-docker
cd hbase-hadoop-docker

2. 创建 docker-compose.yml 文件

# Hadoop + HBase 分布式集群 Docker Compose 配置
# 兼容 Windows Docker Desktop / Linux 系统,一键启动 HDFS + YARN + HBase
version: '3.8'

services:
  # ==================== HDFS 名称节点 (核心管理节点) ====================
  namenode:
    # 使用官方 Hadoop 3.4.2 镜像
    image: apache/hadoop:3.4.2
    # 容器名称
    container_name: hadoop-namenode
    # 容器主机名(集群内部通信使用)
    hostname: namenode
    # 使用 root 用户运行,解决跨平台权限问题
    user: root
    # 启动命令:首次启动自动格式化 NameNode,后续启动直接运行,无需重复格式化
    command: ["/bin/sh", "-c", "if [ ! -d /tmp/hadoop-root/dfs/name/current ]; then hdfs namenode -format -nonInteractive; fi; hdfs namenode"]
    # 端口映射
    ports:
      - "9870:9870"    # HDFS Web UI 管理端口
      - "9000:9000"    # HDFS RPC 通信端口
    # 环境变量:自动生成 Hadoop 配置文件
    environment:
      - CORE-SITE.XML_fs.defaultFS=hdfs://namenode:9000    # 默认文件系统地址
      - HDFS-SITE.XML_dfs.replication=1                    # 数据副本数量(单机集群设为1)
    # 数据持久化挂载(本地目录:容器内目录)
    volumes:
      - ./hadoop_namenode:/tmp/hadoop-root/dfs/name    # NameNode 元数据存储
      - ./logs/hadoop/namenode:/opt/hadoop/logs        # 日志文件挂载
    # 加入自定义集群网络
    networks:
      - hadoop-net
    # 健康检查:确保服务正常启动
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9870"]
      interval: 10s      # 检查间隔
      retries: 5        # 重试次数
      start_period: 40s # 启动后延迟检查时间
    # 重启策略:异常退出自动重启
    restart: unless-stopped

  # ==================== HDFS 数据节点 (数据存储节点) ====================
  datanode:
    image: apache/hadoop:3.4.2
    container_name: hadoop-datanode
    user: root
    # 启动命令:创建数据目录 + 授权权限(兼容Windows挂载)+ 启动 DataNode
    command: ["/bin/sh", "-c", "mkdir -p /tmp/hadoop-root/dfs/data && chown -R root:root /tmp/hadoop-root && hdfs datanode"]
    ports:
      - "9864:9864"    # DataNode Web UI 端口
    environment:
      - CORE-SITE.XML_fs.defaultFS=hdfs://namenode:9000                # 连接 NameNode
      - HDFS-SITE.XML_dfs.datanode.data.dir=file:///tmp/hadoop-root/dfs/data  # 数据存储目录
    volumes:
      - ./hadoop_datanode:/tmp/hadoop-root/dfs/data    # DataNode 数据存储
      - ./logs/hadoop/datanode:/opt/hadoop/logs        # 日志文件挂载
    networks:
      - hadoop-net
    # 依赖关系:等待 NameNode 健康启动后再启动
    depends_on:
      namenode:
        condition: service_healthy
    restart: unless-stopped
    # 健康检查
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9864"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

  # ==================== YARN 资源管理器 (集群资源调度) ====================
  resourcemanager:
    image: apache/hadoop:3.4.2
    container_name: hadoop-resourcemanager
    hostname: resourcemanager
    user: root
    # 启动 YARN 资源管理器
    command: ["yarn", "resourcemanager"]
    ports:
      - "8088:8088"    # YARN Web UI 管理端口
    environment:
      - CORE-SITE.XML_fs.defaultFS=hdfs://namenode:9000              # 关联 HDFS
      - YARN-SITE.XML_yarn.resourcemanager.hostname=resourcemanager  # 资源管理器地址
    volumes:
      - ./logs/hadoop/resourcemanager:/opt/hadoop/logs    # 日志挂载
    networks:
      - hadoop-net
    # 等待 NameNode 启动完成
    depends_on:
      namenode: { condition: service_healthy }
    restart: unless-stopped

  # ==================== YARN 节点管理器 (执行计算任务) ====================
  nodemanager:
    image: apache/hadoop:3.4.2
    container_name: hadoop-nodemanager
    user: root
    # 启动 YARN 节点管理器
    command: ["yarn", "nodemanager"]
    environment:
      - CORE-SITE.XML_fs.defaultFS=hdfs://namenode:9000              # 关联 HDFS
      - YARN-SITE.XML_yarn.resourcemanager.hostname=resourcemanager  # 连接资源管理器
    volumes:
      - ./logs/hadoop/nodemanager:/opt/hadoop/logs    # 日志挂载
    networks:
      - hadoop-net
    # 等待资源管理器启动
    depends_on:
      resourcemanager: { condition: service_started }
    restart: unless-stopped

  # ==================== HBase 单机版 (分布式数据库) ====================
  hbase:
    image: harisekhon/hbase:2.1
    container_name: hbase-standalone
    hostname: hbase
    ports:
      - "2181:2181"      # Zookeeper 通信端口(HBase 依赖)
      - "16010:16010"    # HBase Master Web UI 端口
    # 环境变量:指定 HBase 数据存储在 HDFS 上
    environment:
      - HBASE_ROOTDIR=hdfs://namenode:9000/hbase
    # 数据持久化
    volumes:
      - ./hbase_data:/hbase-data          # HBase 数据存储
      - ./zookeeper_data:/zookeeper-data  # Zookeeper 数据存储
      - ./logs/hbase:/hbase/logs
    networks:
      - hadoop-net
    # 强依赖:等待 HDFS 主从节点全部健康启动
    depends_on:
      namenode: { condition: service_healthy }
      datanode: { condition: service_healthy }
    restart: unless-stopped

# ==================== 自定义集群网络 ====================
networks:
  hadoop-net:
    # 桥接模式:容器间互联互通,与外部隔离
    driver: bridge

3. 启动服务


# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

4. 等待服务启动

服务启动需要一些时间,特别是第一次启动时需要下载镜像和初始化数据。可以通过以下命令查看日志:


# 查看Hadoop NameNode日志
docker-compose logs -f namenode

# 查看HBase日志
docker-compose logs -f hbase

验证部署

1. 访问 Web 界面

2. 验证 Hadoop


# 进入NameNode容器
docker exec -it hadoop-namenode bash

# 查看HDFS状态
hdfs dfsadmin -report

# 创建测试目录
hdfs dfs -mkdir /test

# 列出目录
hdfs dfs -ls /

3. 验证 HBase


# 进入HBase容器
docker exec -it hbase-standalone bash

# 启动HBase Shell
hbase shell

# 查看HBase状态
status

# 查看HBase版本
version

# 创建测试表
create 'test_table', 'cf1'

# 插入数据
put 'test_table', 'row1', 'cf1:col1', 'value1'

# 查询数据
get 'test_table', 'row1'

# 扫描表
scan 'test_table'

# 退出HBase Shell
exit

常用操作

停止服务


# 停止所有服务
docker-compose down

# 停止并删除数据卷(谨慎使用)
docker-compose down -v

重启服务


# 重启所有服务
docker-compose restart

# 重启特定服务
docker-compose restart hbase

查看日志


# 查看所有服务日志
docker-compose logs

# 查看特定服务日志
docker-compose logs hbase

# 实时查看日志
docker-compose logs -f namenode

故障排除

常见问题

  1. HBase 无法连接到 HDFS

    • 检查 Hadoop 服务是否正常运行

    • 确保 hbase_rootdir 配置正确

    • 检查网络连通性

  2. HBase 启动失败

    • 检查 Zookeeper 端口是否被占用

    • 确保内存足够

    • 查看 HBase 日志获取详细错误信息

  3. Web 界面无法访问

    • 检查端口映射是否正确

    • 确保防火墙允许相应端口

    • 检查服务是否正常启动

性能优化

  1. 内存配置

    • 根据实际情况调整 JVM 内存参数

    • 确保给 Docker 分配足够的内存

  2. 存储优化

    • 使用 SSD 存储以提高性能

    • 定期清理不需要的数据

  3. 网络优化

    • 使用主机网络模式提高性能

    • 确保网络带宽足够

安全考虑

生产环境注意事项

  1. 不要使用 root 用户运行

    • 在生产环境中创建专门的用户

    • 配置适当的权限

  2. 启用身份验证

    • 配置 Kerberos 身份验证

    • 启用 SSL/TLS 加密

  3. 备份策略

    • 定期备份 HBase 数据

    • 配置 HDFS 快照

升级指南

升级 HBase

  1. 停止 HBase 服务

  2. 备份数据

  3. 更新 docker-compose.yml 中的 HBase 版本

  4. 启动新的 HBase 服务

  5. 验证数据完整性

升级 Hadoop

  1. 停止所有服务

  2. 备份 HDFS 数据

  3. 更新 docker-compose.yml 中的 Hadoop 版本

  4. 启动新的 Hadoop 服务

  5. 格式化 NameNode(如果需要)

  6. 恢复数据

总结

通过 Docker Compose 可以快速部署 HBase+Hadoop 单机版环境,非常适合开发和测试使用。本指南使用了最新的稳定版本,并配置了 HBase 使用内置的 Zookeeper,简化了部署过程。

建议在生产环境中使用分布式部署,并配置适当的监控和备份策略。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐