资讯动态

Linux下Hadoop集群搭建与配置实战:从伪分布式到三节点完全分布式

发布时间:2026/10/6 4:40:14 来源:尧图企业网站定制
简介这份实验报告面向大数据技术基础课程的学习者聚焦Linux环境下Hadoop集群的搭建与基本配置适合刚接触分布式计算、需要完成课程实验或自学集群部署的初学者。报告完整覆盖CentOS安装、Java环境配置、SSH无密登录、主机名与IP映射、Hadoop安装及hadoop-env.sh、yarn-env.sh等核心配置文件修改并延伸到NameNode与DataNode的分布式环境搭建。资源包内含1个doc文档约120KB以文字与命令记录为主便于对照操作与整理笔记。文中还专门总结了安全模式退出、NativeCodeLoader本地库加载失败、8088端口无法访问、DataNode节点缺失等常见疑难及解决思路能帮助读者少走弯路。目前已有4668人学习下载适合作为实验参考与排错手册使用。1. 从一份实验报告说起Linux 下 Hadoop 集群到底要搭出什么很多人第一次接触大数据都是从一份「大数据技术基础实验报告」开始的题目往往就是 Linux 环境下 Hadoop 集群的搭建与基本配置。看着像是一次课程作业但真正动手才会发现它其实是一次对 Linux 基本功、网络配置、Java 环境和分布式组件协同的集中体检。搭完之后你会得到一套能跑 HDFS 和 YARN 的最小集群能提交 MapReduce 作业也能为后面接 Hive、HBase、Spark 打好底座。这篇笔记面向两类人一类是要交实验报告、但不想只抄命令的学生另一类是要在测试环境快速拉起一套 Hadoop 集群、后面还要接 zookeeper、kafka、spark 的运维和开发。核心诉求就四个这是什么、怎么做、参数怎么设、坑在哪。下面按「先立住原理再动手复现」的顺序讲命令和配置都能直接抄但每个参数我都会说清为什么这么设。2. 搭建前的选型与准备三台机器、一个 Java、一套网络2.1 为什么实验环境推荐伪分布式起步再上三节点Hadoop 的部署模式有三种本地模式、伪分布式、完全分布式。实验报告里如果只要求「搭建与基本配置」最稳的路径是先用伪分布式把 NameNode、DataNode、ResourceManager、NodeManager 全部在一台机器上跑通确认配置无误后再拆成三节点完全分布式。原因很直接伪分布式能让你在半小时内看到 HDFS 的目录结构和 YARN 的 Web UI一旦直接上三节点任何一个 SSH 或 hostname 问题都会让你卡在启动阶段分不清是配置错还是网络错。完全分布式的角色划分常见做法是这样节点角色说明masterNameNode、ResourceManager、SecondaryNameNode主控节点内存建议 4G 以上slave1DataNode、NodeManager数据与计算节点slave2DataNode、NodeManager数据与计算节点三台机器可以是三台虚拟机也可以是云主机。实验环境里我一般用 VMware 或 VirtualBox 开三台 CentOS 7 或 Ubuntu 20.04每台 2 核 4G磁盘 40G 起步。注意DataNode 的磁盘要留够后面存实验数据不至于爆盘。2.2 Java 环境版本选错后面全白搭Hadoop 3.x 官方推荐 JDK 8Hadoop 2.7 也以 JDK 8 为主。不要图新用 JDK 11 或 17很多老版本 Hadoop 的脚本里对java.version的判断会直接报错。安装命令以 Ubuntu 为例# 安装 OpenJDK 8 sudo apt update sudo apt install -y openjdk-8-jdk # 验证版本必须看到 1.8 java -version # 配置 JAVA_HOME写入 /etc/profile echo export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 | sudo tee -a /etc/profile echo export PATH$JAVA_HOME/bin:$PATH | sudo tee -a /etc/profile source /etc/profile逻辑说明JAVA_HOME必须指向 JDK 根目录而不是bin目录。Hadoop 的hadoop-env.sh里会引用这个变量如果写错启动时会报JAVA_HOME is not set。参数上/etc/profile是全局生效三台机器都要配且路径要一致否则从 master 远程启动 slave 上的进程时会找不到 Java。2.3 主机名、hosts 与 SSH 免密集群通信的三件套集群里节点之间靠主机名互相找所以三台机器都要改 hostname 并写 hosts。以 master 为例# 修改主机名 sudo hostnamectl set-hostname master # 三台机器都写入同样的 hosts 记录 sudo tee -a /etc/hosts EOF 192.168.1.101 master 192.168.1.102 slave1 192.168.1.103 slave2 EOF逻辑说明/etc/hosts相当于本地 DNSHadoop 配置里写master:9000时就是靠它解析。IP 要换成你自己环境的真实 IP用ip addr查看。改完 hostname 后建议重启或重新登录让提示符生效。SSH 免密是启动脚本能远程拉起 slave 进程的前提# 在 master 上生成密钥 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 把公钥发给三台机器包括自己 ssh-copy-id master ssh-copy-id slave1 ssh-copy-id slave2 # 验证应该不输密码直接登录 ssh slave1逻辑说明-P 表示空密码实验环境够用。ssh-copy-id会把公钥追加到目标机的~/.ssh/authorized_keys。如果登录还要密码检查目标机~/.ssh权限是否为 700authorized_keys是否为 600这是血泪经验里最常见的一条。3. Hadoop 安装与核心配置从解压到能启动3.1 解压与环境变量一次配好三台同步下载 Hadoop 3.3.x 的二进制包解压到/usr/local# 解压并改名 sudo tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local/ sudo mv /usr/local/hadoop-3.3.6 /usr/local/hadoop # 设置属主避免权限问题 sudo chown -R $USER:$USER /usr/local/hadoop # 配置 Hadoop 环境变量 echo export HADOOP_HOME/usr/local/hadoop | sudo tee -a /etc/profile echo export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH | sudo tee -a /etc/profile source /etc/profile # 验证 hadoop version逻辑说明HADOOP_HOME是后续所有配置文件的基准路径sbin加入 PATH 是为了能直接敲start-dfs.sh。三台机器都要做同样的解压和环境变量配置路径必须一致否则 master 远程启动 slave 时会找不到命令。3.2 五个核心配置文件改哪几行为什么改Hadoop 的配置集中在$HADOOP_HOME/etc/hadoop下。实验报告里最常改的是这五个文件下面给出最小可用配置。core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://master:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configuration逻辑说明fs.defaultFS指定 HDFS 的访问入口客户端和 DataNode 都靠它找 NameNode。hadoop.tmp.dir是 Hadoop 的临时目录默认在/tmp下重启机器可能被清空导致集群元数据丢失所以必须改到持久化路径。hdfs-site.xmlconfiguration property namedfs.replication/name value3/value /property property namedfs.namenode.secondary.http-address/name valuemaster:9868/value /property /configuration逻辑说明dfs.replication是副本数三节点集群设 3 正好每个节点一份如果只有两台 DataNode设 3 会一直报副本不足实验环境设 2 更稳。SecondaryNameNode 不是热备它只做 checkpoint地址指向 master 即可。mapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configuration逻辑说明这一行决定 MapReduce 作业跑在 YARN 上而不是本地。不配的话作业会在本地 JVM 里跑看不到集群调度效果。yarn-site.xmlconfiguration property nameyarn.resourcemanager.hostname/name valuemaster/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configuration逻辑说明yarn.resourcemanager.hostname告诉 NodeManager 去哪里注册。yarn.nodemanager.aux-services必须设成mapreduce_shuffle否则 MapReduce 的 shuffle 阶段会失败这是新手最常踩的坑之一。workers文件老版本叫 slaves# 写入所有 DataNode 主机名 slave1 slave2逻辑说明这个文件决定start-dfs.sh会在哪些机器上启动 DataNode 和 NodeManager。master 自己如果也做 DataNode就把 master 也写进去。3.3 格式化与启动第一次启动的完整命令序列配置改完后三台机器同步配置文件然后在 master 上执行# 格式化 NameNode只能执行一次 hdfs namenode -format # 启动 HDFS start-dfs.sh # 启动 YARN start-yarn.sh # 查看进程 jps逻辑说明hdfs namenode -format会创建 HDFS 的元数据目录重复格式化会导致 DataNode 的 clusterID 和 NameNode 不一致集群起不来这是必须记住的后悔药。jps在 master 上应看到 NameNode、ResourceManager、SecondaryNameNode在 slave 上应看到 DataNode、NodeManager。启动后验证# 查看 HDFS 根目录 hdfs dfs -ls / # 创建一个测试目录 hdfs dfs -mkdir -p /test/input # 上传一个本地文件 echo hello hadoop test.txt hdfs dfs -put test.txt /test/input/ # 查看文件内容 hdfs dfs -cat /test/input/test.txt逻辑说明-mkdir -p支持多级目录-put上传本地文件到 HDFS-cat直接读 HDFS 内容。这几条命令能跑通说明 HDFS 基本可用。YARN 的 Web UI 默认在http://master:8088能打开并看到两个 NodeManager 就算成功。4. 避坑与排查集群起不来时先看这几处4.1 现象jps 看不到 DataNode日志报 clusterID 不一致原因重复执行了hdfs namenode -formatNameNode 重新生成了 clusterID而 DataNode 还保留旧的。解决停掉集群删除所有节点的hadoop.tmp.dir下的dfs/data目录重新格式化一次再启动。注意格式化前一定要确认没有重要数据。4.2 现象start-dfs.sh 提示 Permission denied 或要输密码原因SSH 免密没配好或者~/.ssh权限不对。解决在 master 上执行ssh slave1测试如果要密码重新ssh-copy-id如果报权限错误执行chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys。三台机器都要检查。4.3 现象YARN 作业一直卡在 ACCEPTED不进入 RUNNING原因NodeManager 没注册上或者yarn.nodemanager.aux-services配错。解决先看 slave 上jps有没有 NodeManager没有就查yarn-site.xml是否同步有的话看 ResourceManager 日志里有没有NodeManager from slave1 not registered通常是主机名解析问题检查/etc/hosts。4.4 现象HDFS 上传文件报 Could not obtain block原因DataNode 磁盘满了或者副本数设得比 DataNode 数量还大。解决hdfs dfsadmin -report查看各节点剩余空间和 DataNode 数量把dfs.replication调到不超过 DataNode 数量清理磁盘后重启 DataNode。4.5 现象Web UI 打不开但 jps 进程都在原因防火墙没放行端口或者绑定了 127.0.0.1。解决实验环境可以直接关防火墙sudo systemctl stop firewalldCentOS或sudo ufw disableUbuntu生产环境则要按需放行 9870、8088、9000 等端口。另外确认core-site.xml里写的是主机名而不是 localhost。5. 进阶技巧用 distcp 做集群间数据迁移与验证集群搭好只是开始真正体现功底的是数据怎么在集群之间搬。Hadoop 自带的distcp就是干这个的它底层跑 MapReduce能并行复制比hdfs dfs -cp跨集群可靠得多。实验报告里如果加一段 distcp 的验证含金量会明显不一样。先准备第二个集群或者用同一个集群的不同路径模拟。基本用法# 从源集群复制到目标集群 hadoop distcp \ -m 10 \ -bandwidth 50 \ hdfs://master:9000/test/input \ hdfs://backup:9000/test/input逻辑说明-m 10表示启动 10 个 map 任务并行复制数字越大并发越高但会占用更多 YARN 资源实验环境 5 到 10 够用。-bandwidth 50限制每个 map 的带宽为 50MB/s防止把网络打满。源和目标都写完整的hdfs://host:port/pathdistcp 会自动识别跨集群。几个关键参数值得单独说参数作用建议值-m最大 map 数5~20按数据量调-bandwidth单 map 带宽上限50~100单位 MB/s-update只复制源比目标新的文件增量同步必加-delete删除目标端源端没有的文件做镜像时加慎用-skipcrccheck跳过 CRC 校验网络差时可加但会降低可靠性验证复制结果# 对比源和目标的文件列表 hdfs dfs -ls -R hdfs://master:9000/test/input /tmp/src.txt hdfs dfs -ls -R hdfs://backup:9000/test/input /tmp/dst.txt diff /tmp/src.txt /tmp/dst.txt # 用 count 对比文件数和总大小 hdfs dfs -count hdfs://master:9000/test/input hdfs dfs -count hdfs://backup:9000/test/input逻辑说明-ls -R递归列出所有文件diff能快速发现差异。-count输出三列目录数、文件数、总字节数两边一致基本就说明复制完整。如果用了-update第二次执行 distcp 时应该只复制变化的部分这也是验证增量逻辑是否生效的方法。我自己的习惯是每次搭完集群先跑一遍 distcp 小数据量测试确认跨集群通信和 YARN 调度都正常再开始灌真实数据。这个动作花不了十分钟但能提前暴露 90% 的网络和权限问题。集群搭建这件事命令谁都会抄真正拉开差距的是知道每一步为什么这么做、出错时先看哪里。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