docker环境部署Hadoop集群教程

 更新时间:2026年05月22日 09:49:42   作者:Zhu758  
文章介绍了在Docker环境下部署Hadoop集群的步骤,包括ocker-compose.yml配置文件创建、Docker容器启动集群验证集群状态数据持久化测试NamenodeDatanatannode数据持久化测试容器故障场景验证持久化效果

需求

在docker环境部署Hadoop集群,用于预生产环境测试。

操作流程

创建文件config

CORE-SITE.XML_fs.default.name=hdfs://namenode
CORE-SITE.XML_fs.defaultFS=hdfs://namenode
HDFS-SITE.XML_dfs.namenode.name.dir=/opt/hadoop/data/nn
HDFS-SITE.XML_dfs.datanode.data.dir=/opt/hadoop/data/dn
HDFS-SITE.XML_dfs.namenode.rpc-address=namenode:8020
HDFS-SITE.XML_dfs.replication=1
MAPRED-SITE.XML_mapreduce.framework.name=yarn
MAPRED-SITE.XML_yarn.app.mapreduce.am.env=HADOOP_MAPRED_HOME=/opt/hadoop
MAPRED-SITE.XML_mapreduce.map.env=HADOOP_MAPRED_HOME=/opt/hadoop
MAPRED-SITE.XML_mapreduce.reduce.env=HADOOP_MAPRED_HOME=/opt/hadoop
YARN-SITE.XML_yarn.resourcemanager.hostname=resourcemanager
YARN-SITE.XML_yarn.nodemanager.pmem-check-enabled=false
YARN-SITE.XML_yarn.nodemanager.delete.debug-delay-sec=600
YARN-SITE.XML_yarn.nodemanager.vmem-check-enabled=false
YARN-SITE.XML_yarn.nodemanager.aux-services=mapreduce_shuffle
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.maximum-applications=10000
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.maximum-am-resource-percent=0.1
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.queues=default
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.capacity=100
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.user-limit-factor=1
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.maximum-capacity=100
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.state=RUNNING
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.acl_submit_applications=*
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.acl_administer_queue=*
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.node-locality-delay=40
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.queue-mappings=
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.queue-mappings-override.enable=false

创建文件docker-compose.yaml

volumes:
  hadoop-nn-data:
    name: hadoop-nn-data
  hadoop-dn-data:
    name: hadoop-dn-data
services:
  namenode:
    image: zhuyifeiruichuang/hadoop:3.1.1
    hostname: namenode
    container_name: hadoop-namenode
    command: ["sh", "-c", "sudo mkdir -p /opt/hadoop/data/nn && sudo chown -R hadoop:hadoop /opt/hadoop/data && if [ ! -d /opt/hadoop/data/nn/current ]; then echo 'Formatting NameNode...' && hdfs namenode -format; fi && hdfs namenode"]
    ports:
      - 9870:9870
      - 9000:9000
    env_file:
      - ./config
    environment:
      ENSURE_NAMENODE_DIR: "/opt/hadoop/data/nn"
    volumes:
      - hadoop-nn-data:/opt/hadoop/data/nn
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:9870 || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s
  datanode:
    image: zhuyifeiruichuang/hadoop:3.1.1
    container_name: hadoop-datanode
    command: ["sh", "-c", "sudo mkdir -p /opt/hadoop/data/dn && sudo chown -R hadoop:hadoop /opt/hadoop/data && hdfs datanode"]
    env_file:
      - ./config
    ports:
      - 9866:9866
      - 9864:9864
    volumes:
      - hadoop-dn-data:/opt/hadoop/data/dn
    depends_on:
      - namenode
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:9864 || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 40s
  resourcemanager:
    image: zhuyifeiruichuang/hadoop:3.1.1
    hostname: resourcemanager
    container_name: hadoop-resourcemanager
    command: ["yarn", "resourcemanager"]
    ports:
      - 8088:8088
      - 8032:8032
    env_file:
      - ./config
    depends_on:
      - namenode
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://127.0.0.1:8088 || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s
  nodemanager:
    hostname: nodemanager
    image: zhuyifeiruichuang/hadoop:3.1.1
    container_name: hadoop-nodemanager
    command: ["yarn", "nodemanager"]
    env_file:
      - ./config
    ports:
      - 8042:8042
    depends_on:
      - resourcemanager
      - namenode
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8042 || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 40s

启动集群

docker compose up -d

查询集群状态

docker compose ps -a

数据持久化测试

以下方法用于证明数据持久化生效,可确保容器故障后不丢失数据。

测试namenode

以下方法证明namenode数据持久化生效。

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

# 2. 在 HDFS 中创建测试目录
hdfs dfs -mkdir /test_persistence

# 3. 创建一个包含时间戳的测试文件,写入 HDFS
echo "This is a test file created at $(date)" > /tmp/test_file.txt
hdfs dfs -put /tmp/test_file.txt /test_persistence/namenode_test.txt

