1. 项目概述:这不是一次简单的“下载解压”,而是一场对分布式系统底层逻辑的首次触达
“Hadoop安装”这四个字,放在2024年看,表面像一句过时的指令——毕竟云原生、K8s、Serverless已经成了新晋工程师简历里的标配关键词。但如果你真去某高校大数据实验室、某传统制造业的数据中台团队、或者某省级政务数据治理项目现场转一圈,就会发现:Hadoop生态仍是绝大多数离线批处理任务的事实基座,而“Hadoop安装”这个动作,从来不是教科书里“wget + tar -xzf + 配置环境变量”三步走就能闭环的流程。它实际是一次对Java运行时、Linux内核参数、网络拓扑约束、用户权限模型、以及分布式协调本质的综合压力测试。我带过的几期大数据运维实训班里,超过65%的学员卡在“NameNode格式化失败”或“DataNode无法注册到集群”,问题根源90%以上不在Hadoop本身,而在JDK版本与OpenSSL兼容性、SELinux策略拦截、/etc/hosts文件中主机名解析顺序、甚至磁盘inode耗尽这类“非Hadoop问题”。所以这篇内容不叫“Hadoop安装教程”,它更接近一份面向真实生产环境的Hadoop单机伪分布式部署排障手记——从你敲下第一个命令前,就要开始思考:你的Linux发行版内核是否支持cgroups v1?你的Java是Oracle JDK还是OpenJDK 11?你的hostname是否包含下划线?这些细节,决定了你是在30分钟内看到jps输出五个Java进程,还是在日志里和java.net.UnknownHostException搏斗一整个下午。
核心关键词“Hadoop生态”在这里不是虚指。它意味着本次安装不是孤立动作,而是为后续Hive元数据服务、HBase RegionServer、Spark on YARN等组件预留接口规范的起点。因此,所有配置项的选择(比如fs.defaultFS必须设为hdfs://localhost:9000而非file:///)、端口规划(9000、8020、50070、8088等端口的用途与冲突规避)、甚至目录权限(/usr/local/hadoop必须由hadoop用户拥有,且不能是root用户直接解压),都必须服务于未来生态组件的无缝接入。这不是“能跑就行”的玩具环境,而是一个具备可扩展基因的最小可行集群骨架。适合谁?适合刚学完Java基础、对Linux命令有基本操作能力、但从未接触过分布式系统概念的开发者;也适合需要快速搭建验证环境的算法工程师,他们不需要管理集群,但必须确保自己训练好的模型特征能通过HDFS路径被下游调度系统稳定读取。一句话说透:这次安装,是你和分布式世界握的第一只手,握手的力度、角度、温度,决定了后续三年你对“数据一致性”“容错边界”“资源隔离”的直觉是否准确。
2. 整体设计思路:为什么坚持“伪分布式+手动配置”,而不是一键脚本或Docker?
2.1 拒绝黑盒:脚本自动化会掩盖最关键的系统级依赖关系
市面上确实存在大量“Hadoop一键安装脚本”,甚至有封装成GUI的工具。但我在某省交通大数据平台做驻场支持时亲眼见过:运维同事用某知名脚本成功部署后,在上线第三天因/var/log分区满导致NameNode崩溃,排查时才发现脚本默认将hadoop.log.dir指向了系统根分区,而没做任何磁盘空间预警。更致命的是,当需要对接Kerberos认证时,脚本生成的core-site.xml里hadoop.security.authentication参数被硬编码为simple,修改后重启服务却因脚本自动生成的校验和机制被自动覆盖。所以本次设计强制采用纯手工配置方式,每一步都要求你理解其作用域:
hadoop-env.sh里JAVA_HOME的绝对路径,不仅决定Hadoop能否启动,更影响YARN容器内Java进程的类加载器层级;hdfs-site.xml中dfs.namenode.name.dir指定的路径,必须是独立挂载的XFS或ext4文件系统(避免与系统盘IO争抢),且需提前执行chown -R hadoop:hadoop /data/hadoop/namenode;yarn-site.xml里yarn.nodemanager.resource.memory-mb的值,必须小于物理内存的70%(预留系统缓存),且要与/proc/sys/vm/swappiness参数联动调优。
这些决策点,脚本不会告诉你“为什么是这个值”,而手动配置迫使你查阅Hadoop官方文档的Configuration Properties章节,建立对参数语义的肌肉记忆。这不是效率的牺牲,而是认知带宽的必要投资。
2.2 伪分布式是唯一合理的入门路径:它复现了真实集群的通信模型
有人会问:为什么不直接上完全分布式(3节点)?答案很现实:单机伪分布式环境能100%复现NameNode与DataNode之间的RPC协议交互、YARN ResourceManager与NodeManager的心跳机制、以及HDFS客户端SDK的连接逻辑,同时规避了多机器间SSH免密、时间同步(NTP)、防火墙策略等外部干扰因素。我曾用同一套配置,在CentOS 7虚拟机上完成伪分布式部署后,仅需修改workers文件中的主机名列表、调整core-site.xml的fs.defaultFS为hdfs://master:9000,再复制配置到其他节点,30分钟内就完成了3节点集群扩容——因为所有网络通信模型、安全上下文、日志轮转策略已在伪分布式阶段被充分验证。而如果跳过这一步直接上多节点,你会陷入“到底是网络问题还是配置问题”的无限循环。伪分布式就像学游泳时的浮板:它不替代真实水感,但让你专注练习划水动作本身。
2.3 版本选择的硬性约束:Hadoop 3.3.6是当前最稳的“生产就绪”版本
搜索“Hadoop最新版”,你会看到Hadoop 3.4.x甚至4.0.0-alpha的新闻。但根据Apache官方JIRA的Issue修复记录和Cloudera CDP 7.1.10的基线版本,Hadoop 3.3.6是最后一个全面支持Java 8/11双运行时、且无已知DataNode内存泄漏漏洞的稳定版本。关键证据链如下:
- Hadoop 3.4.0移除了对Java 8的官方支持,而某金融客户的核心交易系统仍强制要求JDK 8u292(因FIPS合规认证未更新);
- Hadoop 3.3.4在高并发小文件写入场景下,存在
FsDatasetImpl类的asyncDiskService线程池阻塞问题(JIRA HADOOP-18211),该问题在3.3.6中通过重构AsyncDiskService的队列策略彻底解决; - 所有主流发行版(HDP 3.1.5、CDP 7.1.10、Amazon EMR 6.10.0)的Hadoop组件均基于3.3.6进行patch定制。
因此,本次安装严格锁定hadoop-3.3.6.tar.gz。下载地址必须使用Apache官方镜像站(如https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz),而非某些国内镜像站提供的“加速版”——后者曾被发现篡改了hadoop-common模块的META-INF/MANIFEST.MF签名,导致启用Kerberos后出现GSSException: No valid credentials provided异常。版本选择不是跟风,而是对上游生态兼容性的审慎判断。
3. 核心细节解析:从系统准备到服务验证的17个关键控制点
3.1 系统层预检:5个必须执行的Linux健康检查
在下载Hadoop之前,请先执行以下命令并确认输出符合要求。这是后续所有操作的基石,跳过等于埋雷:
# 1. 内核版本检查(必须≥3.10,低于此版本无法启用cgroups v1) uname -r # 预期输出:3.10.0-1160.el7.x86_64 或更高 # 2. SELinux状态(必须disabled,permissive模式仍可能拦截socket绑定) getenforce # 预期输出:Disabled # 若为Enforcing,执行:sudo setenforce 0 && sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 3. 主机名解析(/etc/hosts必须包含本机IP与hostname的精确映射,且hostname不能含下划线) hostname -f cat /etc/hosts | grep $(hostname -f) # 预期输出:127.0.0.1 localhost.localdomain localhost;192.168.1.100 my-hadoop-node(注意:my-hadoop-node不能是my_hadoop_node) # 4. 时间同步状态(NTP必须运行,时钟偏差>5秒会导致ZooKeeper Session Expired) ntpq -p # 预期输出:至少一行*开头的server(表示已同步) # 5. 磁盘inode使用率(HDFS元数据极度依赖inode,>95%将导致NameNode无法创建edits文件) df -i /usr/local # 预期输出:Use%列<85%提示:第3项主机名检查最容易被忽略。某次我帮某物流公司的数据平台做故障复盘,发现其
/etc/hosts中写的是127.0.0.1 my_cluster,而hostname返回my-cluster(含连字符)。Hadoop内部使用InetAddress.getLocalHost()获取地址,该方法在部分glibc版本下会因DNS解析失败回退到127.0.0.1,导致DataNode向127.0.0.1:9000注册,而NameNode监听的是my_cluster:9000,造成“注册成功但心跳丢失”的诡异现象。解决方案永远是:hostname命令输出必须与/etc/hosts中IP后的第一个字段完全一致,且不含特殊字符。
3.2 Java环境配置:OpenJDK 11的3个致命陷阱
Hadoop 3.3.6官方文档明确支持OpenJDK 11,但实测发现三个必须规避的坑:
陷阱1:OpenJDK 11.0.18+的TLSv1.3默认启用问题
Hadoop RPC框架在SSL握手时若服务端未显式配置ssl.server.keystore.type=JKS,会因TLSv1.3的密钥交换算法不兼容导致SSLHandshakeException。解决方案:在hadoop-env.sh中添加:export HADOOP_OPTS="$HADOOP_OPTS -Djdk.tls.client.protocols=TLSv1.2"陷阱2:JVM堆外内存(Off-Heap Memory)泄漏
OpenJDK 11.0.20之前的版本,DirectByteBuffer的清理机制存在竞态条件。当HDFS频繁读写小文件时,jstat -gc <pid>会显示CCSU(Compressed Class Space Used)持续增长直至OOM。验证方法:jmap -histo:live <namenode_pid> | head -20,若java.nio.DirectByteBuffer实例数>10000即告警。解决方案:升级至OpenJDK 11.0.20+,或在hadoop-env.sh中强制禁用压缩类空间:export HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -XX:-UseCompressedClassPointers"陷阱3:
/dev/random阻塞问题
OpenJDK 11默认使用/dev/random生成加密随机数,而该设备在熵池不足时会阻塞。NameNode启动时若卡在SecureRandom初始化,jstack <pid>会显示线程停留在sun.security.provider.NativePRNG$RandomIO.readFully。解决方案:在hadoop-env.sh中重定向随机数源:export HADOOP_OPTS="$HADOOP_OPTS -Djava.security.egd=file:/dev/./urandom"
实操心得:不要用
apt install openjdk-11-jdk直接安装,Ubuntu 20.04默认源提供的是11.0.11,存在上述陷阱。正确做法是去Adoptium官网下载Eclipse Temurin 11.0.22+7的tar.gz包,解压后配置JAVA_HOME。Temurin是经过LTS认证的OpenJDK发行版,其java -version输出末尾必含+7(表示build number),这是规避早期bug的关键标识。
3.3 Hadoop核心配置文件的逐行精解
3.3.1core-site.xml:HDFS访问入口的语义锚点
<configuration> <!-- fs.defaultFS定义了HDFS的统一命名空间根URI --> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> <description>Default filesystem URI. Must match namenode's dfs.namenode.rpc-address</description> </property> <!-- io.file.buffer.size影响HDFS读写缓冲区大小,过大浪费内存,过小增加系统调用次数 --> <property> <name>io.file.buffer.size</name> <value>131072</value> <!-- 128KB,是Linux page size(4KB)的32倍,适配DMA传输 --> <description>Buffer size for IO operations. Optimal value is multiple of OS page size.</description> </property> <!-- hadoop.tmp.dir是Hadoop所有临时文件的根目录,必须由hadoop用户可写且不在系统盘 --> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> </configuration>关键点解析:fs.defaultFS的localhost必须与/etc/hosts中定义的hostname完全一致。若此处写127.0.0.1,则HDFS客户端SDK会尝试连接127.0.0.1:9000,而NameNode实际监听的是my-hadoop-node:9000(由dfs.namenode.rpc-address决定),导致Connection refused。这是新手最高频错误,根源在于混淆了“网络可达性”和“服务注册地址”的概念。
3.3.2hdfs-site.xml:NameNode与DataNode的契约协议
<configuration> <!-- dfs.namenode.name.dir:NameNode存储fsimage和edits日志的路径 --> <property> <name>dfs.namenode.name.dir</name> <value>file:///data/hadoop/namenode</value> <description>Determines where on the local filesystem the DFS name node should store the name table(fsimage, edits)</description> </property> <!-- dfs.datanode.data.dir:DataNode存储实际数据块的路径 --> <property> <name>dfs.datanode.data.dir</name> <value>file:///data/hadoop/datanode</value> <description>Determines where on the local filesystem a DFS data node should store its blocks.</description> </property> <!-- dfs.replication:HDFS默认副本数,伪分布式必须设为1 --> <property> <name>dfs.replication</name> <value>1</value> <description>Default block replication. Should be 1 in pseudo-distributed mode.</description> </property> <!-- dfs.namenode.http-address:NameNode Web UI监听地址 --> <property> <name>dfs.namenode.http-address</name> <value>localhost:9870</value> <description>The address and the base port where the dfs namenode web ui will listen.</description> </property> </configuration>注意:
dfs.replication设为1是伪分布式环境的铁律。若设为3(生产环境常见值),DataNode启动后会立即向NameNode报告“只有1个节点可用”,NameNode则拒绝接受任何block report,导致hdfs dfs -ls /返回No route to host。这是因为HDFS的副本放置策略要求至少有3个独立节点才能满足minReplication=1的校验逻辑,单节点环境下必须显式降级。
3.3.3yarn-site.xml:资源调度中枢的神经突触
<configuration> <!-- yarn.resourcemanager.hostname:ResourceManager的主机名 --> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> <!-- yarn.nodemanager.aux-services:必须设为mapreduce_shuffle以支持MapReduce --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- yarn.nodemanager.resource.memory-mb:NodeManager可分配给Container的最大内存 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</value> <!-- 物理内存8GB机器的推荐值 --> </property> <!-- yarn.scheduler.maximum-allocation-mb:单个Container可申请的最大内存 --> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>2048</value> <!-- 必须≤yarn.nodemanager.resource.memory-mb --> </property> </configuration>关键参数联动逻辑:yarn.nodemanager.resource.memory-mb(4096MB)减去yarn.nodemanager.resource.cpu-vcores(默认8)对应的CPU开销后,剩余内存需足够容纳NodeManager自身进程(约512MB)+ 日志缓冲区(约256MB)。因此yarn.scheduler.maximum-allocation-mb设为2048MB,既保证单个Spark Executor有足够内存,又为其他Container预留空间。若将此值设为4096,则当用户提交一个--executor-memory 4g的Spark作业时,YARN会因无法满足“单Container独占全部内存”而拒绝调度,报错Failed to reserve container。
4. 实操过程全记录:从解压到服务验证的完整流水线
4.1 环境初始化:创建专用用户与目录结构
绝不允许用root用户运行Hadoop服务!这是生产环境的红线。执行以下命令创建隔离环境:
# 创建hadoop用户组和用户 sudo groupadd hadoop sudo useradd -g hadoop -m -d /home/hadoop -s /bin/bash hadoop sudo passwd hadoop # 设置密码,如hadoop123 # 创建Hadoop安装目录(必须独立于/home,避免inode耗尽) sudo mkdir -p /usr/local/hadoop sudo chown -R hadoop:hadoop /usr/local/hadoop # 创建HDFS数据目录(必须使用独立磁盘分区) sudo mkdir -p /data/hadoop/{namenode,datanode,tmp} sudo chown -R hadoop:hadoop /data/hadoop sudo chmod 755 /data/hadoop # 切换到hadoop用户 su - hadoop实操心得:
/data/hadoop目录必须挂载在独立磁盘上。我曾遇到某客户将HDFS目录放在/home/hadoop下,当用户上传大量日志文件时,/home分区inode耗尽,导致NameNode无法创建新的edits_inprogress_0000000000000000001文件,整个HDFS进入只读状态。解决方案是:sudo mkfs.xfs -f /dev/sdb && sudo mount /dev/sdb /data && echo "/dev/sdb /data xfs defaults 0 0" | sudo tee -a /etc/fstab。
4.2 Hadoop二进制包部署与环境变量配置
# 下载并解压(在hadoop用户家目录下操作) cd ~ wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz tar -xzf hadoop-3.3.6.tar.gz mv hadoop-3.3.6 /usr/local/hadoop # 配置环境变量(编辑~/.bashrc) echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc echo 'export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc source ~/.bashrc # 验证基础命令 hadoop version # 应输出Hadoop 3.3.6此时hadoop version能正常输出,仅证明Hadoop二进制文件可执行,不代表配置正确。真正的考验在下一步。
4.3 核心配置文件编写与权限加固
进入$HADOOP_HOME/etc/hadoop/目录,按前述core-site.xml、hdfs-site.xml、yarn-site.xml内容编写。特别注意:
- 所有XML文件必须用UTF-8编码保存,Windows记事本编辑后需用
iconv -f gbk -t utf-8 core-site.xml > core-site.xml.new && mv core-site.xml.new core-site.xml转换; hadoop-env.sh中JAVA_HOME必须指向OpenJDK 11的绝对路径,例如:export JAVA_HOME=/home/hadoop/jdk-11.0.22+7- 修改
workers文件,将localhost替换为你的hostname(hostname -f输出值); - 执行权限加固:
cd $HADOOP_HOME/etc/hadoop chmod 600 *.xml # 防止敏感配置被其他用户读取 chmod 644 hadoop-env.sh
4.4 NameNode格式化与服务启动
这是最易失败的环节,必须严格按顺序执行:
# 1. 格式化NameNode(仅首次执行!重复执行将清空所有HDFS数据) hdfs namenode -format # 2. 启动HDFS(会同时启动NameNode和DataNode) start-dfs.sh # 3. 启动YARN(会同时启动ResourceManager和NodeManager) start-yarn.sh # 4. 验证Java进程 jps # 预期输出(共5个进程): # 12345 NameNode # 12346 DataNode # 12347 SecondaryNameNode # 12348 ResourceManager # 12349 NodeManager若jps输出少于5个进程,立即检查对应服务的日志:
- NameNode日志:
$HADOOP_HOME/logs/hadoop-*-namenode-*.log - DataNode日志:
$HADOOP_HOME/logs/hadoop-*-datanode-*.log
最常见的DataNode启动失败日志片段:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain java.io.IOException: All directories in dfs.datanode.data.dir are invalid: "/data/hadoop/datanode"原因90%是/data/hadoop/datanode目录权限不是hadoop:hadoop,或磁盘已满。解决方案:sudo chown -R hadoop:hadoop /data/hadoop+df -h /data。
4.5 服务功能验证:5个必须通过的黄金测试用例
启动成功不等于可用。执行以下测试,任一失败即需回溯:
HDFS基础读写测试:
hdfs dfs -mkdir /test echo "hello hadoop" | hdfs dfs -put - /test/input.txt hdfs dfs -cat /test/input.txt # 应输出hello hadoopWeb UI可达性测试: 在浏览器访问
http://localhost:9870(NameNode UI)和http://localhost:8088(YARN UI),确认页面正常加载,且Nodes标签页显示1个Active Node。HDFS健康状态检查:
hdfs dfsadmin -report # 关键字段检查: # Configured Capacity: ≥10GB(证明/data/hadoop/datanode挂载成功) # DFS Used%: <10%(排除磁盘写满) # Live datanodes: 1(证明DataNode注册成功)YARN资源调度测试:
yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 10 100 # 此命令运行MapReduce圆周率估算,成功后输出类似: # Estimated value of Pi is 3.14800000000000000000端口监听验证:
ss -tuln | grep -E ':(9000|9870|8088|8020|8032)' # 应看到: # tcp LISTEN 0 128 *:9000 *:* users:(("java",pid=12345,fd=123)) # tcp LISTEN 0 128 *:9870 *:* users:(("java",pid=12345,fd=124)) # ...(其他端口同理)
注意:测试用例4的MapReduce作业必须成功。若报错
Application application_1234567890_0001 failed 2 times due to AM Container for appattempt_1234567890_0001_000002 exited with exitCode: -1000,大概率是yarn.nodemanager.resource.memory-mb设置过小,导致ApplicationMaster容器无法启动。此时需增大该值并重启YARN。
5. 常见问题与排查技巧实录:来自127次现场排障的精华总结
5.1 问题分类速查表
| 问题现象 | 根本原因 | 排查命令 | 解决方案 |
|---|---|---|---|
jps看不到DataNode进程 | /data/hadoop/datanode目录权限错误或磁盘满 | ls -ld /data/hadoop/datanodedf -h /data | sudo chown -R hadoop:hadoop /data/hadoopsudo df -h /data清理空间 |
| NameNode Web UI打不开(Connection refused) | dfs.namenode.http-address配置为0.0.0.0:9870但防火墙拦截 | sudo firewall-cmd --list-ports | sudo firewall-cmd --permanent --add-port=9870/tcp && sudo firewall-cmd --reload |
hdfs dfs -ls /报Connection refused | fs.defaultFS中的hostname与/etc/hosts不匹配 | ping $(hostname -f) | 修改/etc/hosts,确保127.0.0.1 $(hostname -f)存在 |
| MapReduce作业卡在ACCEPTED状态 | yarn.scheduler.maximum-allocation-mb>yarn.nodemanager.resource.memory-mb | yarn node -list -all | 修改yarn-site.xml,确保maximum-allocation-mb≤resource.memory-mb |
hdfs namenode -format报Permission denied | hadoop.tmp.dir路径由root创建,hadoop用户无写权限 | ls -ld /data/hadoop/tmp | sudo chown -R hadoop:hadoop /data/hadoop |
5.2 高阶排障技巧:如何读懂Hadoop日志的“潜台词”
Hadoop日志不是简单报错,而是分布式系统状态的快照。掌握以下解读方法,效率提升300%:
日志时间戳的时区陷阱:Hadoop日志默认使用UTC时间,而你的
date命令显示本地时间。若看到2024-05-20 08:30:00,123的ERROR,实际对应北京时间16:30:00。解决方案:在log4j.properties中添加log4j.appender.R.DatePattern='.'yyyy-MM-dd-HH,强制使用24小时制。堆栈跟踪中的“第一行”原则:当看到多层嵌套的
Caused by:时,永远先看最底层的Caused by:。例如:java.io.IOException: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]表面是IOException,但根因是
GSSException,说明Kerberos票据未获取。此时应执行kinit -kt /etc/security/keytabs/hdfs.service.keytab hdfs/my-hadoop-node@EXAMPLE.COM,而非修改HDFS配置。GC日志分析法:当NameNode响应缓慢时,检查
$HADOOP_HOME/logs/hadoop-*-namenode-*.gc.log。若发现[GC (Allocation Failure) [PSYoungGen: 1024000K->123456K(1024000K)],说明年轻代空间不足,需增大-Xmn参数。计算公式:-Xmn = 0.3 * -Xmx(如-Xmx4g则-Xmn1228m)。
5.3 生产环境必须追加的3项加固配置
伪分布式验证通过后,若要用于准生产环境,必须补充以下配置:
HDFS Trash机制启用(防误删): 在
core-site.xml中添加:<property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> <!-- 保留24小时 --> </property>启用后,
hdfs dfs -rm /path实际移动到/user/$USER/.Trash/Current/path,24小时内可恢复。YARN日志聚合开启(便于调试): 在
yarn-site.xml中添加:<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> <!-- 保留7天 --> </property>启用后,
yarn logs -applicationId application_1234567890_0001可直接查看所有Container日志。HDFS短路本地读优化(提升性能): 在
hdfs-site.xml中添加:<property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> <property> <name>dfs.domain.socket.path</name> <value>/var/lib/hadoop-hdfs/dn_socket</value> </property>需提前创建socket目录:
sudo mkdir -p /var/lib/hadoop-hdfs && sudo chown -R hadoop:hadoop /var/lib/hadoop-hdfs。
最后分享一个小技巧:每次修改配置后,不要盲目重启所有服务。先执行
hdfs --daemon graceful_stop namenode优雅停止NameNode,再用hdfs --daemon start namenode启动,这样可以避免edit log截断风险。YARN同理,用yarn --daemon stop resourcemanager。这种细粒度控制,是区分脚本使用者和真正理解Hadoop生命周期的关键分水岭。