资讯详情

资讯详情

Ubuntu下Hadoop分布式环境搭建:从虚拟机到SSH免密与JDK配置全指南

简介面向需要在Ubuntu环境下从零搭建Hadoop分布式平台的高校学生、课程设计人员及大数据入门开发者按虚拟机安装、SSH免密登录、共享文件夹挂载、JDK配置、Hadoop安装与参数配置、环境变量设置等步骤给出完整操作流程并配有实验报告与课程设计案例。资源共93个文件包含docx/doc实验文档、java源代码、txt说明、png截图、jar依赖包及class编译文件等压缩包约222.16MB。其中Cloud-Computing-course-design-master项目涵盖倒排索引、矩阵相乘、Dijkstra、SecondarySort等MapReduce典型实验可作为云计算课程设计直接参考。整体以图文文档加代码工程形式呈现步骤清晰已有112人学习下载适合需要完整部署参考与实验案例的用户。1. Hadoop分布式环境搭建为什么总是卡在半路在Ubuntu上搭建Hadoop分布式环境真正的难点从来不是Hadoop本身而是前面那一串“看似无关”的准备工作虚拟机装好了SSH免密没配通启动集群时脚本卡在密码输入上JDK装好了环境变量路径写错Hadoop进程起来就说找不到JavaNameNode格式化了两次DataNode和NameNode的clusterID对不上整个集群直接起不来。这份资源包里最值钱的地方就是把“虚拟机安装→SSH免密登录→共享文件夹挂载→JDK配置→Hadoop安装与环境变量设置”这条完整链路按步骤拆开了每一步给到具体操作和参数而不是只给一个“装好就行”的结论。适合正在做云计算课程设计、第一次在实验室搭大数据平台、或者想把伪分布式集群升级成多节点集群的人。跟着这套流程走能把“玄学”变成可以复现的操作。2. 虚拟机安装与系统准备把内存、磁盘和网卡模式先定死2.1 创建虚拟机时的关键参数内存、磁盘、网络模式的选择Hadoop环境搭建的第一步是准备一台干净的Ubuntu虚拟机。大多数人在这一阶段容易犯的错是拿默认参数一路点下一步结果虚拟机磁盘只有20GB跑几个MapReduce任务就提示No space left on device内存只分了1GBHDFS一启动就OOM网络模式没想清楚后面三台虚拟机之间根本ping不通。我一般建议在VMware里选择“稍后安装操作系统”不要选“快速安装”。快速安装虽然省事但是自动创建的用户名、分区方案和主机名都是默认的后面改起来反而麻烦。系统版本优先选Ubuntu 20.04 LTS或22.04 LTS这两个版本的glibc版本和Hadoop 3.x兼容性比较稳没必要追Ubuntu 24.04。创建虚拟机时这几个参数建议直接定死配置项推荐值影响内存4GB以上最低2GB低于2GB时HDFS YARN同时启动极易内存溢出不适用于生产CPU2核以上单核跑MapReduce任务时间明显过长调试排队磁盘40GB以上20GB默认尺寸在HDFS存三份副本后会迅速占满网络模式单机伪分布式选NAT跨物理机集群选桥接NAT下同一台物理机内的虚拟机天然互通桥接则依赖局域网拓扑操作系统类型Ubuntu 64-bit32位系统无法正常跑Hadoop 3.x这里要说明网络模式的选择逻辑。大部分课程设计场景是在一台物理机上开三台虚拟机做伪分布式或小集群测试VMware的NAT模式会自动分配一个虚拟网段同一台宿主机上的虚拟机默认就在这个网段里互相之间直接用IP就能通信。如果你和室友的电脑各开了一台虚拟机想组成集群那就得用桥接模式并保证两台物理机在同一局域网这个在实际实验室里经常翻车建议提前用ping验证。装完系统后记得先跑一下这三条命令确认基线状态free -h nproc df -h /free -h看内存是否达到预期nproc看核数df -h看磁盘空间。很多Hadoop启动失败其实不是配置问题而是这三项本身就不达标后面排查会非常痛苦。2.2 安装Ubuntu、创建专用用户并固定主机名Ubuntu安装流程中有一个容易被忽略的选项软件更新那一屏建议勾选“Install OpenSSH Server”。如果安装时漏了system之后也能补装但要额外花时间。安装过程中创建的用户名建议直接用hadoop不要用root跑Hadoop。装好后第一件事是固定主机名。Hadoop的启动脚本依赖/etc/hosts里的主机名解析主机名变了或者hosts里没写全启动时就会报UnknownHostException。sudo hostnamectl set-hostname master echo 192.168.152.100 master | sudo tee -a /etc/hosts echo 192.168.152.101 slave1 | sudo tee -a /etc/hosts echo 192.168.152.102 slave2 | sudo tee -a /etc/hostshostnamectl set-hostname是Ubuntu 18.04以后的标准改主机名方式不用再手动改/etc/hostname。192.168.152.x是VMware NAT模式的默认子网不同版本可能有差异实际IP用ip addr查一下再填不要直接照抄。hosts里写主机名映射是为了启动脚本能在master节点上用主机名访问slave节点只写IP反而会导致YARN的ResourceManager无法解析节点名。2.3 系统更新与快照给自己留一张后悔药基础系统配置完成后建议先做一次系统更新再继续搭环境sudo apt update sudo apt upgrade -y有人会问这一步能不能跳过。能跳但后续安装open-vm-tools或openssh-server时如果apt源列表是旧的可能出现依赖解析失败。更新一次成本很低别在这种地方赌运气。更新完后的操作才是关键在VMware里给这台刚装好的虚拟机拍一张快照。方法很简单VMware菜单栏“虚拟机”-“快照”-“拍摄快照”命名base_02描述里写上“Ubuntu刚装好未配置SSH/JDK/Hadoop”。提示快照不是备份它是回滚点。后面配置SSH、JDK、Hadoop时任何一步改坏了直接回滚到base_02比重新装一遍系统快得多。我给人做课程设计辅导时每次开新环境都会强制先拍快照避免学生把系统搞到半死不活的状态然后无从下手。3. SSH免密登录与共享文件夹挂载集群节点间打通互信3.1 为什么SSH免密登录是Hadoop集群的硬性要求Hadoop的start-dfs.sh和start-yarn.sh脚本启动时会通过SSH从master节点逐个连接所有slave节点执行远程启动命令。如果每次连接都要交互式输入密码脚本就会卡在那里集群自然起不来。所以SSH免密不是“方便一点”的问题而是分布式集群能否正常启动的前提。很多人在这一步的误区是只在master节点上测试ssh localhost通了就以为配置完成了。实际上master还需要能免密登录到每一台slave节点反过来slave节点通常不需要登录master但需要在格式化时保证name目录和data目录的clusterID一致。伪分布式环境下至少要让hadoop用户对localhost免密否则连单机集群都启动不了。3.2 生成密钥对并使用ssh-copy-id分发公钥配置SSH免密的标准流程是在master节点生成密钥对然后把公钥追加到所有节点的authorized_keys文件中。手动scp公钥容易拼错路径直接用ssh-copy-id最稳# 在master节点上先生成SSH密钥对-N 表示空口令 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N # 将master的公钥分发到master自身和所有slave节点 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoopmaster ssh-copy-id -i ~/.ssh/id_rsa.pub hadoopslave1 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoopslave2 # 验证能免密打印日期说明配置成功 ssh master date ssh slave1 date ssh slave2 date-N 这一步非常重要。如果你不指定空口令ssh-keygen会交互式要求输入两次passphrase一旦设置了passphraseHadoop的daemon进程在后台启动时无法输入口令导致免密配置“看着配了但实际没用”。-b 4096指定密钥长度比默认的2048更安全同时不影响Hadoop侧的使用。ssh-copy-id会自动把公钥追加到目标机器的~/.ssh/authorized_keys并设置正确的权限。它会第一次要求输入密码用于建立初始连接之后就不需要了。验证时如果某个节点挂了或IP填错会在这里直接暴露出来比启动Hadoop时再发现要省事得多。3.3 SSH目录与文件权限的硬性要求如果你因为某些原因不能使用ssh-copy-id需要手动复制公钥那就必须手动处理权限。SSH对~/.ssh目录和authorized_keys文件的权限有一套强制要求权限过宽会导致SSH直接忽略你的公钥。chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 644 ~/.ssh/id_rsa.pub chmod 600 ~/.ssh/id_rsa chmod go-w ~第一条chmod 700 ~/.ssh保证只有当前用户能进入该目录第二条chmod 600 ~/.ssh/authorized_keys防止其他用户修改授权文件最后一条chmod go-w ~是去掉用户主目录的组写权限很多SSH免密失效问题就出在这里。如果home目录权限是755即使密钥文件权限正确SSH也会因为“主目录可被他人写”而拒绝使用公钥认证。判断问题方向时用ssh -vvv master日志会明确告诉你认证是卡在权限检查还是卡在密码认证比盲猜快得多。3.4 配置共享文件夹挂载让宿主机数据直达虚拟机共享文件夹是课程设计里最实用的功能之一。实验中经常需要在Windows宿主机和Ubuntu虚拟机之间传递数据集、jar包或作业代码与其每次都用U盘拷不如直接挂载VMware共享目录。先在VMware菜单栏“虚拟机”-“设置”-“选项”-“共享文件夹”选择“总是启用”添加一个本地文件夹比如D:\hadoop-data。然后在虚拟机内部安装VMware Tools并用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 uid$(id -u) ls /mnt/hgfsopen-vm-tools-desktop是带GUI支持的版本纯Server版装open-vm-tools就够了。挂载参数uid$(id -u)的意思是让挂载目录归属当前登录用户如果不加这个参数目录会以root身份挂载普通用户只能看到空目录或报Permission denied。要让挂载在重启后依然生效把下面这行写进/etc/fstab.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,uid1000,gid1000,umask022 0 0uid、gid填你自己的用户ID用id hadoop命令查看。写入fstab后建议先手动执行一次sudo mount -a测试不要直接重启否则fstab写错会导致系统无法正常启动。挂载成功后/mnt/hgfs/input里的数据就可以直接用来作为HDFS上传源项目里附带的data目录就是这个用途。4. JDK环境配置与Hadoop安装把路径写进profile.d再谈运行4.1 为什么是JDK 8而不是最新版JDKHadoop依赖Java运行但Java版本不是越新越好。Hadoop 3.x系列官方支持Java 8和Java 11对Java 17的支持并不完整ClassCastException和JNI加载问题在Java 17环境下出现的概率明显更高。如果你拿到的教程是Hadoop 3.x版本配置JDK 8是踩坑最少的选择。Hadoop版本推荐Java版本注意事项Hadoop 2.xJava 7 / Java 8Java 11会报兼容性错误不推荐Hadoop 3.2.xJava 8 / Java 11最常用组合是JDK 8Hadoop 3.3.xJava 8 / Java 11JDK 8最稳JDK 17有兼容性风险Ubuntu 20.04自带的apt源里没有openjdk-8-jdk需要手动下载JDK 8的tar.gz包。课程设计场景建议下载jdk-8u202-linux-x64.tar.gz这个版本它是JDK 8的最后一个免费商用版本Hadoop相关教程和实验大多基于这个版本编写网上搜到的报错案例也最多遇到问题容易找到参考。4.2 解压安装JDK并做软链接下载好的JDK压缩包可以通过共享文件夹放到/mnt/hgfs/software/下然后在虚拟机内解压到统一目录sudo mkdir -p /usr/lib/jvm sudo tar -zxvf /mnt/hgfs/software/jdk-8u202-linux-x64.tar.gz -C /usr/lib/jvm sudo ln -s /usr/lib/jvm/jdk1.8.0_202 /usr/lib/jvm/java-8 ls -l /usr/lib/jvm/java-8统一用/usr/lib/jvm/java-8这个路径的好处是将来如果升级JDK版本只需要修改软链接指向不需要改Hadoop和项目的环境变量。很多人在JAVA_HOME里直接写/usr/lib/jvm/jdk1.8.0_202后面换了JDK目录名Hadoop就再也起不来了。软链接相当于一个稳定的入口。解压后验证一下Java是否正常/usr/lib/jvm/java-8/bin/java -version如果输出Java版本信息说明JDK本身没问题。此时先不要急着配环境变量等Hadoop也解压完以后再一起配避免反复source。4.3 环境变量统一写进/etc/profile.d环境变量配置有个常见的坑很多人喜欢在终端里执行export JAVA_HOMExxx然后发现新开一个窗口就失效了于是认为“环境变量配置失败”。export命令只对当前shell会话有效正确的做法是把环境变量写进全局配置文件。sudo tee /etc/profile.d/java-hadoop.sh EOF export JAVA_HOME/usr/lib/jvm/java-8 export HADOOP_HOME/opt/hadoop export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin EOF sudo chmod x /etc/profile.d/java-hadoop.sh source /etc/profile.d/java-hadoop.sh echo $JAVA_HOME/etc/profile.d/目录下的.sh文件会在用户登录时自动加载对所有用户生效比手动改~/.bashrc更通用。HADOOP_CONF_DIR指向Hadoop的配置文件目录后面YARN和MapReduce都要靠它找到配置文件。source命令只对当前会话生效重新登录虚拟机后环境变量依然在这才是正确状态。4.4 解压Hadoop并确认目录归属Hadoop的安装位置建议放在/opt/hadoop不要放在home目录里。home目录在NFS场景或快照回滚时容易被覆盖而且路径深了容易出低级错误。sudo tar -zxvf /mnt/hgfs/software/hadoop-3.3.6.tar.gz -C /opt sudo mv /opt/hadoop-3.3.6 /opt/hadoop sudo chown -R $USER:$USER /opt/hadoop mkdir -p /opt/hadoop/tmpchown -R $USER:$USER的目的是把Hadoop目录归属权转给当前用户。如果你用root解压完不修改归属后面用hadoop用户启动HDFS时会因为无法写日志和数据目录直接失败。/opt/hadoop/tmp是HDFS的数据目录后续在core-site.xml里会用到。解压完成后需要修改/opt/hadoop/etc/hadoop/hadoop-env.sh把JAVA_HOME写死echo export JAVA_HOME/usr/lib/jvm/java-8 | sudo tee -a /opt/hadoop/etc/hadoop/hadoop-env.sh这里必须在hadoop-env.sh里再写一次JAVA_HOME而不是依赖/etc/profile.d里的全局变量。Hadoop的daemon进程在启动时不一定加载profile.d只在hadoop-env.sh里写死才能避免JAVA_HOME is not set的报错。5. 常见问题排查环境搭建阶段集中爆发的四类翻车现场5.1 SSH免密配置无效始终提示输入密码现象按照教程生成了密钥、执行了ssh-copy-id但ssh master仍然要求输入密码。原因最常见的是~/.ssh目录或authorized_keys文件权限过宽。SSH为了保证安全拒绝使用组写权限或其他人可写的密钥文件。另一个原因是home目录权限是755SSH会认为存在安全风险而忽略公钥认证。解决在master和所有slave节点上执行以下命令修正权限然后重新测试chmod go-w ~ chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ssh -vvv master 21 | grep Authentication如果日志里出现Offering public key后紧跟Permission denied基本可以断定是权限问题如果日志直接走password认证说明公钥根本没被读取检查authorized_keys内容是否为master的id_rsa.pub。5.2 NameNode启动失败jps里没有NameNode进程现象执行start-dfs.sh后jps只能看到DataNode和SecondaryNameNode没有NameNodeHDFS上传文件报namenode is not available。原因在没有执行hdfs namenode -format的情况下直接启动或者格式化后数据目录里的clusterID和DataNode不一致。多次格式化后NameNode的clusterID变化了DataNode还在用旧的两者无法握手。解决先看日志确认错误类型tail -100 /opt/hadoop/logs/hadoop-hadoop-namenode-master.log如果是clusterID不一致需要停掉集群后清空临时数据并重新格式化$HADOOP_HOME/sbin/stop-dfs.sh rm -rf /opt/hadoop/tmp/dfs/name/* rm -rf /opt/hadoop/tmp/dfs/data/* hdfs namenode -format -force $HADOOP_HOME/sbin/start-dfs.sh-force参数会覆盖已有格式化记录。注意格式化操作要一次性做对不要反复执行。格式化时记住输出的clusterID如果DataNode日志里的clusterID和NameNode对不上就删掉data目录重新初始化。5.3 共享文件夹挂载后看不到文件或Permission denied现象ls /mnt/hgfs能进入目录但里面是空的或者在挂载目录下执行操作报权限不足。原因VMware的共享文件夹设置没有改为“总是启用”或者挂载时没有指定uid参数。vmhgfs-fuse默认以root身份挂载普通用户访问时没有权限。解决先确认VMware虚拟机设置里的共享文件夹状态然后在虚拟机内重新挂载sudo umount /mnt/hgfs 2/dev/null sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid$(id -u) -o gid$(id -g) ls -la /mnt/hgfs如果vmhgfs-fuse命令不存在说明open-vm-tools没装好执行sudo apt install -y open-vm-tools open-vm-tools-desktop之后再挂载。挂载完成后看一眼文件归属所有者应该是你的用户名而不是root。5.4 environment变量设置了但Hadoop仍然报找不到Java现象java -version能正常输出但执行hadoop命令时报JAVA_HOME is not set。原因Hadoop的启动脚本只读取hadoop-env.sh里的JAVA_HOME不读取你写在/etc/profile.d或~/.bashrc里的环境变量。hadoop-env.sh里的默认JAVA_HOME是usr/lib/jvm/java-8如果你的JDK路径不在这里就会失效。解决编辑/opt/hadoop/etc/hadoop/hadoop-env.sh在文件开头显式写入export JAVA_HOME/usr/lib/jvm/java-8写完后执行hadoop version验证。如果仍然报错检查这个文件是否有特殊字符有些教程复制粘贴HTML转义字符会导致路径解析失败手动敲一遍最保险。5.5 DataNode无法启动日志里提示All configured directories are invalid现象JPS显示NameNode正常但DataNode进程反复退出日志提示All configured directories are invalid或IOException。原因DataNode的数据目录在hdfs-site.xml中配置的路径不存在或者权限不足。Hadoop不会自动创建数据目录需要手动建好并确认归属权限。解决mkdir -p /opt/hadoop/tmp/dfs/data mkdir -p /opt/hadoop/tmp/dfs/name chown -R $USER:$USER /opt/hadoop/tmp然后在hdfs-site.xml中确认配置一致property namedfs.data.dir/name value/opt/hadoop/tmp/dfs/data/value /property property namedfs.namenode.name.dir/name value/opt/hadoop/tmp/dfs/name/value /property改完配置后重启HDFS。这种“进程没起来先看data目录”的习惯能帮你省下大量调试时间。6. 把整套流程变成一键验收脚本用真实Job验证集群健康6.1 写一个环境自检脚本代替人肉敲命令集群搭建完成后每次启动前都手动敲一遍检查命令太容易遗漏。我习惯把验证步骤写成一个脚本跑通了再往下走。cat ~/check_hadoop_env.sh EOF #!/bin/bash echo Java 环境 java -version 21 | head -3 echo SSH 免密 for host in master slave1 slave2; do ssh -o BatchModeyes -o ConnectTimeout5 $host echo $host OK || echo $host FAIL done echo HDFS 状态 hdfs dfsadmin -report 2/dev/null | head -10 echo 守护进程 jps EOF chmod x ~/check_hadoop_env.sh ~/check_hadoop_env.sh-o BatchModeyes的作用是禁止交互式输入密码如果这都没配好会直接输出FAIL而不是卡死等待密码。脚本跑完以后Java环境、SSH免密、HDFS状态、守护进程四项一目了然。不要跳过这一步直接跑作业往往会被“看似正常实则缺失”的问题浪费很久。6.2 用资源包里的MapReduce样例做回归测试环境自检过了以后还需要跑一个真实的MapReduce作业来验证计算链路。除了Hadoop自带的pi计算资源包里附带的InvertedIndex、MatrixMultiply、Dijkstra、SecondarySort这四个Java工程是更贴近课程设计的验证用例。以SecondarySort为例把数据放到HDFS里再运行hdfs dfs -mkdir -p /input hdfs dfs -put /mnt/hgfs/data/input/* /input/ hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /input /output hdfs dfs -cat /output/part-r-00000 | head -20如果你使用的是资源包里编译好的课程设计jar运行方式类似hadoop jar SecondarySort.jar /input /output -D mapreduce.job.reduces2-D mapreduce.job.reduces2是MapReduce运行时的调优参数含义是强制指定Reducer数量为2。第一次跑作业时HDFS上不能已经存在输出目录否则会报错每次跑之前用hdfs dfs -rm -r /output清理掉。6.3 把这份环境变成可复用的交付物资源包里除了教程文档还有完整的实验报告和附赠资料这意味着你不只是搭环境还需要把过程沉淀成可交付的成果。我的习惯是环境跑通后VMware拍一张“Hadoop Installed”快照再把check脚本和配置文件打包放在/mnt/hgfs/shared/里。以后无论是重新搭建、换机器还是给别人复现直接照着这套流程重新走一遍最多半小时能恢复到一个健康的集群状态。从那以后我每次帮同学搭Hadoop环境都强制要求先跑一遍check_hadoop_env.sh脚本没过就不允许启动真正的作业。这个习惯救过我很多次很多看着“玄学”的报错其实都是前面基础步骤埋的雷。希望这篇笔记能帮你把每一步都走稳少踩我踩过的坑。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →