Hadoop安装与搭建全流程:伪分布式到完全分布式实战

发布时间:2026/9/19 12:02:59
Hadoop安装与搭建全流程:伪分布式到完全分布式实战 如果你已经刷到过一大堆Hadoop安装教程却总被“伪分布式”“完全分布式”“SSH免密”这些词搞得云里雾里那这篇Hadoop安装与搭建全流程教学就是冲着你来的。我会从零开始把前置环境、JDK安装、配置文件改动、启动验证、常见报错全部过一遍保证每一步都能照着敲不玩虚的。这套流程我前前后后在不同机器上装过不下十遍坑基本都踩熟了你照着走就行。文章很长建议先收藏再慢慢看或者配合虚拟机一起操作效果最好。内容适用对象很明确刚接触大数据、学校课程要求搭建Hadoop环境、或者准备面试想自己动手跑通一套集群的人。1. 装Hadoop前先把整体思路捋清楚1.1 三种部署方式怎么选Hadoop部署方式常规区分是三种单机模式、伪分布式、完全分布式。很多时候教程一上来就让人跑完全分布式结果机器配置不够、网络配置出错折腾半天连NameNode都起不来非常打击信心。单机模式默认配置不需要任何修改主要用于跑MapReduce的本地调试。整个过程不涉及HDFS不对应真实生产场景。伪分布式在单台机器上用不同进程模拟出Hadoop集群的角色NameNode、DataNode、ResourceManager、NodeManager都在同一台机器上跑。学习和开发阶段用这个最合适。完全分布式至少三台机器分别部署不同角色最接近生产环境但配置复杂度直接翻倍。对于初学者我强烈建议先把伪分布式跑通理解了HDFS读写、YARN任务调度之后再扩展成完全分布式集群。直接把三台机器的物理机或虚拟机一次配好经常出问题而且系统排查难度大不适合入门。1.2 版本选型和目录规划Hadoop版本选择建议直接用Apache社区版版本号选3.x以上的稳定版比如3.3.4、3.3.6都可以。不要用2.x的老版本很多配置项和命令行为都不一样网上的资料过于混杂容易踩坑。JDK方面Hadoop 3.x要求Java 8或Java 11。建议直接装JDK 8因为后续跑Hive、Spark等生态组件时JDK 8的兼容性目前仍然是最好的。路径规划很重要如果一开始随便装后续配置环境变量、扩展集群都会很乱。我在多台机器上验证过的标准目录如下/opt/software # 存放所有安装包tar.gz、jdk、hadoop压缩包等 /opt/module # 软件实际解压后的安装目录对应命令sudo mkdir -p /opt/software /opt/module sudo chown -R $USER:$USER /opt/software /opt/module把目录所有者改成当前用户后面就不用反复sudo了操作体验会顺很多。1.3 系统环境和规划建议操作系统建议用CentOS 7.x、CentOS 8.x或者Ubuntu 20.04以上版本内存至少4GB。伪分布式对内存要求不高但如果还要跑Zookeeper、Hive之类的组件建议内存分配8GB以上。主机名建议提前改好不要用localhost去搭建集群场景。单机伪分布式可以不改但后面扩展集群时必须先养成规划主机名的习惯。例如sudo hostnamectl set-hostname hadoop01然后编辑/etc/hosts加上IP和主机名的映射关系。很多坑都出在hostname解析上后面会细说。2. 前置环境准备JDK和SSH免密登录2.1 JDK安装与环境变量配置JDK安装没有太多技术含量但环境变量一旦PATH写错后续java命令无法生效会浪费大量时间。先用tar命令解压JDKtar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt/module/建议将解压后的目录重命名为方便记忆的名字cd /opt/module/ mv jdk1.8.0_202 jdk8然后配置环境变量编辑vi /etc/profile在文件末尾追加export JAVA_HOME/opt/module/jdk8 export PATH$PATH:$JAVA_HOME/bin刷新配置并验证source /etc/profile java -version如果输出类似java version 1.8.0_202说明JDK安装成功。这里有个细节source /etc/profile只对当前会话生效重新连接SSH或者重启机器后通常也能正常读取系统级profile但如果不生效检查一下是否在~/.bashrc里也补了同样的export。2.2 SSH免密登录的原理解析Hadoop进程之间通信依赖SSH尤其是NameNode需要通过SSH远程启动或停止各节点的DataNode进程。如果频繁输入密码集群脚本根本无法运行。免密登录的原理可以这样理解A机器生成一对密钥公钥和私钥把公钥放到B机器的授权列表里。之后A访问B时B用公钥验证A持有的私钥验证通过就直接放行。这和我们用门禁卡刷办公楼的逻辑几乎一样卡面信息公钥是公开的但刷卡时门禁要确认物理卡本身私钥是真实的。操作如下ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys-P 表示不设置密码短语这样免密登录就完全静默执行。然后测试ssh localhost第一次SSH的时候会提示确认指纹输入yes回车。之后再次连接就不需要密码了。2.3 其他系统基础配置需要提前关闭防火墙和安全策略否则后面访问Hadoop的Web界面时可能被拦排查起来又麻烦。CentOS下的操作systemctl stop firewalld systemctl disable firewalld如果你是Ubuntu系统检查ufw状态sudo ufw disable另外如果用的是云服务器还要确认安全组放行相关端口比如NameNode的9870、YARN的8088等。本地虚拟机的话关闭防火墙就足够。3. 核心安装Hadoop解压与配置文件逐个拆解3.1 Hadoop解压与目录结构下载Hadoop安装包推荐从清华或阿里镜像站下载速度比官网稳定得多。拿到tar.gz包后tar -zxvf hadoop-3.3.6.tar.gz -C /opt/module/ cd /opt/module/ mv hadoop-3.3.6 hadoop解压完成后进入hadoop目录用ll可以看到以下重要子目录binHDFS、YARN常用的客户端命令比如hdfs、yarn、mapred。sbin启动和停止服务的脚本比如start-dfs.sh、start-yarn.sh。etc/hadoop配置文件目录后面主要改这里。share/hadoop官方自带的jar包和示例程序。很多教程会让人先跑一下hadoop version看看是否安装成功但这时还没配置环境变量所以要么先配置要么用相对路径运行。直接先配环境变量会省事很多。3.2 核心环境变量配置编辑vi /etc/profile新增Hadoop相关环境变量export HADOOP_HOME/opt/module/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop然后执行source /etc/profile运行hadoop version能看到版本信息就代表Hadoop已经可以基本使用了。不过此时还缺关键一步需要在hadoop-env.sh里指定JAVA_HOME。3.3 五个关键配置文件解析Hadoop的配置主要围绕etc/hadoop目录下的五个文件展开。逐个改动前先理解每个文件的作用这样以后调优也不会懵。第一个是hadoop-env.sh。这个文件负责定义Hadoop运行时的JVM参数和环境变量。找到文件中JAVA_HOME的位置修改为绝对路径export JAVA_HOME/opt/module/jdk8强烈建议直接写成绝对路径不要在这个文件里用$(which java)之类的动态获取方式因为Hadoop在通过SSH远程启动节点时环境变量经常加载不完整动态获取容易失败。第二个是core-site.xml。它定义了Hadoop集群的全局属性最关键的是默认文件系统。配置如下configuration property namefs.defaultFS/name valuehdfs://hadoop01:8020/value /property property namehadoop.tmp.dir/name value/opt/module/hadoop/tmp/value /property /configurationfs.defaultFS指定了NameNode的地址和端口端口默认8020也可以写成9000不同版本有默认区别建议显式指定。hadoop.tmp.dir非常重要它决定了NameNode元数据、DataNode数据块的存储根目录。如果不设置默认会使用/tmp目录系统一旦重启清理了临时文件你的HDFS数据就可能全部丢失这个坑非常经典。第三个是hdfs-site.xml。主要配置NameNode和DataNode的存储路径、副本数等。伪分布式场景下副本数建议设置为1configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/module/hadoop/tmp/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:///opt/module/hadoop/tmp/dfs/data/value /property /configurationdfs.replication为1意味着每个文件只存一份副本。集群环境一般设置为2或3取决于节点数。副本数并不是越多越好它直接占用存储空间要根据可用节点数量来决定。第四个是yarn-site.xml。YARN负责资源调度和任务分配。伪分布式需要配置如下configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.env-whitelist/name valueJAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH.PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ/value /property /configurationyarn.nodemanager.aux-services配置为mapreduce_shuffle这是MapReduce任务在YARN上运行的必需项它相当于Map和Reduce之间数据传输的辅助服务。缺失这个配置任务会一直卡在Running状态却不执行。第五个是mapred-site.xml。这个文件在早期版本中需要从模板复制新版本已经自带。配置MapReduce运行时框架为YARNconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configuration有的教程还会加上mapreduce.jobhistory.address的配置那是给JobHistory服务用的伪分布式阶段可以先不加避免一开始就堆太多概念。3.4 workers文件与格式化workers文件旧版本叫slaves用于定义哪些节点作为DataNode或NodeManager。因为是伪分布式单节点所以只需写入当前主机名hadoop01改完之后第一次启动HDFS前必须执行格式化命令。格式化的作用是初始化NameNode的元数据目录生成一个唯一的集群ID。命令如下hdfs namenode -format如果看到successfully formatted的字样说明格式化成功。这里必须反复强调格式化操作只能在第一次启动前执行。如果集群已经启动过之后因为配置修改想重新格式化必须先删除NameNode和DataNode的数据目录否则会出现集群ID不一致的问题表现为DataNode进程能起来但就是无法注册到NameNode。3.5 启动HDFS和YARN验证启动之前先把目录准备好避免权限问题mkdir -p /opt/module/hadoop/tmp cd /opt/module/hadoop/sbin/ ./start-dfs.sh ./start-yarn.sh注意输出日志里如果有WARN util.NativeCodeLoader: Unable to load native-hadoop library这是缺少本地native库的警告不影响使用可以忽略。启动后用jps命令查看Java进程jps正常情况下应该看到以下五个进程NameNodeDataNodeSecondaryNameNodeResourceManagerNodeManager如果进程数量不齐说明某一步配置出了问题后面常见问题章节会详述。Web界面验证也很直接。HDFS管理界面访问地址是http://hadoop01:9870可以看到文件系统概况、节点状态和数据块信息。YARN资源管理界面访问http://hadoop01:8088可以查看正在运行的任务和集群资源情况。4. 从伪分布式平滑扩展到完全分布式集群4.1 集群节点规划与主机名映射把伪分布式扩展成完全分布式原理上没有新增内容只是把角色分散到多台机器上。一般来说三台机器是最低配置推荐规划如下hadoop01NameNode、ResourceManager、SecondaryNameNodehadoop02DataNode、NodeManagerhadoop03DataNode、NodeManager扩展前先把每台机器的主机名改好并在每台机器的/etc/hosts中添加完整的IP映射192.168.1.101 hadoop01 192.168.1.102 hadoop02 192.168.1.103 hadoop03注意不要写127.0.0.1 hadoop01这样的映射否则NameNode之间通信时匹配不到正确的IP容易出现莫名其妙的宕机。4.2 免密登录的扩展方向完全分布式集群中NameNode所在机器需要能免密登录所有DataNode机器。所以需要在hadoop01上生成密钥并把公钥分别分发到hadoop02和hadoop03上。ssh-copy-id hadoop02 ssh-copy-id hadoop03ssh-copy-id命令会自动把本地公钥追加到目标机器的authorized_keys文件里期间需要输入一次目标机器的用户密码。为了保险起见还可以让每台机器都把自己公钥写入本机以及其他机器方便后续操作脚本执行。4.3 分发配置与启动顺序在hadoop01上完成全部配置文件的修改后用rsync或scp把整个Hadoop安装目录分发到另外两台机器rsync -av /opt/module/hadoop hadoop02:/opt/module/ rsync -av /opt/module/hadoop hadoop03:/opt/module/然后再把JDK和环境变量一起分发。注意只需要在hadoop01上执行hdfs namenode -format其他节点绝对不要格式化否则集群ID不统一集群就废了。首次启动时在hadoop01上执行start-dfs.sh start-yarn.sh脚本会通过SSH自动在所有节点上启动对应进程。之后用jps分别检查每台机器的进程对照规划表验证是否齐全。4.4 关于Hadoop和Zookeeper整合的简要说明热词里出现“hadoop和zookeeper整合实战”这里顺带讲一下。Zookeeper不是Hadoop运行的必选组件HDFS的高可用架构HA才需要Zookeeper它负责监控NameNode的状态并在主NameNode故障时自动完成切换。如果只是学习阶段伪分布式完全不需要Zookeeper。但如果你计划搭建HA模式那么Zookeeper集群一般独立部署在奇数台机器上3台或5台配置核心是zoo.cfg中的server.1、server.2这类节点列表然后所有NameNode和DataNode的配置里增加ha.zookeeper.quorum参数具体内容需要单独展开细讲这里先不展开。5. 常见问题与排查技巧实录5.1 大数据安装后必须掌握的排查思路Hadoop安装出问题不要慌。按照“网络→端口→日志→配置”的顺序排查能解决90%的问题。先看进程是否存在通过jps确认再通过网络连通性测试比如ping hadoop02确认网络可达再看端口是否监听ss -tlnp | grep 9870可以确认NameNode Web端口是否正常打开最后才看日志Hadoop日志位于每个节点的/opt/module/hadoop/logs目录下文件命名一般是hadoop-用户-角色-主机名.log比如hadoop-hadoop-namenode-hadoop01.log。日志文件比任何教程都有话语权。遇到问题时优先看日志尾部一般Error信息会明确告诉你缺什么配置、端口被占用还是权限不足。5.2 典型报错与解决方案对照表我整理了在Hadoop安装搭建、Hive配置、Zookeeper整合以及日常运维中踩过的典型问题用一张表列出来按图索骥报错现象或提示可能原因解决方案java.lang.NoClassDefFoundError: org/apache/hadoop/crypto/...Hadoop公共库未被正确加载常见于Hive、Tez、Spark组件与Hadoop版本不兼容统一各组件编译版本检查HADOOP_CLASSPATH和HIVE_AUX_JARS_PATH将hadoop-common.jar加入CLASSPATH或重新下载对应版本的hadoop-client8088端口打不开页面ResourceManager没启动或防火墙拦截检查jps是否有ResourceManager关闭防火墙查看yarn-site.xml是否配置了yarn.resourcemanager.webapp.addressDataNode进程存在但Web界面显示1个节点且Live Nodes为0执行了多次格式化NameNode和DataNode的clusterID不一致停止所有进程删除每个节点的tmp/dfs/name和tmp/dfs/data目录重新格式化NameNode再启动Incompatible clusterIDs多次格式化后集群ID不匹配删除所有节点的数据目录后重新格式化必须全删干净一个都不能留启动时提示Permission denied (publickey)SSH免密失效检查~/.ssh/authorized_keys是否存在且权限为600~/.ssh目录权限为700上传文件到HDFS时报No space left伪分布式副本数设为3但只有一个DataNode无法满足副本策略修改hdfs-site.xml的dfs.replication为1同时检查磁盘空间UnsupportedClassVersionErrorJDK版本过高或过低Hadoop与该JDK不兼容统一使用JDK 8重新编译或替换组件版本start-dfs.sh卡在localhost: Permission denied当前用户对SSH授权目录权限配置错误确保当前用户是Hadoop安装目录的属主执行chown -R $USER:$USER /opt/moduleNameNode启动后自动退出hadoop.tmp.dir未显式配置系统重启后临时文件被清理在core-site.xml设置专门的存储目录彻底解决5.3 最容易被忽略的几个细节第一JAVA_HOME的路径不能只配在/etc/profile里。Hadoop的很多子进程通过SSH远程启动SSH会话不一定加载profile文件所以hadoop-env.sh里的JAVA_HOME必须写成绝对路径这个我之前反复强调但每次帮人排查还是会遇到踩中的。第二不要随手执行hdfs namenode -format。每一次格式化都会生成新的集群ID除非你明确知道要清空数据否则就是亲手制造问题。如果需要重新格式化提前把日志文件和元数据目录备份起来至少能用来对比分析。第三遇到中文路径要格外小心。如果不小心把安装包的存放路径设置成带中文目录名某些组件解析文件路径时会出现编码问题表现为启动报错或任务卡死。安装软件这类操作目录路径尽量全英文。5.4 如何验证你的集群已经真正可用启动完成后很多人不知道该怎么确认集群是否真的能用。单纯看进程还不够建议做一次真实的文件上传和下载测试。在HDFS上创建目录并上传文件hdfs dfs -mkdir -p /test/input echo hello hadoop /tmp/test.txt hdfs dfs -put /tmp/test.txt /test/input/ hdfs dfs -cat /test/input/test.txt如果cat能输出文件内容说明HDFS读写链路是通的。接着跑一个官方自带的MapReduce示例程序验证YARN是否正常工作cd /opt/module/hadoop hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /test/input /test/output等待任务跑完后查看结果hdfs dfs -cat /test/output/part-r-00000如果看到单词统计结果说明MapReduce的计算链路也完全跑通了。到这一步你的Hadoop环境才是真正“能用”的状态而不是只有进程列表好看。5.5 关于Hadoop的启停命令速查日常使用中常用的启停命令及对应作用整理如下start-dfs.sh启动HDFS相关进程包括NameNode、DataNode、SecondaryNameNodestart-yarn.sh启动YARN相关进程包括ResourceManager、NodeManagerstop-dfs.sh停止HDFS相关进程stop-yarn.sh停止YARN相关进程start-all.sh合并启动HDFS和YARN在早期版本常用新版本不推荐容易让人忽视组件拆分逻辑hdfs dfsadmin -report查看各DataNode的存储情况和节点状态hdfs dfs -du -h /查看HDFS各目录占用情况我在实际使用中更习惯于单独执行start-dfs.sh和start-yarn.sh这样可以更清晰地定位问题出在哪一层。生产环境也是一样HDFS和YARN逐步启动比一把梭更安全。5.6 Ubuntu环境下的额外注意事项如果你用的是Ubuntu而不是CentOS路径和行为会有一点点差异。Ubuntu的默认shell是bash但/etc/profile和~/.bashrc的加载机制不同如果hadoop version不生效先在~/.bashrc里追加环境变量再source ~/.bashrc。Ubuntu的防火墙管理工具是ufw命令前面说过。另外一个常见的坑是Ubuntu的openjdk可能不全建议从Oracle官网下载JDK 8避免出现javac命令找不到的情况。还有Ubuntu的dash与bash在脚本执行上存在解析差异有些Hadoop自带的shell脚本在Ubuntu上会报语法错误这时不用改脚本只需把/bin/sh重新指向bash或者用bash 脚本名.sh的方式强制执行。如果你不确定当前环境优先用bash来跑所有安装脚本。写在最后的一些个人体会按照这套流程完整走下来你会对Hadoop的安装与搭建有一个比较体系化的理解。很多人装Hadoop失败并不是某个配置有多难而是在版本混用、路径混乱、格式化次数过多这类细节上翻车。我的体会是安装大数据组件时宁可慢一点也要把每个配置文件的作用、每个参数的意义真正搞清楚这样后面搭Hive、Spark、Flume之类生态组件时才有底气去应对底层抛出来的异常。最后再分享一个小技巧每次改完配置在启动服务之前先把所有配置文件的XML格式检查一遍标签是否闭合、属性名是否拼错这两类低级错误占了启动失败的相当大比例。用xmllint工具可以快速验证如果没有安装至少也要打开文件扫一眼结构与缩进。希望这套流程能帮你少走一些弯路剩下的事情就交给你的耐心了。