简介这份资源面向大数据入门者与高校学生提供在Ubuntu系统上从零搭建Hadoop分布式环境的完整教程覆盖虚拟机安装、SSH免密登录、共享文件夹挂载、JDK环境配置、Hadoop安装与参数调优、环境变量设置等关键环节帮助读者构建可运行的大数据处理平台。压缩包共93个文件约222.16MB包含xml配置文件、class与java源码、png操作截图、txt说明、docx与doc实验报告、jar依赖包及iml工程文件等并附赠Cloud-Computing-course-design-master课程设计项目内含倒排索引、矩阵乘法、Dijkstra、SecondarySort等实验案例与数据。已有112人学习下载。教程按步骤拆解集群搭建流程配有截图与实验报告便于对照操作、理解HDFS使用与节点通信原理同时提供常见问题与解决方案适合初学者跟做也可供有经验开发者查漏补缺。1. 从一台空虚拟机到能跑 MapReduce 的 Hadoop 平台这套 Ubuntu 搭建流程到底解决什么很多人第一次接触大数据卡住的地方不是 MapReduce 编程也不是 HDFS 原理而是环境本身。你手上只有一台刚装好的 Ubuntu 虚拟机想把它变成能提交作业的 Hadoop 分布式环境中间横着五道坎虚拟机网络通不通、SSH 免密登录配没配好、宿主机和虚拟机之间怎么传文件、JDK 装没装对、Hadoop 的配置文件改没改对。任何一道坎没过后面全是报错。这套「Ubuntu 虚拟机 SSH 免密 共享文件夹 JDK Hadoop」的搭建流程本质上是在一台机器上模拟出一个最小可用的分布式环境。它适合三类人一是大数据课程设计要交作业的学生二是想在自己电脑上跑通 Hadoop 伪分布式或三节点集群的开发者三是需要一套可复现环境来做 HDFS 读写、MapReduce 调试的工程师。你不需要买服务器一台 16G 内存的笔记本就够。我见过太多人在这上面翻车JDK 装成了系统自带的 OpenJDK 却不知道 JAVA_HOME 指向哪SSH 免密登录只配了单向共享文件夹挂载完重启就失效。这篇笔记按真实搭建顺序走一遍每一步都给出可抄的命令和参数把踩过的坑标出来。2. 虚拟机与 Ubuntu 底座网络模式、共享文件夹和第一道环境检查2.1 虚拟机安装 Ubuntu 22.04 的选型与网络模式虚拟机软件常见的是 VMware Workstation 和 VirtualBox。我一般用 VMware因为共享文件夹挂载在 Linux 下更省事。Ubuntu 版本选 22.04 LTS长期支持到 2027 年软件源稳定Hadoop 3.x 在这上面跑没有兼容性问题。内存分配建议不低于 4G硬盘不低于 40G因为后面要装 JDK、Hadoop还要留 HDFS 的存储空间。网络模式是第一个容易翻车的地方。VMware 有三种常用模式模式虚拟机 IP宿主机能否访问适用场景NAT由 VMware 分配能但需端口转发单机学习不想动路由器桥接和宿主机同网段能直接访问多机集群模拟需要固定 IP仅主机仅宿主机可见能纯本地实验不联外网做 Hadoop 伪分布式NAT 就够。但如果后面要扩成三节点集群建议一开始就用桥接给每台虚拟机分配同网段固定 IP省得后面改配置。我吃过这个亏先用 NAT 搭好后来加节点时网络不通回头改网络模式SSH 的 known_hosts 全乱了。安装完 Ubuntu 后先做三件事更新源、装 SSH 服务、确认网络通。# 更新软件源Ubuntu 22.04 默认源就够用 sudo apt update sudo apt upgrade -y # 安装 SSH 服务端后面免密登录和集群通信都靠它 sudo apt install -y openssh-server # 查看 SSH 服务状态确认 running sudo systemctl status ssh # 查看本机 IP记下来后面配 hosts 要用 ip addr showapt update刷新包索引apt upgrade升级已装包。openssh-server是 SSH 服务端不装的话宿主机连不上虚拟机。ip addr show看的是 ens33 或 ens160 这类网卡的 inet 地址记下这个 IP后面配置 host 映射和免密登录都要用。2.2 共享文件夹挂载宿主机和虚拟机之间的文件通道共享文件夹的作用是让宿主机和虚拟机之间传 JDK、Hadoop 安装包不用来回插 U 盘或搭 FTP。VMware 的做法是先在虚拟机设置里启用共享文件夹指定宿主机的一个目录然后在 Ubuntu 里挂载。# 安装 VMware Tools 的共享文件夹支持组件 sudo apt install -y open-vm-tools open-vm-tools-desktop # 创建挂载点 sudo mkdir -p /mnt/hgfs # 手动挂载共享文件夹share_name 换成你在 VMware 里设的名字 sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other # 查看是否挂载成功 ls /mnt/hgfsopen-vm-tools是 VMware 官方推荐的开源工具集比手动装 VMware Tools 省事。vmhgfs-fuse是挂载共享文件夹的命令allow_other让普通用户也能访问。挂载完ls /mnt/hgfs应该能看到你共享的目录名。这里有个血泪经验手动挂载重启后会失效。要持久化得写进/etc/fstab# 编辑 fstab加一行 echo .host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0 | sudo tee -a /etc/fstab # 测试 fstab 配置是否正确不报错说明没问题 sudo mount -afuse.vmhgfs-fuse是文件系统类型allow_other允许非 root 用户访问defaults用默认挂载选项。mount -a会重新挂载 fstab 里所有条目如果这步报错说明 fstab 写错了赶紧改不然重启后系统可能进不去。注意如果ls /mnt/hgfs是空的先确认 VMware 里共享文件夹是否启用再确认open-vm-tools是否装好。两者缺一不可。2.3 配置 host 映射与 SSH 免密登录Hadoop 集群里节点之间靠主机名通信所以先要把主机名和 IP 的映射写进/etc/hosts。伪分布式至少配一个主机名三节点集群要配三个。# 查看当前主机名 hostname # 编辑 hosts 文件把主机名和 IP 对应上 sudo tee -a /etc/hosts EOF 192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2 EOF # 测试主机名解析 ping -c 2 master/etc/hosts是本地 DNS 解析文件优先级高于外部 DNS。tee -a是追加写入不会覆盖原有内容。ping master能通说明映射生效。接下来是 SSH 免密登录。Hadoop 的启动脚本依赖 SSH 在节点间执行命令不配免密的话每次启动都要输密码集群根本跑不起来。# 生成密钥对一路回车不设密码 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 把公钥追加到授权文件 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 设置权限权限不对免密会失效 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # 测试免密登录本机 ssh localhostssh-keygen -t rsa生成 RSA 密钥对-P 表示空密码-f指定密钥文件路径。authorized_keys存放允许登录的公钥。权限必须是 700 和 600SSH 对权限检查很严格权限太开放会拒绝免密。如果是多节点还要把公钥分发到其他节点# 把公钥复制到 slave1 和 slave2 ssh-copy-id slave1 ssh-copy-id slave2 # 测试从 master 免密登录 slave1 ssh slave1ssh-copy-id会自动把公钥写到目标节点的authorized_keys里。执行时需要输一次目标节点的密码之后就免密了。提示免密登录配完后ssh localhost如果还要输密码先检查~/.ssh和authorized_keys的权限再看/etc/ssh/sshd_config里PubkeyAuthentication是不是 yes。3. JDK 环境配置为什么系统自带的 OpenJDK 经常不够用3.1 JDK 版本选择与安装路径规划Hadoop 3.x 官方推荐 JDK 8虽然 JDK 11 也能跑但有些组件兼容性不好。Ubuntu 22.04 默认源里的 OpenJDK 版本是 11 和 17直接apt install openjdk-8-jdk可能找不到包。我一般去下载 Oracle JDK 8 或者用 Adoptium 的 Temurin 8手动解压到/usr/local/下。# 创建 JDK 安装目录 sudo mkdir -p /usr/local/java # 假设 JDK 压缩包已经通过共享文件夹传到 /mnt/hgfs # 解压到安装目录 sudo tar -zxvf /mnt/hgfs/share/jdk-8u381-linux-x64.tar.gz -C /usr/local/java/ # 查看解压后的目录名 ls /usr/local/java/tar -zxvf解压 tar.gz 包-C指定解压目标目录。解压后目录名类似jdk1.8.0_381记下这个路径配环境变量要用。3.2 环境变量设置JAVA_HOME 和 PATH 的正确写法环境变量配错是新手最常见的翻车点。有人改/etc/profile有人改~/.bashrc有人改/etc/environment改完还不 source然后抱怨 java 命令找不到。我一般改/etc/profile.d/下新建一个脚本这样对所有用户生效而且不会污染系统主配置文件。# 新建 JDK 环境变量脚本 sudo tee /etc/profile.d/java.sh EOF export JAVA_HOME/usr/local/java/jdk1.8.0_381 export JRE_HOME\$JAVA_HOME/jre export CLASSPATH.:\$JAVA_HOME/lib:\$JRE_HOME/lib export PATH\$JAVA_HOME/bin:\$PATH EOF # 赋予执行权限 sudo chmod x /etc/profile.d/java.sh # 立即生效 source /etc/profile.d/java.sh # 验证 java -version echo $JAVA_HOMEJAVA_HOME指向 JDK 根目录很多大数据组件靠这个变量找 Java。CLASSPATH里.表示当前目录$JAVA_HOME/lib是 JDK 类库。PATH把$JAVA_HOME/bin加进去这样java、javac命令才能直接用。source让配置在当前 shell 立即生效不用重启。java -version输出应该是java version 1.8.0_381如果输出的是 OpenJDK 11说明系统里还有别的 Java 优先级更高检查which java看指向哪。注意/etc/profile.d/下的脚本在登录时自动执行但如果你用su切换用户可能不会加载。建议用su -加横杠模拟完整登录。3.3 验证 JDK 与常见环境变量错误排查配完环境变量做三个检查# 检查 java 命令路径 which java # 检查 JAVA_HOME 是否为空 echo $JAVA_HOME # 编译一个测试类 cat Test.java EOF public class Test { public static void main(String[] args) { System.out.println(JDK OK); } } EOF javac Test.java java Testwhich java应该输出/usr/local/java/jdk1.8.0_381/bin/java。如果输出/usr/bin/java说明 PATH 顺序不对系统自带的 Java 排在前面。javac Test.java java Test能输出JDK OK说明编译和运行都正常。常见错误JAVA_HOME配了但echo $JAVA_HOME是空的原因是没有source或者脚本没有执行权限。java -version报Error: could not open ...通常是CLASSPATH配错把$JAVA_HOME/lib写成了具体 jar 包路径。4. Hadoop 安装与配置从伪分布式到三节点集群的配置文件逐项拆解4.1 Hadoop 安装包解压与目录结构Hadoop 下载去官网拿 3.3.x 稳定版别用 2.x很多新特性不支持。安装包通过共享文件夹传到虚拟机解压到/usr/local/。# 解压 Hadoop sudo tar -zxvf /mnt/hgfs/share/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 # 查看目录结构 ls /usr/local/hadoop/Hadoop 目录下几个关键子目录bin放常用命令sbin放启动脚本etc/hadoop放配置文件share放 jar 包和文档。chown把目录所有者改成当前用户不然普通用户没权限写日志和临时文件。4.2 五个核心配置文件core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workersHadoop 的配置全在etc/hadoop/下。伪分布式需要改五个文件三节点集群改的内容更多。core-site.xml配 HDFS 的默认文件系统和临时目录。configuration property namefs.defaultFS/name valuehdfs://master:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationfs.defaultFS指定 NameNode 的地址和端口伪分布式写hdfs://localhost:9000集群写hdfs://master:9000。hadoop.tmp.dir是 Hadoop 临时目录默认在/tmp下重启会丢必须改成持久化路径。hdfs-site.xml配副本数和 NameNode/DataNode 数据目录。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///usr/local/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///usr/local/hadoop/data/datanode/value /property /configurationdfs.replication是副本数伪分布式只能写 1集群写 3。dfs.namenode.name.dir和dfs.datanode.data.dir分别指定 NameNode 和 DataNode 的数据存储路径不配的话默认在临时目录重启丢数据。mapred-site.xml指定 MapReduce 运行框架。configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationmapreduce.framework.name设成yarn让 MapReduce 跑在 YARN 上。设成local就是本地模式不走集群。yarn-site.xml配 ResourceManager 和 NodeManager。configuration property nameyarn.resourcemanager.hostname/name valuemaster/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configurationyarn.resourcemanager.hostname指定 ResourceManager 所在节点。yarn.nodemanager.aux-services必须配mapreduce_shuffle不然 MapReduce 作业跑不起来。workers指定 DataNode 和 NodeManager 节点列表。master slave1 slave2伪分布式只写localhost三节点写三个主机名。这个文件在 Hadoop 3.x 里叫workers2.x 叫slaves。4.3 环境变量与格式化HADOOP_HOME 和 namenode formatHadoop 也需要配环境变量和 JDK 类似。# 新建 Hadoop 环境变量脚本 sudo tee /etc/profile.d/hadoop.sh EOF export HADOOP_HOME/usr/local/hadoop export HADOOP_CONF_DIR\$HADOOP_HOME/etc/hadoop export PATH\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:\$PATH EOF sudo chmod x /etc/profile.d/hadoop.sh source /etc/profile.d/hadoop.sh # 验证 hadoop versionHADOOP_HOME指向 Hadoop 根目录HADOOP_CONF_DIR指向配置文件目录PATH把bin和sbin加进去。hadoop version能输出版本号说明配好了。格式化 NameNode 是启动前的最后一步只做一次重复格式化会导致 DataNode 的 clusterID 和 NameNode 不一致集群起不来。# 格式化 NameNode hdfs namenode -format # 启动 HDFS start-dfs.sh # 启动 YARN start-yarn.sh # 查看进程 jpshdfs namenode -format初始化 NameNode 的元数据。start-dfs.sh启动 NameNode、DataNode、SecondaryNameNode。start-yarn.sh启动 ResourceManager 和 NodeManager。jps应该看到 5 个进程NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager。提示如果jps少了某个进程去logs目录看对应日志。DataNode 起不来最常见的原因是重复格式化导致 clusterID 不匹配删掉data目录重新格式化即可。5. 避坑与排查搭建过程中最容易翻车的五个地方5.1 SSH 免密登录配了但还是要输密码现象ssh localhost仍然提示输入密码免密没生效。原因~/.ssh或authorized_keys权限不对SSH 出于安全考虑拒绝使用权限过开放的文件。或者/etc/ssh/sshd_config里PubkeyAuthentication被设成 no。解决chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys检查sshd_config里PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys改完sudo systemctl restart ssh。5.2 共享文件夹挂载后重启失效现象重启虚拟机后/mnt/hgfs是空的共享文件夹不见了。原因vmhgfs-fuse手动挂载只在当前会话有效重启后不会自动挂载。解决写进/etc/fstab加一行.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0然后sudo mount -a测试。如果mount -a报错说明 fstab 写错了赶紧改不然重启后系统可能进不去。5.3 JAVA_HOME 配了但 Hadoop 找不到 Java现象start-dfs.sh报JAVA_HOME is not set或Error: JAVA_HOME is incorrectly set。原因Hadoop 的启动脚本读的是etc/hadoop/hadoop-env.sh里的JAVA_HOME不是系统环境变量。系统环境变量配了但hadoop-env.sh里没配或者配的路径不对。解决编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh找到export JAVA_HOME那一行改成export JAVA_HOME/usr/local/java/jdk1.8.0_381。注意不要用$JAVA_HOME引用直接写绝对路径因为这个脚本执行时系统环境变量可能还没加载。5.4 NameNode 格式化后 DataNode 起不来现象jps只看到 NameNode没有 DataNode。DataNode 日志报java.io.IOException: Incompatible clusterIDs。原因重复执行了hdfs namenode -formatNameNode 的 clusterID 变了DataNode 的 clusterID 还是旧的两者不匹配。解决删掉 NameNode 和 DataNode 的数据目录重新格式化。rm -rf /usr/local/hadoop/data/namenode/* /usr/local/hadoop/data/datanode/*然后hdfs namenode -format再start-dfs.sh。注意格式化只能做一次做之前确认数据目录是空的。5.5 虚拟机内存不足导致 YARN 容器被 kill现象MapReduce 作业提交后卡住YARN 日志报Container killed on request. Exit code is 137。原因虚拟机内存分配太小YARN 默认的容器内存和虚拟机实际内存不匹配NodeManager 可用内存不足容器被系统 OOM killer 杀掉。解决在yarn-site.xml里调小容器内存加两个配置yarn.nodemanager.resource.memory-mb设成 2048yarn.scheduler.maximum-allocation-mb设成 2048。同时确认虚拟机内存不低于 4G。改完重启 YARN。6. 验证集群可用性跑一个 WordCount 并看懂输出环境搭完不算完得跑一个真实作业验证。WordCount 是 Hadoop 的 Hello World能跑通说明 HDFS、YARN、MapReduce 全链路没问题。# 在 HDFS 上创建输入目录 hdfs dfs -mkdir -p /user/$USER/wordcount/input # 准备一个测试文本通过共享文件夹传进去 echo hello hadoop hello world /mnt/hgfs/share/test.txt echo hadoop mapreduce yarn /mnt/hgfs/share/test.txt # 上传到 HDFS hdfs dfs -put /mnt/hgfs/share/test.txt /user/$USER/wordcount/input/ # 确认文件在 HDFS 上 hdfs dfs -ls /user/$USER/wordcount/input/ # 提交 WordCount 作业 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/$USER/wordcount/input /user/$USER/wordcount/output # 查看输出 hdfs dfs -cat /user/$USER/wordcount/output/part-r-00000hdfs dfs -mkdir -p递归创建目录。hdfs dfs -put把本地文件上传到 HDFS。hadoop jar提交作业第一个参数是 jar 包路径第二个是主类名后面是输入和输出路径。输出目录不能预先存在否则作业会报Output directory already exists。hdfs dfs -cat查看结果应该输出每个单词和出现次数。如果作业卡在map 0% reduce 0%去 YARN 的 Web UI 看默认地址是http://master:8088看作业的日志和容器状态。验证完可以再做一个 HDFS 读写测试# 创建测试目录 hdfs dfs -mkdir -p /user/$USER/test # 写入文件 echo hdfs write test | hdfs dfs -put - /user/$USER/test/write.txt # 读取文件 hdfs dfs -cat /user/$USER/test/write.txt # 查看副本数 hdfs fsck /user/$USER/test/write.txt -files -blockshdfs dfs -put -从标准输入读取数据写入 HDFS。hdfs fsck检查文件块状态和副本数伪分布式副本数是 1集群是 3。我自己的习惯是每次搭完环境先跑一遍 WordCount再跑一遍 HDFS 读写两个都过了才认为环境稳定。这套流程我用了很多次从 Ubuntu 18.04 到 22.04从 Hadoop 2.7 到 3.3核心步骤没变过变的只是版本号和个别配置项。把这份笔记存下来下次换机器直接照着走能省掉大量查日志的时间。希望帮到你。本文还有配套的精品资源点击获取