
1. 为什么现在还要亲手搭一个多节点Hadoop集群“在VMware中搭建多节点Hadoop集群”这个标题乍看像一份十年前的实验报告——毕竟云厂商一键部署Hadoop服务的按钮已经亮了快十年Kubernetes上跑FlinkIceberg的流批一体架构图都快贴满技术大会的展板了。但如果你最近真去面试过大数据开发岗、运维岗或者参与过某高校实验室的分布式系统课程设计、某中小企业的数据平台迁移评估就会发现能完整手搭一个三节点以上、NameNode高可用、YARN资源调度正常、MapReduce和Spark Shell均可提交作业的Hadoop集群的人依然稀缺而能说清每一步背后“为什么非得这么配、不这么配会卡在哪、日志里哪行报错对应哪个组件故障”的人几乎就是现场面试官立刻想拉进组的实操派。这不是怀旧是能力锚点。Hadoop生态的抽象层越厚底层逻辑的断层就越深。你用Hive SQL查一张表背后可能经过Calcite解析、Tez DAG调度、YARN Container分配、HDFS Block定位、DataNode本地读取……但一旦某个环节超时或拒绝连接如果只依赖“重启服务”“删掉tmp目录”“重装一遍”那问题永远在下一次上线前爆发。而亲手在VMware里从零配置四台CentOS虚拟机、手动同步时间、逐个修改core-site.xml的fs.defaultFS、反复校验hdfs namenode -format是否真的生成了VERSION文件、盯着jps输出里缺了哪个Java进程——这些“笨功夫”恰恰是把分布式系统从黑盒变成白盒的唯一路径。我带过两届某高校大数据实训班学生用阿里云ECS一键部署Hadoop后90%能跑通WordCount但当要求他们把集群从单NameNode改成QJMQuorum Journal Manager高可用模式并模拟主NN宕机后自动切换过程时超过60%卡在journalnode端口不通、zkfc健康检查失败、或failover命令无响应。问题不在命令本身而在他们没真正理解ZooKeeper选举机制如何与NameNode状态绑定、journalnode日志同步的原子性保障在哪、甚至不清楚hdfs haadmin -getServiceState nn1返回的active和standby状态是由哪个线程、读取哪个ZK节点路径决定的。所以这篇不是教程汇编而是我把过去八年在某公司数据平台部、某实验室分布式系统课设中踩过的真实坑、调过的关键参数、验证过的最小可行配置、以及被生产环境反向教育过的经验教训全部摊开讲透。它覆盖从VMware资源规划到集群稳定运行72小时的压力测试重点不是“怎么点下一步”而是“为什么这一步不能跳、参数差500MB内存会引发什么连锁反应、日志里那行WARN到底要不要管”。适合三类人刚学完HDFS原理想动手验证的学生、准备跳槽大数据岗位需夯实基础的开发者、以及需要给团队做内部培训的技术负责人——你们要的不是“能跑”而是“知道为什么能跑以及哪里会崩”。2. 整体架构设计与方案选型逻辑2.1 为什么坚持用VMware而非Docker或云主机很多人看到标题第一反应是“都2024年了还用VMwareDocker Compose三行yaml就起三个节点” 这话没错但混淆了学习验证和生产部署的目标差异。我们来拆解三种方案在“理解Hadoop底层机制”这一核心目标下的表现Docker容器方案启动快、镜像复用率高但默认隔离网络栈Hadoop各组件NameNode、DataNode、ResourceManager、NodeManager间依赖的主机名解析、端口暴露、临时目录挂载、JVM堆外内存管理全部需要额外配置。更关键的是Docker的PID namespace会让jps命令失效你无法直观看到每个容器里到底跑了几个Java进程而Hadoop故障排查的第一步永远是jps | grep -E (NameNode|DataNode|ResourceManager)。用Docker学Hadoop相当于用乐高积木学建筑力学——结构能立住但你看不见钢筋应力分布。公有云ECS方案资源弹性、网络策略清晰但成本不可控。一个4节点集群1Master3Slave按最低配2C4G包年计算月均费用约800元若调试期间频繁重启、重装、快照回滚三个月下来够买一台二手工作站。更重要的是云主机默认关闭ICMP pingping master不通时新手第一反应是“网络故障”实际可能是安全组没放通SSH端口——这种干扰项会严重稀释对Hadoop自身网络模型的理解。VMware Workstation/Player方案本地可控、网络模式灵活NAT/桥接/仅主机、快照回滚秒级完成、资源占用可精确限制。最关键的是它完美复现了传统IDC物理机部署的约束条件你需要手动配置静态IP、修改/etc/hosts实现主机名解析、处理SELinux和firewalld的拦截、甚至要面对虚拟网卡驱动导致的netstat -tuln | grep 9000看不到监听端口的诡异问题。这些“麻烦”恰恰是分布式系统工程师每天要面对的真实世界。提示VMware版本选择上Workstation Pro 17对CentOS 7.9兼容性最佳Player免费版功能足够教学使用但不支持快照——这点必须提醒没有快照的Hadoop调试等于没有后悔药。2.2 节点角色划分为什么是1个Master 3个Slave而不是22或11Hadoop集群的节点角色不是随意分配的它直接受限于HDFS副本机制、YARN资源调度粒度、以及NameNode内存压力模型。我们以最典型的三副本HDFS为例HDFS副本放置策略默认策略要求同一文件块的3个副本最多1个存放在客户端所在节点最多2个存放在同一机架且第3个必须跨机架。但在单机VMware环境中“机架”概念需通过topology.script.file.name脚本模拟。若只用2个DataNode当其中一个宕机剩余节点无法满足“3副本”存储要求HDFS会持续报UNDER_REPLICATED警告且hdfs fsck /显示大量块缺失副本。3个DataNode则能容忍任意1个节点故障仍保持全量副本。YARN资源调度瓶颈ResourceManager本身不消耗大量CPU但其调度器CapacityScheduler/FairScheduler需为每个ApplicationMaster分配Container。当NodeManager数量过少如仅1个所有任务挤在单一节点极易触发Container killed on request. Exit code is 143OOM Killer杀进程。实测数据显示在2C4G虚拟机上单NodeManager并发运行超过3个MapReduce任务JVM堆内存溢出概率达78%而3个NodeManager分摊后单节点负载下降至临界值以下。NameNode内存压力模型NameNode内存消耗 ≈1GB (1000 * 元数据对象数)。每个文件/目录占约150字节每个Block占约150字节。假设集群存储10万文件、50万Block元数据对象约60万个NameNode需约10GB堆内存。若只配1个Slave所有Block集中写入NameNode元数据增长速率翻倍GC频率飙升。3个Slave分散写入元数据增长更平滑。因此1 Master 3 Slave是最小可行的生产级验证规模Master承载NameNode、SecondaryNameNode、ResourceManager、JobHistoryServer3个Slave均部署DataNode和NodeManager。这种分配避免了单点瓶颈又控制了资源开销——经实测4台虚拟机Master: 4C8G, Slave: 2C4G在VMware中运行稳定宿主机16G内存无明显卡顿。2.3 操作系统与Hadoop版本选择CentOS 7.9 Hadoop 3.3.6的硬性理由版本选择不是跟风而是基于内核兼容性、Java生态支持、以及社区漏洞修复节奏的综合判断CentOS 7.9内核3.10.0-1160这是最后一个提供长期稳定更新的CentOS 7小版本2024年仍获安全补丁。其systemd服务管理、firewalld规则语法、以及/proc/sys/vm/swappiness内核参数调节方式与Hadoop官方文档完全匹配。若选CentOS 8systemd-journald日志格式变更会导致yarn logs -applicationId命令解析失败若选Ubuntu 22.04则apt install openjdk-8-jdk已废弃需手动编译OpenJDK 8徒增复杂度。Hadoop 3.3.62023年10月发布这是Hadoop 3.x系列最后一个稳定版修复了3.3.4中著名的FileSystem listStatus()内存泄漏HADOOP-18211、以及3.3.5中YARN Timeline Service v2的RPC超时缺陷YARN-11987。更重要的是它对Java 8u361完全兼容——而很多教程推荐的Hadoop 2.10.2在Java 8u301之后会出现java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException根源是JDK 8u301移除了JAXB模块需额外添加--add-modules java.xml.bind启动参数新手极易遗漏。注意Hadoop 3.3.6要求Java 8u292或Java 11但严禁使用Java 17。Hadoop 3.3.x未适配Java 17的强封装特性如--add-opens java.base/java.langALL-UNNAMED会导致hdfs namenode -format时抛出InaccessibleObjectException。我们实测过Java 17下NameNode根本无法启动。3. 核心细节解析与实操要点3.1 VMware资源规划CPU、内存、磁盘的黄金配比很多人搭集群失败第一步就栽在资源分配上。不是“给越多越好”而是要匹配Hadoop各组件的真实内存占用曲线和I/O特征。以下是我们在某实验室20台学生机上压测得出的最优配比宿主机Intel i7-10700K, 32G RAM, NVMe SSD虚拟机角色CPU核心数内存大小系统盘GB数据盘GB关键依据Master48GB40100NameNode元数据缓存需4GB堆内存ResourceManager需2GB堆JobHistoryServer需1GB预留1GB给OS和SSH服务Slave 1~324GB30200DataNode每100GB数据盘需512MB堆内存NodeManager需1.5GB堆HDFS Block缓存需512MB剩余1GB保OS稳定为什么数据盘要单独挂载Hadoop默认将HDFS数据存于/usr/local/hadoop/data若与系统盘共用当DataNode写满磁盘不仅HDFS不可写连/var/log日志都无法记录tail -f /usr/local/hadoop/logs/hadoop-root-datanode-*.log直接报No such file or directory。单独挂载200GB数据盘VMware中添加SCSI控制器→新建硬盘→选择“独立-持久”模式并挂载到/data目录再在hdfs-site.xml中配置property namedfs.datanode.data.dir/name valuefile:///data/hadoop/dfs/data/value /property这样即使/data写满系统盘仍有空间记录关键错误。内存分配的隐藏陷阱VMware默认启用“内存气球驱动”VMware Tools中的vmmemctl当宿主机内存紧张时该驱动会向虚拟机内核申请回收内存导致Hadoop进程被OOM Killer误杀。必须在每台虚拟机的.vmx配置文件中添加memctl.enable FALSE sched.mem.maxmemctl 0并在虚拟机内执行# 禁用Linux内核swappiness避免交换分区拖慢HDFS读写 echo vm.swappiness 1 /etc/sysctl.conf sysctl -p # 关闭透明大页THPHadoop官方明确要求 echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag3.2 网络与主机名配置/etc/hosts的每一行都是关键Hadoop集群所有组件通信不依赖DNS只认/etc/hosts里的静态映射。任何主机名解析失败都会导致Connection refused或UnknownHostException。配置原则只有一条所有节点的/etc/hosts内容必须完全一致且包含所有节点的IP主机名别名。以我们的13集群为例IP规划如下Master: 192.168.10.10 → 主机名master别名namenoderesourcemanagerSlave1: 192.168.10.11 → 主机名slave1别名datanode1nodemanager1Slave2: 192.168.10.12 → 主机名slave2别名datanode2nodemanager2Slave3: 192.168.10.13 → 主机名slave3别名datanode3nodemanager3/etc/hosts文件内容每台机器均需此内容127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # Hadoop集群节点 192.168.10.10 master namenode resourcemanager 192.168.10.11 slave1 datanode1 nodemanager1 192.168.10.12 slave2 datanode2 nodemanager2 192.168.10.13 slave3 datanode3 nodemanager3注意127.0.0.1行必须保留localhost且不能删除或注释。曾有学生为“简洁”删掉localhost导致hadoop version命令报java.net.UnknownHostException: master: master——因为Hadoop启动脚本内部会调用hostname -f获取FQDN而hostname -f在无/etc/hosts映射时会尝试DNS查询失败后回退到127.0.0.1但若该行被删直接抛异常。验证方法每台机器执行# 检查本机主机名是否解析正确 hostname -f # 应输出 master/slave1等 # 检查所有节点是否互通 for host in master slave1 slave2 slave3; do ping -c 1 -W 2 $host | grep 1 received; done # 检查SSH免密登录关键 ssh master date ssh slave1 date ssh slave2 date ssh slave3 date3.3 Java环境配置OpenJDK 8u362的精准安装步骤Hadoop对Java版本极其敏感。我们放弃Oracle JDK选用Adoptium原AdoptOpenJDK提供的OpenJDK 8u362因其通过了Apache Hadoop CI测试套件。安装步骤必须严格遵循下载并校验从 https://adoptium.net/ 下载OpenJDK8U-jdk_x64_linux_hotspot_8u362b09.tar.gz用SHA256校验wget https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u362-b09/OpenJDK8U-jdk_x64_linux_hotspot_8u362b09.tar.gz echo a1b2c3d4e5f6... OpenJDK8U-jdk_x64_linux_hotspot_8u362b09.tar.gz | sha256sum -c解压并软链接避免路径硬编码sudo tar -zxf OpenJDK8U-jdk_x64_linux_hotspot_8u362b09.tar.gz -C /opt/ sudo ln -sf /opt/jdk8u362-b09 /opt/java配置全局环境变量/etc/profile.d/java.shecho export JAVA_HOME/opt/java /etc/profile.d/java.sh echo export PATH$JAVA_HOME/bin:$PATH /etc/profile.d/java.sh echo export JRE_HOME$JAVA_HOME/jre /etc/profile.d/java.sh source /etc/profile.d/java.sh验证与强制指定关键java -version # 必须输出 openjdk version 1.8.0_362 # 修改Hadoop-env.sh强制指定JAVA_HOME绕过系统PATH查找 echo export JAVA_HOME/opt/java /usr/local/hadoop/etc/hadoop/hadoop-env.sh实操心得曾有学员用yum install java-1.8.0-openjdk安装结果CentOS 7仓库提供的是8u345其java.security文件中securerandom.sourcefile:/dev/urandom被注释导致Hadoop SSL握手超时。手动编辑该文件取消注释即可但不如直接用Adoptium二进制包省心。4. 实操过程与核心环节实现4.1 Hadoop 3.3.6全量配置core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四文件详解Hadoop配置不是填空而是理解每个属性如何影响数据流。以下是我们生产验证过的最小可行配置所有路径基于/usr/local/hadoopcore-site.xmlHDFS与YARN的统一入口?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration !-- HDFS默认文件系统URI -- property namefs.defaultFS/name valuehdfs://master:9000/value !-- 注意这里是master主机名非IP -- /property !-- Hadoop临时目录所有节点必须可写 -- property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property !-- 启用Hadoop身份认证简单模式非Kerberos -- property namehadoop.security.authentication/name valuesimple/value /property /configuration为什么fs.defaultFS必须用主机名HDFS客户端通过此URI连接NameNodeNameNode在返回Block位置时会将DataNode地址也以主机名形式返回如slave1:9866。若此处写IP客户端拿到主机名后无法解析导致Failed to connect to slave1。这就是/etc/hosts必须配置的底层原因。hdfs-site.xmlNameNode与DataNode的协同协议?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration !-- HDFS副本数 -- property namedfs.replication/name value3/value !-- 严格匹配节点数 -- /property !-- NameNode元数据存储目录 -- property namedfs.namenode.name.dir/name valuefile:///usr/local/hadoop/hdfs/name/value /property !-- DataNode数据块存储目录 -- property namedfs.datanode.data.dir/name valuefile:///data/hadoop/dfs/data/value !-- 指向独立数据盘 -- /property !-- 启用WebHDFS方便HTTP访问 -- property namedfs.webhdfs.enabled/name valuetrue/value /property !-- NameNode Web UI端口 -- property namedfs.namenode.http-address/name valuemaster:9870/value /property !-- DataNode Web UI端口 -- property namedfs.datanode.http.address/name value0.0.0.0:9864/value /property /configuration关键参数解释dfs.replication3必须≤DataNode总数否则HDFS会持续报UNDER_REPLICATED。若只有2个DataNode此值最大为2。dfs.namenode.name.dir格式必须是file:///开头且路径需chown -R hadoop:hadoop授权。若权限不对hdfs namenode -format会静默失败日志里只有ERROR namenode.NameNode: Failed to start namenode.。yarn-site.xml资源调度的核心契约?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration !-- ResourceManager主机名 -- property nameyarn.resourcemanager.hostname/name valuemaster/value /property !-- NodeManager辅助服务用于MapReduce Shuffle -- property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property !-- NodeManager本地目录存储Container中间数据 -- property nameyarn.nodemanager.local-dirs/name value/usr/local/hadoop/yarn/local/value /property !-- NodeManager日志目录 -- property nameyarn.nodemanager.log-dirs/name value/usr/local/hadoop/yarn/logs/value /property !-- ResourceManager Web UI端口 -- property nameyarn.resourcemanager.webapp.address/name valuemaster:8088/value /property !-- 启用日志聚合便于yarn logs命令 -- property nameyarn.log-aggregation-enable/name valuetrue/value /property /configuration为什么yarn.nodemanager.aux-services必须是mapreduce_shuffleMapReduce的Reduce阶段需要从多个Map Task拉取数据这个Shuffle过程由NodeManager内置的ShuffleHandler服务提供。若此处配置错误如写成shuffleReduce Task会报Connection refused因为找不到正确的服务端口。mapred-site.xmlMapReduce计算框架的开关?xml version1.0 encodingUTF-8? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration !-- 指定MapReduce运行在YARN上 -- property namemapreduce.framework.name/name valueyarn/value /property !-- MapReduce历史服务器地址 -- property namemapreduce.jobhistory.address/name valuemaster:10020/value /property !-- MapReduce历史服务器Web UI -- property namemapreduce.jobhistory.webapp.address/name valuemaster:19888/value /property /configuration注意此文件默认是mapred-site.xml.template需先复制cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml4.2 集群初始化全流程从格式化到服务启动的每一步验证初始化不是hdfs namenode -format一条命令而是包含7个必须验证的环节步骤1创建Hadoop用户与目录授权# 所有节点执行 sudo useradd -m hadoop sudo passwd hadoop sudo usermod -aG wheel hadoop # 创建Hadoop目录并授权 sudo mkdir -p /usr/local/hadoop /data/hadoop sudo chown -R hadoop:hadoop /usr/local/hadoop /data/hadoop sudo chmod 755 /usr/local/hadoop /data/hadoop步骤2分发Hadoop配置到所有节点# 在Master上执行利用SSH免密 for node in master slave1 slave2 slave3; do scp -r /usr/local/hadoop/etc/hadoop/ $node:/usr/local/hadoop/etc/ done步骤3格式化NameNode仅Master执行# 切换到hadoop用户 su - hadoop # 格式化生成VERSION文件是HDFS元数据的起点 hdfs namenode -format # 验证检查/usr/local/hadoop/hdfs/name/current/VERSION是否存在 ls -l /usr/local/hadoop/hdfs/name/current/VERSION提示若格式化失败先检查/usr/local/hadoop/hdfs/name目录权限是否为hadoop:hadoop再检查hadoop.tmp.dir路径是否存在且可写。步骤4启动HDFS顺序不能错# 在Master上启动NameNode start-dfs.sh # 验证NameNodejps应看到NameNode进程 jps | grep NameNode # 验证DataNode在每个Slave上执行jps应看到DataNode ssh slave1 jps | grep DataNode ssh slave2 jps | grep DataNode ssh slave3 jps | grep DataNode # 检查HDFS状态 hdfs dfsadmin -report # 应显示3个Live DataNode步骤5启动YARN同样顺序关键# 在Master上启动ResourceManager start-yarn.sh # 验证ResourceManagerjps应看到ResourceManager jps | grep ResourceManager # 验证NodeManager在每个Slave上执行 ssh slave1 jps | grep NodeManager ssh slave2 jps | grep NodeManager ssh slave3 jps | grep NodeManager # 检查YARN节点状态 yarn node -list # 应显示3个RUNNING状态的NodeManager步骤6启动MapReduce历史服务器# 在Master上执行 mapred --daemon start historyserver # 验证 jps | grep JobHistoryServer # 检查历史服务器状态 curl -s http://master:19888/ws/v1/history/info | python3 -m json.tool步骤7终极验证提交一个MapReduce作业# 创建测试目录 hdfs dfs -mkdir -p /user/hadoop/input # 上传本地文件如/etc/passwd hdfs dfs -put /etc/passwd /user/hadoop/input/ # 运行WordCountHadoop自带示例 hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/hadoop/input /user/hadoop/output # 检查输出 hdfs dfs -cat /user/hadoop/output/part-r-00000 | head -10成功标志hadoop job -list显示作业状态为SUCCEEDEDhdfs dfs -ls /user/hadoop/output显示part-r-00000文件yarn application -list显示应用状态为FINISHED4.3 高可用HA进阶QJM模式NameNode自动故障转移配置单NameNode是学习起点但生产环境必须HA。QJMQuorum Journal Manager是Hadoop 3.x推荐的轻量级HA方案无需ZooKeeper但需JournalNode。配置要点JournalNode部署3个节点奇数保证多数派在master、slave1、slave2上安装JournalNodeslave3不装避免单点# 编辑hdfs-site.xml添加JournalNode配置 property namedfs.namenode.shared.edits.dir/name valueqjournal://master:8485;slave1:8485;slave2:8485/mycluster/value /property property namedfs.journalnode.edits.dir/name value/usr/local/hadoop/journal/value /property启动JournalNode所有3台hdfs --daemon start journalnode格式化JournalNode仅首次在master上执行hdfs namenode -format -clusterId mycluster # 将NameNode元数据同步到JournalNode hdfs namenode -initializeSharedEdits配置NameNode HA角色在hdfs-site.xml中添加property namedfs.nameservices/name valuemycluster/value /property property namedfs.ha.namenodes.mycluster/name valuenn1,nn2/value /property property namedfs.namenode.rpc-address.mycluster.nn1/name valuemaster:9000/value /property property namedfs.namenode.rpc-address.mycluster.nn2/name valueslave1:9000/value /property property namedfs.namenode.http-address.mycluster.nn1/name valuemaster:9870/value /property property namedfs.namenode.http-address.mycluster.nn2/name valueslave1:9870/value /property !-- 启用自动故障转移 -- property namedfs.ha.automatic-failover.enabled/name valuetrue/value /property启动ZooKeeperQJM HA必需需单独部署ZooKeeper集群3节点此处略但强调ZKFCZK Failover Controller进程必须与NameNode同机部署它负责监控NN健康并触发ZK选举。故障转移测试# 查看当前Active NN hdfs haadmin -getServiceState nn1 # 手动杀死Active NN进程 kill -9 $(pgrep -f NameNode.*nn1) # 等待30秒检查nn2是否变为active hdfs haadmin -getServiceState nn2 # 验证HDFS读写是否正常 hdfs dfs -ls /5. 常见问题与排查技巧实录5.1 启动失败类问题速查表现象可能原因排查命令解决方案start-dfs.sh后jps看不到NameNode/usr/local/hadoop/hdfs/name目录权限错误ls -ld /usr/local/hadoop/hdfs/namesudo chown -R hadoop:hadoop /usr/local/hadoop/hdfs/namehdfs dfsadmin -report显示0 Live DataNodeDataNode未启动或网络不通ssh slave1 jps | grep DataNodetelnet master 9000检查/etc/hosts、防火墙、hdfs-site.xml中dfs.datanode.data.dir路径yarn node -list显示0节点NodeManager未启动或yarn-site.xml配置错误ssh slave1 jps | grep NodeManagercat /usr/local/hadoop/etc/hadoop/yarn-site.xml | grep hostname确保yarn.resourcemanager.hostname指向master且所有Slave的yarn.nodemanager.aux-services为mapreduce_shufflehadoop jar ...报Connection refusedResourceManager未启动或端口被占jps | grep ResourceManagernetstat -tuln | grep 8088stop-yarn.sh后start-yarn.sh或检查8088端口是否被其他进程占用5.2 运行时异常类问题深度解析问题1org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/input/_SUCCESS could only be replicated to 0 nodes instead of minReplication(1)本质DataNode未注册到NameNode或NameNode认为DataNode“已死”。排查链路hdfs dfsadmin -report→ 查看Live/Dead DataNode数量若Live为0检查DataNode日志tail -100 /usr/local/hadoop/logs/hadoop-*-datanode-*.log最常见日志报错java.net.ConnectException: Connection refused (Connection refused)→ 检查core-site