参考
要在现有的 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

🧪 交互式测试示例
容器内交互测试:
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 节点掉线时,监控器会立即发现并记录故障事件!
