简介这份资源面向大数据入门学习者与高校云计算课程设计者提供在Ubuntu系统上从零搭建Hadoop分布式环境的完整教程覆盖虚拟机安装、SSH免密登录、共享文件夹挂载、JDK环境配置、Hadoop安装与参数调优、环境变量设置等关键环节帮助读者构建可运行的大数据处理平台。压缩包共93个文件约222.16MB包含xml与iml工程配置、class与java源码、jar依赖、png操作截图、docx与doc实验报告及txt说明文档另附Cloud-Computing-course-design-master课程设计案例内含倒排索引、矩阵相乘、Dijkstra、二次排序等实验模块。已有112人学习下载。读者可据此获得从环境搭建到实验验证的完整流程参考并借助附赠项目与报告模板理解HDFS使用、集群通信与常见排错思路适合初学者与需要课程设计素材的开发者对照实践。1. 从一台空虚拟机到能跑 MapReduce 的 Hadoop 集群很多人第一次搭 Hadoop 集群卡住的地方往往不是 MapReduce 本身而是前面那堆“脏活”虚拟机装完 Ubuntu 之后网络不通、SSH 每次都要输密码、共享文件夹挂不上、JDK 环境变量写错导致hadoop version直接报找不到 Java。这份资源就是冲着这些脏活来的——它是一套基于 Ubuntu 的 Hadoop 分布式环境搭建教程配套了课程设计源码InvertedIndex、MatrixMultiply、Dijkstra、SecondarySort 四个实验、实验报告模板和一堆配置截图。适合两类人一是要交大数据课程设计、需要从零把伪分布式或全分布式跑通的学生二是想在自己机器上复现一套能提交 Job、能看 HDFS 文件的最小集群、但不想被环境问题反复消耗的开发者。下面按“装系统 → 通网络 → 免密 → 挂共享 → 配 JDK → 装 Hadoop → 跑实验”的顺序拆重点放在参数和踩坑上。2. 虚拟机与 Ubuntu 底座网络模式、静态 IP 和主机名映射2.1 为什么先定网络模式再装系统Hadoop 集群节点之间要靠主机名互相访问NameNode 会把自己的地址写进元数据DataNode 注册时也带着自己的地址。如果虚拟机用 NAT 且 DHCP 分配 IP重启一次 IP 就变集群直接失联。常见做法是单机伪分布式用 NAT 够用但要在虚拟机里配静态 IP多节点全分布式建议用桥接让每台虚拟机在局域网里有独立 IP。这份教程的截图里用的是 NAT 静态 IP 的组合对只有一台物理机的场景最省事。装 Ubuntu 时有个容易忽略的点主机名hostname在安装阶段就定好别用默认的一长串。后面/etc/hosts和 Hadoop 配置文件里都要写这个名字改起来牵一发动全身。2.2 静态 IP 与 hosts 映射的落地步骤Ubuntu 从 17.10 开始用 netplan 管理网络配置文件在/etc/netplan/下通常是00-installer-config.yaml。先看当前网卡名ip addr show # 记下类似 ens33 或 enp0s3 的网卡名然后编辑 netplan 配置把 DHCP 改成静态# /etc/netplan/00-installer-config.yaml network: ethernets: ens33: # 换成你自己的网卡名 dhcp4: false addresses: - 192.168.10.100/24 # 静态 IP网段要和宿主机虚拟网络一致 gateway4: 192.168.10.2 # VMware NAT 模式下网关通常是 x.x.x.2 nameservers: addresses: [8.8.8.8, 114.114.114.114] version: 2应用配置并验证sudo netplan apply ip addr show ens33 # 确认 IP 已生效 ping -c 3 192.168.10.2 # 确认网关可达参数说明addresses里的 IP 必须落在虚拟机软件分配的网段内VMware 的 NAT 网段可以在“虚拟网络编辑器”里查到gateway4填错会导致能 ping 通同网段但出不了外网。改完网络后配主机名映射这一步是后面 SSH 免密和 Hadoop 配置的基础sudo hostnamectl set-hostname hadoop-master # 编辑 /etc/hosts把主机名和 IP 绑死 sudo tee -a /etc/hosts EOF 192.168.10.100 hadoop-master 192.168.10.101 hadoop-slave1 192.168.10.102 hadoop-slave2 EOF逻辑说明/etc/hosts是本地 DNSHadoop 配置里写主机名而不是 IP靠的就是这个文件解析。多节点时每台机器的 hosts 都要包含全部节点否则 DataNode 找不到 NameNode。验证方式ping hadoop-master能通、hostname返回设定值这两条过了再往下走。提示改完主机名要重新登录终端否则 shell 提示符还是旧的容易误判。3. SSH 免密登录从密钥生成到 authorized_keys 权限3.1 免密登录在 Hadoop 里到底解决什么Hadoop 的启动脚本start-dfs.sh、start-yarn.sh会在本机通过 SSH 去拉起各个节点上的守护进程。如果不配免密每启动一个节点就要输一次密码多节点时基本没法用。免密登录的本质是本机生成一对密钥把公钥追加到目标机器的~/.ssh/authorized_keys之后 SSH 用私钥完成认证不再走密码。教程里这一步配的是本机对自己的免密伪分布式必需全分布式还要把公钥分发到所有从节点。3.2 生成密钥并分发的完整命令先确认 SSH 服务已装并运行sudo apt update sudo apt install -y openssh-server openssh-client sudo systemctl enable --now ssh sudo systemctl status ssh # 看到 active (running) 才算好生成密钥对一路回车用默认路径即可ssh-keygen -t rsa -b 4096 -P -f ~/.ssh/id_rsa # -t rsa 指定算法-b 4096 指定长度-P 表示空密码短语把公钥写入授权文件并修正权限cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys验证免密是否生效ssh hadoop-master # 第一次会问 yes/no输入 yes 后应该直接进 shell不再要密码 exit参数与坑点说明chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys这两条是血泪经验——权限过松比如 777SSH 会直接拒绝使用密钥报Authentication refused: bad ownership or modes。多节点分发公钥用ssh-copy-id hadoop-slave1 ssh-copy-id hadoop-slave2ssh-copy-id会自动处理权限比手动 scp 再 cat 稳。验证多节点免密ssh hadoop-slave1 hostname能返回从节点主机名就说明通了。注意如果之前用密码登录过~/.ssh/known_hosts里可能残留旧指纹重装系统后 SSH 会报 host key 冲突删掉对应行或整个文件即可。4. 共享文件夹与 JDK 环境挂载失败和 JAVA_HOME 的连锁反应4.1 VMware 共享文件夹挂载的两种方式共享文件夹的作用是把宿主机上的安装包、数据集直接给虚拟机用省去反复 scp。VMware 需要在虚拟机设置里先启用“共享文件夹”指定宿主机目录。挂载方式有两种一是装open-vm-tools后自动挂到/mnt/hgfs/二是手动用vmhgfs-fuse挂载。自动挂载有时不生效手动方式更可控sudo apt install -y open-vm-tools open-vm-tools-desktop sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000 ls /mnt/hgfs # 应该能看到宿主机共享出来的目录名参数说明-o allow_other让非 root 用户也能访问-o uid1000把文件属主映射到你的普通用户用id -u确认自己的 uid。如果ls为空先检查 VMware 里共享文件夹是否真的启用了再看vmware-hgfsclient命令能否列出共享名。想开机自动挂载把挂载命令写进/etc/fstab.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid1000,defaults 0 04.2 JDK 安装与环境变量配置Hadoop 3.x 要求 JDK 8 或 11别用太新的版本否则会遇到模块化相关的反射报错。安装 OpenJDKsudo apt install -y openjdk-8-jdk java -version # 确认输出 1.8.x找到 JDK 安装路径配置环境变量。Ubuntu 下改/etc/profile对所有用户生效readlink -f $(which java) # 输出类似 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java # 那么 JAVA_HOME 就是 /usr/lib/jvm/java-8-openjdk-amd64sudo tee -a /etc/profile EOF export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export HADOOP_HOME/opt/hadoop export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin EOF source /etc/profile echo $JAVA_HOME # 验证变量已生效逻辑说明JAVA_HOME要指向 JDK 根目录不是bin目录这是最常见的翻车点——写成.../bin后 Hadoop 启动时报JAVA_HOME is not set。HADOOP_HOME指向 Hadoop 解压目录PATH里加上bin和sbin才能在任意目录敲hadoop、start-dfs.sh。验证java -version和echo $JAVA_HOME都对再继续装 Hadoop。提示/etc/profile只在登录 shell 生效如果你用的是非登录 shell改~/.bashrc更保险两者都写也不冲突。5. Hadoop 安装与配置core-site、hdfs-site、mapred-site、yarn-site 四件套5.1 解压安装与目录规划从共享文件夹或官网拿到 Hadoop 压缩包后解压到/optsudo tar -zxvf hadoop-3.x.x.tar.gz -C /opt/ sudo mv /opt/hadoop-3.x.x /opt/hadoop sudo chown -R $USER:$USER /opt/hadoopchown这步别省否则后面格式化 NameNode 时权限不够。Hadoop 的配置文件全在$HADOOP_HOME/etc/hadoop/下核心是四个 XMLcore-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。伪分布式下这四个文件都要改全分布式还要加workers文件。5.2 四个核心配置文件的参数含义core-site.xml定义 HDFS 的默认访问地址和临时目录configuration property namefs.defaultFS/name valuehdfs://hadoop-master:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/tmp/value /property /configurationfs.defaultFS里的主机名要和/etc/hosts一致端口 9000 是 NameNode 的 RPC 端口。hadoop.tmp.dir是 Hadoop 的临时数据目录默认在/tmp下重启系统可能被清空导致集群数据丢失所以显式指到/opt/hadoop/tmp。hdfs-site.xml定义副本数和 NameNode/DataNode 数据目录configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///opt/hadoop/data/datanode/value /property /configuration伪分布式只有一台机器dfs.replication必须设成 1设成 3 会一直报副本不足。全分布式按实际从节点数设通常 3。mapred-site.xml指定 MapReduce 跑在 YARN 上configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationyarn-site.xml配置 ResourceManager 和 NodeManagerconfiguration property nameyarn.resourcemanager.hostname/name valuehadoop-master/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configurationyarn.nodemanager.aux-services必须是mapreduce_shuffle写错会导致 MapReduce 任务卡在 shuffle 阶段。5.3 格式化与启动验证配置改完后先格式化 NameNode只能执行一次hdfs namenode -format # 看到 successfully formatted 才算成功启动 HDFS 和 YARNstart-dfs.sh start-yarn.sh jps # 应该看到 NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManagerjps是验证集群是否起来的最快方式缺哪个进程就去对应日志里找原因日志在$HADOOP_HOME/logs/下。Web UI 也能验证NameNode 在http://hadoop-master:9870YARN 在http://hadoop-master:8088。能打开页面、jps进程齐全集群就算通了。注意hdfs namenode -format会清空 NameNode 元数据集群里已有数据时千万别重复执行这是不可逆操作。6. 避坑与排查五个让集群起不来的高频问题6.1 现象start-dfs.sh报JAVA_HOME is not set原因Hadoop 的启动脚本读的是$HADOOP_HOME/etc/hadoop/hadoop-env.sh里的JAVA_HOME而不是系统环境变量。系统里配了不代表 Hadoop 能读到。解决编辑hadoop-env.sh显式写死export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd646.2 现象DataNode 启动后立刻消失jps里没有原因多次执行hdfs namenode -format导致 NameNode 的 clusterID 和 DataNode 的 clusterID 不一致DataNode 拒绝注册。解决停掉集群删掉 NameNode 和 DataNode 的数据目录重新格式化一次之后别再重复格式化stop-dfs.sh rm -rf /opt/hadoop/data/namenode/* /opt/hadoop/data/datanode/* hdfs namenode -format start-dfs.sh6.3 现象SSH 免密配了但还是要密码原因~/.ssh或authorized_keys权限过松或者公钥追加到了错误的用户目录下比如用 root 生成却配到普通用户。解决确认当前用户重设权限whoami chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys6.4 现象共享文件夹/mnt/hgfs为空原因VMware 里没启用共享文件夹或open-vm-tools没装全或挂载时没加allow_other。解决先在虚拟机设置里确认共享目录已添加再重装工具并手动挂载sudo apt install --reinstall -y open-vm-tools open-vm-tools-desktop vmware-hgfsclient # 能列出共享名说明宿主机侧没问题 sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid$(id -u)6.5 现象Web UI 打不开但jps进程都在原因防火墙拦了 9870、8088 端口或者浏览器访问的是宿主机而虚拟机的 IP 宿主机访问不到。解决Ubuntu 侧放行端口或临时关掉 ufw 验证sudo ufw status sudo ufw allow 9870/tcp sudo ufw allow 8088/tcp宿主机侧确认能 ping 通虚拟机 IPNAT 模式下宿主机访问虚拟机一般没问题反过来才需要端口转发。7. 用配套源码验证集群InvertedIndex 与 SecondarySort 的提交技巧集群起来只是第一步能不能跑通一个真实 Job 才算数。这份资源里带了四个实验源码InvertedIndex倒排索引、MatrixMultiply矩阵乘法、Dijkstra单源最短路径、SecondarySort二次排序都是 Hadoop 课程设计的经典题目。拿 InvertedIndex 举例验证流程是这样的先把输入数据传到 HDFS再提交 Job最后看输出。# 在 HDFS 上建输入目录并上传本地数据 hdfs dfs -mkdir -p /user/$USER/invertedindex/input hdfs dfs -put ./data/*.txt /user/$USER/invertedindex/input/ hdfs dfs -ls /user/$USER/invertedindex/input/ # 打包并提交 Job假设已用 Maven 打成 jar hadoop jar InvertedIndex.jar com.hadoop.InvertedIndexDriver \ /user/$USER/invertedindex/input \ /user/$USER/invertedindex/output # 查看输出 hdfs dfs -cat /user/$USER/invertedindex/output/part-r-00000 | head参数说明第一个路径是 HDFS 输入目录第二个是输出目录输出目录必须不存在否则 Job 直接报Output directory already exists这是新手最常撞的墙重跑前先hdfs dfs -rm -r删掉。SecondarySort 的坑在自定义Partitioner和GroupingComparator——如果分组比较器写错同一个 key 的数据会被拆到不同 reduce结果就不对。验证方法是拿小数据集手动算一遍预期输出和part-r-00000对比。我自己的习惯是每配完一个环节就立刻验证一次网络通了 ping 一下免密配了 ssh 一下JDK 配了 java -version 一下绝不攒到最后一起测。因为 Hadoop 的报错经常是连锁的前面一个环境变量错了后面能给你报出七八个不相干的异常逐个验证能把问题锁死在最小范围。从那以后我每次搭集群都强制走一遍“网络 → 免密 → JDK → 格式化 → jps → Web UI → 跑 Job”这条链路任何一环不过就不往下走。希望这套流程和配套源码能帮你少熬几个夜。本文还有配套的精品资源点击获取