# 4. 退出容器
exit

# 5. 使用 down/up 重建 Namenode 服务
# 注意:这里只操作 Namenode
docker compose stop namenode
docker compose rm -f namenode

# 6. 重新启动集群(这会重建并启动 Namenode)
docker compose up -d namenode

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

# 8. 尝试列出并查看刚才创建的文件
hdfs dfs -ls /test_persistence
hdfs dfs -cat /test_persistence/namenode_test.txt

# 9. 退出容器
exit

测试datanode

以下方法证明datanode数据持久化生效

模拟容器故障场景

确认容器状态正常

docker ps -a

在容器内写入测试数据

docker exec -it hadoop-namenode bash
echo "验证DataNode数据持久化:容器重启后数据不丢失" > persist-test.txt
hdfs dfs -put persist-test.txt /
hdfs dfs -ls /
hdfs dfs -cat /persist-test.txt
exit

删除容器,确认容器真实删除

docker compose down
docker ps -a

重建容器,确认容器正常

docker compose up -d
docker compose ps -a

验证数据状态,

docker exec -it hadoop-namenode bash
hdfs dfs -ls /
hdfs dfs -cat /persist-test.txt
exit

证明常规启停容器时,数据持久化生效。

模拟破坏删除容器,重建容器并测试数据,

 docker rm -f hadoop-datanode
 docker compose up -d datanode
 docker exec -it hadoop-namenode hdfs dfs -cat /persist-test.txt

证明破坏删除容器时,数据持久化生效。

模拟数据卷故障场景

备份数据卷,确认备份成功

cp -r hadoop_hadoop-dn-data/ /opt/

删除容器,

docker compose down

删除数据卷,模拟数据卷被破坏,

docker volume rm hadoop_hadoop-dn-data

重建容器,

docker compose up -d

可见容器存在故障,已找不到数据,


删除容器,删除重建重启时的无数据的卷,新建空数据卷。注意:必须先有数据卷,才能再把数据复制过去,否则新建数据卷会使旧数据混乱。

docker compose down
docker volume rm hadoop_hadoop-dn-data
docker volume create hadoop_hadoop-dn-data

将备份数据转移到新数据卷,

cp -r hadoop_hadoop-dn-data/ /data/docker/volumes/

创建容器

docker compose up -d

验证数据状态

 docker exec -it hadoop-namenode-1 hdfs dfs -cat /persist-test.txt

证明数据卷被破坏时,可通过数据备份恢复,实现数据持久化。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker通过sbom获取组件版本和漏洞编号的方法

    docker通过sbom获取组件版本和漏洞编号的方法

    本文主要介绍了docker通过sbom获取组件版本和漏洞编号的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 详解Docker 容器使用 cgroups 限制资源使用

    详解Docker 容器使用 cgroups 限制资源使用

    本篇文章主要介绍了Docker 容器使用 cgroups 限制资源使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • docker之如何设置日志文件大小及个数

    docker之如何设置日志文件大小及个数

    这篇文章主要介绍了docker之如何设置日志文件大小及个数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • docker安装zookeeper全过程

    docker安装zookeeper全过程

    这篇文章介绍了在CentOS上使用Docker安装Zookeeper的步骤,包括拉取镜像、查看镜像、启动容器、检查容器状态以及运行客户端
    2025-11-11
  • Docker下配置PostgreSQL主从复制的详细步骤指南

    Docker下配置PostgreSQL主从复制的详细步骤指南

    本文详细介绍了在Docker环境下配置PostgreSQL主从复制的过程,包括环境准备、主从库配置、同步验证和故障处理等内容,通过使用Docker简化了Pgsql实例的部署与管理,提高了系统的可用性和数据安全性,文章还提供了详细的步骤和示例代码,适合新手和运维人员参考
    2026-04-04
  • Docker入门安装教程(小白篇)

    Docker入门安装教程(小白篇)

    这篇文章主要介绍了Docker入门安装教程(小白篇),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Docker四种网络类型原理实例解析

    Docker四种网络类型原理实例解析

    这篇文章主要介绍了Docker四种网络类型原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • docker build与Dockerfile问题

    docker build与Dockerfile问题

    这篇文章主要介绍了docker build与Dockerfile问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 宿主机无法访问docker容器中nginx服务的问题解决

    宿主机无法访问docker容器中nginx服务的问题解决

    在虚拟机中部署Docker并安装Nginx后,宿主机无法访问容器内的Nginx服务,通过检查端口映射、防火墙状态、进入容器内部启动Nginx以及检查/修改内核的IP转发设置,解决了该问题,感兴趣的可以了解一下
    2024-11-11
  • docker run本地镜像tar用法详解

    docker run本地镜像tar用法详解

    Docker中,使用docker load加载本地.tar镜像,再通过docker run运行,注意名称可能不同,需用docker images确认,确保文件完整及标签正确
    2025-09-09

最新评论