为docker-hadoop项目集成HBase环境
一、 教程概述
我们将通过扩展 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-master 和 hbase-regionserver 两个新的服务。
注意:YAML 格式对缩进非常敏感,请确保 hbase-master 与 namenode、datanode 等服务保持相同的缩进级别。
将以下内容追加到 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 秒,让所有服务完成初始化,然后按以下步骤进行验证。
-
检查所有容器状态:
Bash
docker-compose ps
您应该能看到
hbase-master和hbase-regionserver以及所有 Hadoop 服务都处于Up状态。 -
进入
hbase-master容器内部:Bash
docker exec -it hbase-master bash
-
验证 Java 进程 (关键):
在容器内部,运行 jps 命令。您必须能看到 HMaster 和 HQuorumPeer (ZooKeeper) 两个进程。
Bash
# 在容器内运行 jps
预期输出类似:
195 HMaster 29 HQuorumPeer 550 Jps
-
测试 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
更多推荐
所有评论(0)