简介:这份实验报告面向大数据技术基础课程的学习者,聚焦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 问题都会让你卡在启动阶段,分不清是配置错还是网络错。
完全分布式的角色划分,常见做法是这样:
| 节点 | 角色 | 说明 |
|---|---|---|
| master | NameNode、ResourceManager、SecondaryNameNode | 主控节点,内存建议 4G 以上 |
| slave1 | DataNode、NodeManager | 数据与计算节点 |
| slave2 | DataNode、NodeManager | 数据与计算节点 |
三台机器可以是三台虚拟机,也可以是云主机。实验环境里我一般用 VMware 或 VirtualBox 开三台 CentOS 7 或 Ubuntu 20.04,每台 2 核 4G,磁盘 40G 起步。注意,DataNode 的磁盘要留够,后面存实验数据不至于爆盘。
2.2 Java 环境:版本选错,后面全白搭
Hadoop 3.x 官方推荐 JDK 8,Hadoop 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相当于本地 DNS,Hadoop 配置里写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权限是否为 700,authorized_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.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> </configuration>逻辑说明:fs.defaultFS指定 HDFS 的访问入口,客户端和 DataNode 都靠它找 NameNode。hadoop.tmp.dir是 Hadoop 的临时目录,默认在/tmp下,重启机器可能被清空,导致集群元数据丢失,所以必须改到持久化路径。
hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9868</value> </property> </configuration>逻辑说明:dfs.replication是副本数,三节点集群设 3 正好每个节点一份;如果只有两台 DataNode,设 3 会一直报副本不足,实验环境设 2 更稳。SecondaryNameNode 不是热备,它只做 checkpoint,地址指向 master 即可。
mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>逻辑说明:这一行决定 MapReduce 作业跑在 YARN 上而不是本地。不配的话,作业会在本地 JVM 里跑,看不到集群调度效果。
yarn-site.xml:
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_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 -format,NameNode 重新生成了 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 firewalld(CentOS)或sudo ufw disable(Ubuntu);生产环境则要按需放行 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/path,distcp 会自动识别跨集群。
几个关键参数值得单独说:
| 参数 | 作用 | 建议值 |
|---|---|---|
| -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% 的网络和权限问题。集群搭建这件事,命令谁都会抄,真正拉开差距的是知道每一步为什么这么做、出错时先看哪里。希望帮到你。
本文还有配套的精品资源,点击获取