基于Docker的hadoop容器安装zookeeper

参考

Docker部署伪分布Hadoop

要在现有的 Hadoop 容器中安装 Zookeeper,我们需要执行以下步骤:

1. 进入容器

启动容器

根据您之前的操作,如果容器已经存在但处于停止状态,可以通过以下命令启动:

bash 复制代码
# 启动已存在的容器
docker start hadoop-pseudo

# 验证容器是否正在运行
docker ps | grep hadoop-pseudo

启动后,您可以通过以下方式验证服务状态:

bash 复制代码
# 查看容器日志
docker logs hadoop-pseudo

# 进入容器并检查 Hadoop 服务
docker exec -it hadoop-pseudo bash

# 在容器内检查进程
ps aux | grep -E "(java|zookeeper|hadoop)"

# 检查端口监听情况
netstat -tlnp | grep -E "(9870|8088|8042|9000|2181)"


可选检测网络

如果需要检查网络设置,确保 custom-network 仍然存在:

bash 复制代码
# 检查网络
docker network ls | grep custom-network

# 如果网络不存在,需要重新创建
docker network create --subnet=172.20.240.0/24 custom-network

启动容器后,记得在容器内启动 Hadoop 和 Zookeeper 服务。

bash 复制代码
docker exec -it hadoop-pseudo bash

可选 如果容器不存在,您需要重新创建它

如果容器不存在,您需要重新创建它。首先检查是否有已保存的镜像:

bash 复制代码
# 查看可用镜像
docker images | grep hadoop

# 如果有 hadoop-pseudo-updated:3.3.0 镜像,使用以下命令创建容器
docker run -d --name hadoop-pseudo --hostname hadoop-pseudo --network custom-network --ip 172.20.240.10 -p 9870:9870 -p 8088:8088 -p 8042:8042 -p 9000:9000 -v ~/hadoop-conf:/usr/local/hadoop/etc/hadoop -v pseudo-hadoop-namenode:/hadoop-data/namenode -v pseudo-hadoop-datanode:/hadoop-data/datanode -v pseudo-hadoop-tmp:/hadoop-data/tmp --privileged hadoop-pseudo-updated:3.3.0

2. 在容器内安装 Zookeeper

首先,我们需要将 Zookeeper 安装包复制到容器中,或者在容器内下载安装。以下是安装步骤:

bash 复制代码
# 更新包管理器
apt-get update

# 安装 Java(如果尚未安装)
# apt-get install -y openjdk-8-jdk

# 创建 zookeeper 目录
mkdir -p /opt/zookeeper

# 将已下载的 zookeeper 包复制到容器内
# 从宿主机复制到容器
exit  # 先退出容器
bash 复制代码
# 从宿主机复制 zookeeper 安装包到容器
docker cp apache-zookeeper-3.7.0-bin.tar.gz hadoop-pseudo:/opt/

# 再次进入容器
docker exec -it hadoop-pseudo bash

3. 解压并配置 Zookeeper

bash 复制代码
# 进入容器后继续操作
cd /opt

