拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu虚拟机搭建Hadoop伪分布式集群:SSH免密与共享文件夹配置指南

Ubuntu虚拟机搭建Hadoop伪分布式集群:SSH免密与共享文件夹配置指南 简介这份资源面向大数据入门学习者与高校云计算课程学生提供在Ubuntu系统上从零搭建Hadoop分布式环境的完整教程覆盖虚拟机安装、SSH免密登录、共享文件夹挂载、JDK环境配置、Hadoop安装与参数调优、环境变量设置等关键环节帮助读者构建可运行的大数据处理平台。压缩包共93个文件约222.16MB包含xml与iml工程配置、class与java源码、jar依赖包、png操作截图、docx与doc实验报告及txt说明文档并附赠Cloud-Computing-course-design-master课程设计项目内含InvertedIndex、MatrixMultiply、Dijkstra、SecondarySort等实验案例与数据。已有112人学习下载。读者可借助分步截图与实验报告掌握集群节点通信、HDFS存储与Java环境配置方法同时获得课程设计参考与排错思路适合初学者按图索骥也便于有经验开发者查漏补缺。1. 从一台裸 Ubuntu 虚拟机到能跑 MapReduce 的 Hadoop 平台这套流程到底在解决什么很多人第一次接触大数据卡住的地方不是 MapReduce 编程也不是 HDFS 原理而是环境根本跑不起来。你手上只有一台刚装好的 Ubuntu 虚拟机网络能通、终端能敲命令但 Hadoop 的安装包解压完start-dfs.sh一执行就报JAVA_HOME is not set或者 SSH 连本机还要输密码NameNode 直接起不来。这套「Ubuntu 虚拟机 SSH 免密 共享文件夹 JDK Hadoop」的搭建流程解决的就是从零到「伪分布式集群能正常启动、Web UI 能打开、能提交一个 WordCount 任务」这一段路。它适合三类人一是大数据课程设计要交作业的学生二是刚转行想在自己电脑上把 Hadoop 跑通再去看面试题的开发者三是需要一套可反复重建的实验环境、不想每次重装都翻旧笔记的工程师。核心思路很朴素用虚拟机隔离出一台干净的 Ubuntu把主机和虚拟机之间的文件通道打通再把 JDK 和 Hadoop 的依赖关系、环境变量、SSH 信任链一次性配到位。下面按真实搭建顺序拆开讲每一步都给出可复制的命令和参数含义。2. 虚拟机装 Ubuntu 与共享文件夹挂载先把「地基」和「文件通道」铺好2.1 虚拟机选型与 Ubuntu 版本选择虚拟机软件常见的是 VMware Workstation 和 VirtualBox两者都能满足 Hadoop 伪分布式搭建。我一般用 VMware原因是共享文件夹挂载在 Linux 端更省事vmhgfs-fuse挂载后路径稳定不容易出现重启掉盘。Ubuntu 版本建议选 22.04 LTS长期支持、软件源稳定社区里针对 22.04 的 Hadoop 踩坑记录也最多遇到问题好搜。内存分配上伪分布式至少给 4GB低于这个数 NameNode 和 DataNode 同时跑容易 OOM磁盘给 40GB 以上HDFS 副本虽然伪分布式只存一份但日志和临时文件会持续增长。安装时有一个容易忽略的点虚拟机网络模式。NAT 模式下虚拟机能上网但主机访问虚拟机的 Web UI 需要端口转发桥接模式则虚拟机和主机在同一网段直接用虚拟机 IP 就能访问 9870 端口。做 Hadoop 实验我推荐桥接省去端口映射的麻烦。安装过程中设置的用户名不要用hadoop以外的特殊字符后面 SSH 和权限配置会少很多事。2.2 共享文件夹挂载的完整命令与 fstab 持久化共享文件夹的作用是把主机上的 JDK 压缩包、Hadoop 安装包、数据集直接拖进虚拟机不用每次用 U 盘或 scp 来回传。VMware 里先在虚拟机设置中启用共享文件夹指定主机目录比如D:\bigdata_share名称设为share。进入 Ubuntu 后执行挂载# 安装 VMware Tools 提供的挂载工具若已安装可跳过 sudo apt update sudo apt install open-vm-tools open-vm-tools-desktop -y # 创建挂载点 sudo mkdir -p /mnt/hgfs/share # 手动挂载共享文件夹 sudo vmhgfs-fuse .host:/share /mnt/hgfs/share -o allow_other -o uid1000 -o gid1000 # 验证挂载结果 ls /mnt/hgfs/shareallow_other让非 root 用户也能访问挂载目录uid1000和gid1000对应 Ubuntu 默认第一个用户的 UID/GID这样当前用户读写共享文件不会出现权限拒绝。如果vmhgfs-fuse命令不存在说明 open-vm-tools 没装好先确认软件包状态。手动挂载重启后会失效写入/etc/fstab实现开机自动挂载# 编辑 fstab追加一行 echo .host:/share /mnt/hgfs/share fuse.vmhgfs-fuse allow_other,uid1000,gid1000,defaults 0 0 | sudo tee -a /etc/fstab # 测试 fstab 配置是否正确不重启验证 sudo mount -amount -a不报错说明配置有效。这里有个血泪经验fstab 写错会导致系统启动进入 emergency mode所以改完一定先mount -a验证别直接重启。共享文件夹挂载好之后后面 JDK 和 Hadoop 的安装包直接从/mnt/hgfs/share拷贝到/opt或用户目录效率高很多。2.3 主机名与 hosts 映射配置Hadoop 集群内部节点之间通过主机名通信伪分布式虽然只有一台机器但 NameNode 注册、DataNode 上报都会用到主机名。先设置主机名# 设置主机名为 hadoop01 sudo hostnamectl set-hostname hadoop01 # 编辑 hosts 文件建立主机名与 IP 的映射 sudo tee -a /etc/hosts EOF 192.168.1.100 hadoop01 EOF192.168.1.100换成你虚拟机实际的 IP用ip addr查看。hosts 映射不做的话后面start-dfs.sh启动时会出现Connection refused或者 NameNode 一直处于 safe mode因为 Hadoop 解析主机名失败。这一步是很多教程跳过但实际必做的配置 host 映射与 SSH 免密登录要放在一起做顺序不能反。3. SSH 免密登录与 JDK 环境配置把 Hadoop 的依赖链打通3.1 SSH 免密登录的原理与三步配置Hadoop 的启动脚本start-dfs.sh和stop-dfs.sh会在本地通过 SSH 连接到 NameNode 和 DataNode 所在节点执行命令。伪分布式下就是连本机但如果不配免密每启动一次就要输好几次密码脚本还会因为等待输入而卡住。免密登录的原理是本机生成一对密钥把公钥追加到目标机器的~/.ssh/authorized_keys文件之后 SSH 连接时用私钥验证不再需要密码。配置步骤# 1. 生成 RSA 密钥对-t 指定算法-P 指定空密码-f 指定密钥文件路径 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 2. 将公钥追加到本机的授权文件 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 3. 设置权限SSH 对权限要求严格权限不对免密会失效 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # 4. 测试免密登录 ssh hadoop01-P 表示私钥不设密码这是 Hadoop 自动化脚本的要求设了密码反而会导致脚本卡在密码输入。chmod 700和chmod 600是必须的SSH 会检查~/.ssh目录和authorized_keys文件的权限如果组用户或其他用户有写权限SSH 会拒绝使用该密钥表现为免密配置了但还是要输密码。测试时ssh hadoop01能直接进入不需要密码说明配置成功exit退出。3.2 JDK 安装与环境变量设置Hadoop 3.x 依赖 JDK 8 或 JDK 11推荐 JDK 8兼容性最好。从共享文件夹拷贝 JDK 压缩包到/opt目录# 拷贝 JDK 安装包到 /opt sudo cp /mnt/hgfs/share/jdk-8uXXX-linux-x64.tar.gz /opt/ # 解压 cd /opt sudo tar -zxvf jdk-8uXXX-linux-x64.tar.gz # 重命名目录方便后续引用 sudo mv jdk1.8.0_XXX jdk8jdk-8uXXX中的 XXX 换成你实际下载的小版本号。解压后目录名带版本号重命名为jdk8是为了环境变量路径固定以后换小版本不用改配置。环境变量配置有两种方式修改/etc/profile全局生效或修改~/.bashrc当前用户生效。Hadoop 实验我一般改~/.bashrc避免污染系统全局环境# 追加 JDK 环境变量 cat ~/.bashrc EOF export JAVA_HOME/opt/jdk8 export JRE_HOME\${JAVA_HOME}/jre export CLASSPATH.:\${JAVA_HOME}/lib:\${JRE_HOME}/lib export PATH\${JAVA_HOME}/bin:\${PATH} EOF # 使配置立即生效 source ~/.bashrc # 验证 java -version echo $JAVA_HOMEJAVA_HOME是 Hadoop 启动时必须读取的变量CLASSPATH里的.表示当前目录保证 Java 能找到当前目录下的类文件。source ~/.bashrc让配置在当前终端立即生效新开终端会自动加载。java -version输出 1.8 版本信息echo $JAVA_HOME输出/opt/jdk8两个都对才算配置成功。如果java -version报 command not found检查PATH是否包含$JAVA_HOME/bin以及source是否执行。3.3 Hadoop 安装与核心配置文件修改Hadoop 从官网下载 tar.gz 包同样拷贝到/opt解压sudo cp /mnt/hgfs/share/hadoop-3.x.x.tar.gz /opt/ cd /opt sudo tar -zxvf hadoop-3.x.x.tar.gz sudo mv hadoop-3.x.x hadoop sudo chown -R $USER:$USER /opt/hadoopchown把 Hadoop 目录所有权给当前用户否则后续启动时写日志和临时文件会权限不足。Hadoop 3.x 的配置文件在$HADOOP_HOME/etc/hadoop/下伪分布式需要改五个文件。hadoop-env.sh指定 JAVA_HOME# 在 hadoop-env.sh 中找到 export JAVA_HOME 行改为实际路径 echo export JAVA_HOME/opt/jdk8 /opt/hadoop/etc/hadoop/hadoop-env.shcore-site.xml配置 HDFS 的默认文件系统和临时目录configuration property namefs.defaultFS/name valuehdfs://hadoop01:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/tmp/value /property /configurationfs.defaultFS指定 NameNode 的通信地址hadoop01是前面配的主机名9000 是 NameNode 端口。hadoop.tmp.dir是 Hadoop 运行时临时目录默认在/tmp下系统重启可能被清理导致 NameNode 元数据丢失所以显式指定到/opt/hadoop/tmp。hdfs-site.xml配置副本数和 NameNode/DataNode 数据目录configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/opt/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/opt/hadoop/data/datanode/value /property /configuration伪分布式只有一台机器dfs.replication必须设为 1设成 3 会一直提示副本不足。dfs.namenode.name.dir和dfs.datanode.data.dir分别指定元数据和块数据的存储路径提前建好目录并确保当前用户有写权限。mapred-site.xml指定 MapReduce 运行框架configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationyarn-site.xml配置 YARN 的 ResourceManager 和 NodeManagerconfiguration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuehadoop01/value /property /configurationyarn.nodemanager.aux-services设为mapreduce_shuffle是 MapReduce 跑在 YARN 上的必要配置少了这个 Shuffle 阶段会失败。yarn.resourcemanager.hostname指定 ResourceManager 所在主机。最后配置 Hadoop 环境变量cat ~/.bashrc EOF export HADOOP_HOME/opt/hadoop export HADOOP_CONF_DIR\${HADOOP_HOME}/etc/hadoop export PATH\${HADOOP_HOME}/bin:\${HADOOP_HOME}/sbin:\${PATH} EOF source ~/.bashrcHADOOP_CONF_DIR让 Hadoop 命令能找到配置文件PATH里加入bin和sbin后hdfs、hadoop、start-dfs.sh等命令可以直接敲不用写全路径。4. 避坑与排查Hadoop 启动失败时先看这五个地方4.1 NameNode 启动报 JAVA_HOME is not set现象执行start-dfs.sh后终端输出JAVA_HOME is not setNameNode 进程没起来。原因hadoop-env.sh里的JAVA_HOME没配或者配的路径不对。Hadoop 启动脚本读的是hadoop-env.sh里的变量不是~/.bashrc里的。解决打开$HADOOP_HOME/etc/hadoop/hadoop-env.sh找到export JAVA_HOME那一行改成export JAVA_HOME/opt/jdk8保存后重新启动。4.2 SSH 免密配置了但还是要输密码现象ssh-keygen和authorized_keys都做了ssh hadoop01仍然提示输入密码。原因权限不对或者 hosts 里主机名映射的 IP 和实际 IP 不一致。解决先ls -ld ~/.ssh确认是drwx------ls -l ~/.ssh/authorized_keys确认是-rw-------不对就chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys。再cat /etc/hosts确认hadoop01对应的 IP 和ip addr输出一致不一致就改 hosts。4.3 DataNode 启动后立刻消失现象jps能看到 NameNode但 DataNode 一闪而过Web UI 上 Live Nodes 为 0。原因dfs.datanode.data.dir指定的目录不存在或权限不足或者多次format后 DataNode 的 clusterID 和 NameNode 不一致。解决先确认目录存在且当前用户可写mkdir -p /opt/hadoop/data/datanode chown -R $USER:$USER /opt/hadoop/data。如果是 clusterID 不一致删掉 NameNode 和 DataNode 的数据目录重新hdfs namenode -format再启动。注意 format 只能执行一次多次 format 会导致 clusterID 不匹配。4.4 Web UI 打不开 9870 端口现象浏览器访问http://hadoop01:9870连接超时。原因虚拟机网络模式是 NAT主机访问不到虚拟机端口或者 Ubuntu 防火墙拦截。解决确认虚拟机网络是桥接模式ip addr拿到 IP 后直接在主机浏览器访问http://虚拟机IP:9870。如果还不行检查防火墙sudo ufw status临时关闭sudo ufw disable测试。生产环境不要关防火墙实验环境可以。4.5 共享文件夹挂载后重启失效现象重启 Ubuntu 后/mnt/hgfs/share目录为空。原因手动挂载没写入 fstab或者 fstab 里的配置有误导致挂载失败。解决按 2.2 节的 fstab 配置写入执行sudo mount -a验证不报错。如果 fstab 写错导致系统进 emergency mode在 emergency 模式下用mount -o remount,rw /重新挂载根分区为可写然后编辑/etc/fstab删掉错误行重启。5. 验证集群可用性与一个可复现的 WordCount 技巧环境搭好之后怎么确认它真的能用而不是「进程起来了但一跑任务就挂」我一般用三步验证先看进程再跑 HDFS 命令最后提交一个 WordCount。jps应该看到 NameNode、DataNode、ResourceManager、NodeManager、SecondaryNameNode 五个进程。少任何一个都说明对应组件没起来回到第 4 章排查。HDFS 基础操作验证# 创建测试目录 hdfs dfs -mkdir -p /user/$USER/input # 上传本地文件到 HDFS echo hello hadoop hello mapreduce /tmp/test.txt hdfs dfs -put /tmp/test.txt /user/$USER/input/ # 查看 HDFS 上的文件 hdfs dfs -ls /user/$USER/input/ # 查看文件内容 hdfs dfs -cat /user/$USER/input/test.txthdfs dfs -mkdir -p的-p表示递归创建目录父目录不存在会自动建。-put把本地文件上传到 HDFS-ls和-cat分别列出和查看。这些命令能正常执行说明 HDFS 读写通路没问题。跑 WordCount 用 Hadoop 自带的示例 jar# 提交 WordCount 任务 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.x.x.jar wordcount /user/$USER/input /user/$USER/output # 查看输出结果 hdfs dfs -cat /user/$USER/output/part-r-00000hadoop-mapreduce-examples-3.x.x.jar的版本号要和你的 Hadoop 版本一致在$HADOOP_HOME/share/hadoop/mapreduce/下ls能看到实际文件名。wordcount后面两个参数分别是输入目录和输出目录输出目录必须不存在否则任务会报Output directory already exists。任务跑完后part-r-00000里是词频统计结果能看到hello 2、hadoop 1、mapreduce 1就说明整个 MapReduce 链路通了。一个实用技巧如果任务卡在map 0% reduce 0%不动先看yarn-site.xml里yarn.nodemanager.aux-services是否配了mapreduce_shuffle再看 NodeManager 日志$HADOOP_HOME/logs/yarn-*-nodemanager-*.log有没有报错。大部分卡住都是 Shuffle 配置缺失或者内存不够伪分布式下把yarn.nodemanager.resource.memory-mb设成 2048 以上能解决多数内存问题。这套环境我反复搭过很多次最大的教训是不要跳过 hosts 映射和权限设置这两个地方省一步后面要花十倍时间排查。每次重装虚拟机我都先把共享文件夹和 SSH 免密配好再动 JDK 和 Hadoop顺序对了基本一次过。希望帮到你。本文还有配套的精品资源点击获取
返回列表