一、 教程概述

我们将通过扩展 docker-compose.yml 文件的方式,将 HBase Master 和 HBase RegionServer 作为新的服务加入集群,并确保它们能与 Hadoop HDFS 正确集成。这种声明式的方法保证了环境的一致性、可移植性和易管理性。

二、 操作步骤
第 1 步:创建 HBase 构建目录

docker-hadoop 项目根目录下,创建一个名为 hbase 的新文件夹,用于存放 HBase 镜像的构建文件。

Bash

mkdir hbase

第 2 步:编写 HBase 的 Dockerfile

进入 hbase 目录,创建一个名为 Dockerfile 的文件。此文件将定义如何构建我们的 HBase 镜像。

Bash

cd hbase
touch Dockerfile

将以下内容完整复制Dockerfile 文件中:

Dockerfile

# 步骤 1: 选择 OpenJDK 8 的 JDK 版本作为基础镜像
# 我们选择 JDK 而不是 JRE, 是因为 JDK 包含了 jps 等方便的调试工具。
FROM openjdk:8-jdk
​
# 步骤 2: 设置环境变量
ENV HBASE_VERSION=2.5.12
ENV HBASE_HOME=/opt/hbase
ENV PATH=$PATH:$HBASE_HOME/bin
​
# 步骤 3: 关键步骤 - 优化下载和安装过程
RUN set -x \
    # 3.1: 将 Debian 的 apt 源更换为国内清华镜像,解决 apt-get 慢的问题
    && sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y --no-install-recommends wget \
    # 3.2: 从国内清华镜像下载 HBase,解决官方源下载慢或失败的问题
    && wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/${HBASE_VERSION}/hbase-${HBASE_VERSION}-bin.tar.gz -O /tmp/hbase.tar.gz \
    # 3.3: 解压、创建软链接并清理
    && tar -xzvf /tmp/hbase.tar.gz -C /opt \
    && ln -s /opt/hbase-${HBASE_VERSION} ${HBASE_HOME} \
    && rm /tmp/hbase.tar.gz \
    # 3.4: 清理apt缓存,保持镜像小巧
    && apt-get purge -y --auto-remove wget \
    && rm -rf /var/lib/apt/lists/*
​
# 步骤 4: 复制我们即将创建的启动脚本
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
​
# 步骤 5: 声明 HBase 服务的默认端口
EXPOSE 16000 16010 16020 16030
​
# 步骤 6: 定义容器的启动入口
ENTRYPOINT ["/entrypoint.sh"]

第 3 步:创建健壮的 entrypoint.sh 启动脚本

这是整个教程中最关键的一环。此脚本负责在容器启动时动态生成配置文件,并用正确的方式启动 HBase 服务,避免容器闪退。

hbase 目录下,创建一个名为 entrypoint.sh 的文件。

Bash

touch entrypoint.sh

将以下内容完整复制entrypoint.sh 文件中:

Bash

#!/bin/bash
set -e
​
# --- 配置部分 ---
# 动态生成 hbase-site.xml,配置HBase与HDFS和ZooKeeper的连接
cat > $HBASE_HOME/conf/hbase-site.xml <<EOF
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://namenode:9000/hbase</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>hbase-master</value>
  </property>
</configuration>
EOF
# 告诉 Master 节点,RegionServer 在哪里
echo "hbase-regionserver" > $HBASE_HOME/conf/regionservers
​
​
# --- 启动部分 (核心修复) ---
if [ "$1" = "master" ]; then
  # 关键修复 1: 在启动 Master 之前,必须先显式启动内置的 ZooKeeper 服务。
  # 这解决了 HMaster 因连接 ZooKeeper 失败而退出的问题。
  echo "Starting ZooKeeper in background..."
  $HBASE_HOME/bin/hbase-daemon.sh start zookeeper
  
  echo "Starting HBase Master in background..."
  $HBASE_HOME/bin/hbase-daemon.sh start master
elif [ "$1" = "regionserver" ]; then
  echo "Starting HBase RegionServer in background..."
  $HBASE_HOME/bin/hbase-daemon.sh start regionserver
else
  # 允许我们运行其他命令,例如 bash
  exec "$@"
  exit 0
fi
​
# 关键修复 2: 使用 tail -f /dev/null 技巧来永久保持容器运行。
# 这解决了因主进程退出而导致的容器闪退 (is not running) 的问题。
echo "Container is running. Tailing /dev/null to keep it alive."
exec tail -f /dev/null

第 4 步:修改 docker-compose.yml 添加 HBase 服务

回到 docker-hadoop 项目根目录,打开 docker-compose.yml 文件。在 services: 部分的末尾,添加 hbase-masterhbase-regionserver 两个新的服务。

注意:YAML 格式对缩进非常敏感,请确保 hbase-masternamenodedatanode 等服务保持相同的缩进级别。

将以下内容追加services: 模块的末尾:

YAML

  # ... 此前已有的 historyserver 服务 ...
​
  hbase-master:
    build:
      context: ./hbase
    container_name: hbase-master
    hostname: hbase-master
    command: ["master"]
    ports:
      - "16010:16010" # HBase Master Web UI
      - "16000:16000"
    depends_on:
      - namenode
      - datanode
    networks:
      - default
​
  hbase-regionserver:
    build:
      context: ./hbase
    container_name: hbase-regionserver
    hostname: hbase-regionserver
    command: ["regionserver"]
    ports:
      - "16030:16030" # HBase RegionServer Web UI
    depends_on:
      - hbase-master
    networks:
      - default
​
# 如果文件末尾没有 networks 定义, 请添加
networks:
  default:

第 5 步:构建并启动整个集群

万事俱备!在 docker-hadoop 项目根目录下,运行以下命令来构建新的 HBase 镜像并启动所有服务。

Bash

# --build 会强制根据我们修改过的 Dockerfile 重新构建镜像
# -d 会让容器在后台运行
docker-compose up -d --build

首次构建会下载基础镜像和 HBase 安装包,需要一些时间。

四、 验证安装

等待约 30-60 秒,让所有服务完成初始化,然后按以下步骤进行验证。

  1. 检查所有容器状态

    Bash

    docker-compose ps

    您应该能看到 hbase-masterhbase-regionserver 以及所有 Hadoop 服务都处于 Up 状态。

  2. 进入 hbase-master 容器内部

    Bash

    docker exec -it hbase-master bash
  3. 验证 Java 进程 (关键):

    在容器内部,运行 jps 命令。您必须能看到 HMaster 和 HQuorumPeer (ZooKeeper) 两个进程。

    Bash

    # 在容器内运行
    jps

    预期输出类似:

    195 HMaster
    29 HQuorumPeer
    550 Jps
  4. 测试 HBase Shell:

    继续在容器内部,启动 HBase 客户端。

    Bash

    hbase shell

    进入 hbase:001:0> 提示符后,输入 status 命令。

    代码段

    status

    如果一切正常,您将看到类似下面的健康状态报告,这意味着您的 HBase 集群已成功搭建并可供使用!

    1 active master, 0 backup masters, 1 servers, 0 dead, 2.0000 average load

更多推荐