# 解压 zookeeper
tar -xzf apache-zookeeper-3.7.0-bin.tar.gz
mv apache-zookeeper-3.7.0-bin/* zookeeper
bash 复制代码
# 创建数据目录
mkdir -p /opt/zookeeper/data
touch /opt/zookeeper/conf/zoo.cfg

# 创建 Zookeeper 配置文件
cat > /opt/zookeeper/conf/zoo.cfg << EOF
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
EOF
bash 复制代码
# 设置环境变量
echo 'export ZOOKEEPER_HOME=/opt/zookeeper' >> ~/.bashrc
echo 'export PATH=$PATH:$ZOOKEEPER_HOME/bin' >> ~/.bashrc
source ~/.bashrc

# 启动 Zookeeper
/opt/zookeeper/bin/zkServer.sh start

# 检查 Zookeeper 是否正常运行
/opt/zookeeper/bin/zkServer.sh status

4. 验证 Zookeeper 安装

bash 复制代码
/opt/zookeeper/bin/zkCli.sh -server localhost:2181
# 然后在提示符下输入:
[zk: localhost:2181(CONNECTED) 0] stat
# 查看结果后输入 quit 退出
[zk: localhost:2181(CONNECTED) 1] quit


5. 如果需要持久化 Zookeeper 数据-未执行-需要重新安装zookeeper

添加数据卷

您可能还需要在 Docker 运行命令中添加 Zookeeper 数据卷:

bash 复制代码
# 退出容器
exit

# 停止当前容器
docker stop hadoop-pseudo

# 创建 Zookeeper 数据卷
docker volume create pseudo-zookeeper-data

# 重新启动容器,添加 Zookeeper 数据卷
docker run -d --name hadoop-pseudo-new --hostname hadoop-pseudo --network custom-network --ip 172.20.240.10 -p 9870:9870 -p 8088:8088 -p 8042:8042 -p 9000:9000 -p 2181:2181 -v ~/hadoop-conf:/usr/local/hadoop/etc/hadoop -v pseudo-hadoop-namenode:/hadoop-data/namenode -v pseudo-hadoop-datanode:/hadoop-data/datanode -v pseudo-hadoop-tmp:/hadoop-data/tmp -v pseudo-zookeeper-data:/opt/zookeeper/data --privileged hadoop-pseudo-updated:3.3.0

# 删除旧容器
docker rm hadoop-pseudo

# 重命名新容器
docker rename hadoop-pseudo-new hadoop-pseudo

重新进入容器完成 Zookeeper 配置

bash 复制代码
# 重新进入容器
docker exec -it hadoop-pseudo bash

# 在容器内再次安装 Zookeeper(因为使用了新的数据卷)
cd /opt
tar -xzf apache-zookeeper-3.7.0-bin.tar.gz
mv apache-zookeeper-3.7.0-bin zookeeper

# 修改配置文件指向持久化数据目录
cat > /opt/zookeeper/conf/zoo.cfg << EOF
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
EOF

# 设置环境变量
echo 'export ZOOKEEPER_HOME=/opt/zookeeper' >> ~/.bashrc
echo 'export PATH=$PATH:$ZOOKEEPER_HOME/bin' >> ~/.bashrc
source ~/.bashrc

# 启动 Zookeeper
/opt/zookeeper/bin/zkServer.sh start

# 验证运行状态
/opt/zookeeper/bin/zkServer.sh status

设置 Zookeeper 开机自启-未执行

如果您希望 Zookeeper 在容器启动时自动运行,可以创建启动脚本:

bash 复制代码
# 创建启动脚本
cat > /root/start-services.sh << 'EOF'
#!/bin/bash
# 启动 Hadoop 服务(如果需要)
# 启动 Zookeeper
/opt/zookeeper/bin/zkServer.sh start
tail -f /dev/null
EOF

chmod +x /root/start-services.sh

现在 Zookeeper 应该已经在您的 Hadoop 容器中成功安装并运行了!

6. 把当前容器提交为镜像,并再次运行

bash 复制代码
# 方法1:提交当前容器为新镜像
docker commit hadoop-pseudo hadoop-pseudo-zk

# 关闭hadoop-pseudo镜像
docker stop hadoop-pseudo

# 然后运行新镜像
docker run -d --name hadoop-pseudo-zk --hostname hadoop-pseudo --network custom-network --ip 172.20.240.11 -p 9870:9870 -p 8088:8088 -p 8042:8042 -p 9000:9000 -p 2181:2181 -v ~/hadoop-conf:/usr/local/hadoop/etc/hadoop -v pseudo-hadoop-namenode:/hadoop-data/namenode -v pseudo-hadoop-datanode:/hadoop-data/datanode -v pseudo-hadoop-tmp:/hadoop-data/tmp  --privileged hadoop-pseudo-zk:latest

7. 测试zookeeper

🧪 容器内测试 Zookeeper

1. 进入容器测试

bash 复制代码
# 进入容器
docker exec -it hadoop-pseudo-zk bash

# 1. 检查 Zookeeper 是否运行
ps aux | grep zookeeper
# 或者
jps
# 应该看到 QuorumPeerMain 进程

# 开启 Zookeeper 状态
zkServer.sh start

# 检查 Zookeeper 状态
zkServer.sh status
bash 复制代码
# 4. 使用 Zookeeper 客户端连接
zkCli.sh -server localhost:2181

# 5. 在 Zookeeper 客户端中执行命令
[zk: localhost:2181(CONNECTED) 0] ls /
[zk: localhost:2181(CONNECTED) 1] create /test "hello"
[zk: localhost:2181(CONNECTED) 2] get /test
[zk: localhost:2181(CONNECTED) 3] quit

2. 宿主机测试 Zookeeper

bash 复制代码
# 1. 使用 telnet 测试(如果安装了 telnet)
echo "ruok" | telnet 172.20.240.11 2181

# 2. 使用 netcat 测试
echo "ruok" | nc 172.20.240.11 2181

# 3. 使用 curl 测试(如果 Zookeeper 启用了 admin server)
curl http://172.20.240.11:8080/commands/ruok

# 4. 使用 Zookeeper 客户端(如果宿主机安装了 Zookeeper)
zkCli.sh -server 172.20.240.11:2181

http://172.20.240.11:8080

🧪 交互式测试示例

容器内交互测试:

bash 复制代码
# 进入容器
docker exec -it hadoop-pseudo-zk bash

# 检查服务状态
zkServer.sh status

# 使用 Zookeeper 客户端
zkCli.sh -server localhost:2181

# 在客户端中执行以下命令:
# ls /                    # 列出根节点
# create /myapp "Hello"   # 创建节点
# get /myapp             # 获取节点数据
# set /myapp "World"     # 修改节点数据
# delete /myapp          # 删除节点
# quit                   # 退出客户端

宿主机交互测试:

bash 复制代码
# 直接连接容器的 Zookeeper
echo "ruok" | nc 172.20.240.11 2181
# 输出: imok

# 获取统计信息
echo "stats" | nc 172.20.240.11 2181

# 如果宿主机有 Zookeeper 客户端
zkCli.sh -server 172.20.240.11:2181

zookeeper故障检测与通知机制

好的!我将为您演示如何在 Zookeeper 容器内使用临时节点、顺序节点和监听器来实现故障检测和通知机制。

🧪 容器内操作指南

这套方案实现了完整的故障检测和通知机制,当任何 Worker 节点掉线时,监控器会立即发现并记录故障事件!

相关推荐
guojb8242 小时前
告别部署踩坑:用 Docker Compose 优雅搞定多前端站点、HTTPS 与 SSE 推送
nginx·docker·https
pupudawang2 小时前
docker desktop安装redis
redis·docker·容器
用户78937733908532 小时前
从0到1实战:FastAPI + MySQL 项目 Docker 容器化部署与避坑指南
docker
dLYG DUMS2 小时前
如何在docker中的mysql容器内执行命令与执行SQL文件
sql·mysql·docker
赴前尘3 小时前
S3 命令行工具 Docker 容器运行
运维·docker·容器
2301_792674863 小时前
java学习day31 (docker)
java·学习·docker
她叫我大水龙3 小时前
Docker 安装和常用命令
运维·docker·容器
我叫唧唧波3 小时前
【自动化部署】CI/CD 实战(三):让 Argo CD 接管 CD,Jenkins 镜像自动同步到集群
运维·前端·ci/cd·docker·自动化·jenkins·argocd
菜鸟小码3 小时前
深入理解 Hive 数据模型
数据仓库·hive·hadoop