Hadoop 3.x单机伪分布式安装指南:从环境配置到WordCount跑通

发布时间:2026/9/18 9:26:39
Hadoop 3.x单机伪分布式安装指南:从环境配置到WordCount跑通 1. 写在前面为什么要折腾这个“老古董”如果你是刚接触大数据方向或者正在被学校课程、面试题里的Hadoop折磨那我猜你十有八九卡在了第一步环境装不上代码跑不起来网上教程东一篇西一篇看着热闹照着做却总能踩出几个新坑。这篇就是冲着这个痛点来的目标是让你按着步骤走完一遍Hadoop单机环境能老老实实跑起来NameNode、DataNode、YARN这些进程全部在线WordCount样例能够顺利出结果。注意标题里有“官方手册版”几个字意思是我不瞎写所有安装方式、配置参数、启动命令都以Apache Hadoop官方文档为基础不是网上那些复制粘贴改了又改的旧教程。Hadoop现在最新稳定版已经到3.3.x了和老的2.x在很多配置项上有差别网上大量教程还停留在2.x时代照抄很容易出问题。所以这篇会把3.x版本官方推荐的方式讲透同时提到2.x和3.x的关键差异让你遇到旧教程时知道哪里可能是坑。这篇适合谁看刚接触Hadoop的学生、准备大数据岗面试的开发者、想在自己笔记本上搭一套完整大数据实验环境的人以及被公司分配了“把大数据基础环境搞一下”这个任务又没头绪的运维新人。不管你是Windows本子装虚拟机还是手里有一台闲置Linux服务器或者云主机都能照着弄。2. 安装前必须想清楚的几件事2.1 单机版和“伪分布式”不是一个东西很多人一提Hadoop安装就想到伪分布式但严格来说单机安装配置可以分成两种模式官方文档里区分得很清楚本地模式Local/Standalone Mode所有组件跑在同一个JVM里不启动HDFS守护进程不配置任何分布式文件系统主要用于调试MapReduce程序本身。伪分布式模式Pseudo-Distributed Mode在一台机器上分别启动NameNode、DataNode、ResourceManager、NodeManager等独立进程每个组件是独立JVM但都跑在同一台机器上。这种模式能完整走通HDFS和YARN的调用链路适合学习、开发和测试。这篇教程覆盖后者也就是完整配置HDFS和YARN的伪分布式环境。这种模式是单机学习最实用的形态既能体验完整的Hadoop读写流程和提交作业流程又不用真的凑几台服务器。它和真集群的区别只在于节点数量和物理分布配置和启动流程几乎完全一致后面去搭多节点集群需要改的只是少量配置项。2.2 别再被“Java版本随便装”坑了Hadoop本身是Java写的所以JDK是硬依赖。Hadoop 3.x官方文档明确要求Java 8或Java 113.3.x之后对Java 11的支持更完善Java 17目前不被官方正式支持装了可能会出现各种奇怪的兼容问题。网上有些教程让你装最新版JDK 17甚至21我劝你直接跳过这种坑老老实实装OpenJDK 8。这里解释一下为什么不能随便用新版Hadoop底层的HDFS、YARN和MapReduce框架经过多年演进很多代码依赖的Java API在JDK 9之后被模块化或移除比如JMX相关的内部接口用新版JDK跑经常报ClassNotFoundException或者模块访问错误。不是新版本不好是企业级软件追求稳定迭代速度天然落后于语言版本更新这个取舍你理解了就不会再纠结了。还要注意一个细节Hadoop 3.x已经不再支持Java 7如果你还在用很老的CentOS 6加JDK 7的组合趁早换掉折腾老环境的成本远高于重装一台新系统。2.3 系统选择和用户规划每个坑都是前人趟出来的Hadoop官方文档主要面向Linux环境虽然Windows也能跑需要额外装Winutils但如果你是第一次装我强烈建议直接在Linux上操作。最省心的方案是装一台CentOS 7/8、Rocky Linux、Ubuntu 20.04/22.04系统的虚拟机或云主机2核4G内存起步硬盘20G以上。实际跑起来你会发现Hadoop各组件启动后内存占用轻松超过2G1G内存的机器连格式化这步都会卡死给你看。用户规划上很多人习惯用root直接装和启动Hadoop这能省去一些权限问题但我不推荐。Hadoop官方文档建议用独立用户来运行好处很实在一是避免误操作删掉系统关键文件Hadoop的脚本里有很多rm -rf逻辑以root运行一旦路径变量有问题后果不堪设想二是避免和系统环境变量互相干扰。我一般创建一个叫hadoop的用户单独给它建一个/home/hadoop目录所有安装和运行都在这下面完成干净又安全。3. 下载和安装从官网到本机的完整链路3.1 去哪下载、下载哪个版本Hadoop的官方下载页面是Apache官网的hadoop.apache.org进去之后找到Downloads入口里面会有最近的release版本供选择。国内访问Apache官网速度可能不太理想这种情况推荐用清华大学开源软件镜像站mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/或者阿里云镜像站上面有完整的历史版本目录下载速度快很多文件内容和官方完全一致。版本选择上我建议选当前最新的稳定版本截至这篇教程写作时3.3.x系列是主流稳定版。具体选择哪个小版本可以看看发行日期和已知问题列表不要选太旧的比如3.2.x之前的版本有些安全漏洞没有修复也不要盲目追刚发布几天的新版本。稳妥起见选择一个已经发布超过两个月的版本社区反馈比较充分坑基本都被踩平了。下载时要认准.tar.gz结尾的二进制发行包文件名格式类似hadoop-3.3.6.tar.gz不要下src源码包那个是给二次开发用的编译一次能折腾掉你半天时间。3.2 解压和目录规划为什么我坚持用固定路径拿到tar包之后解压和路径规划是有讲究的。很多人随手解压到哪算哪后面配置时各种找不到路径我建议固定使用一个标准路径。下面是我习惯的做法# 先切到hadoop用户如果没有就创建 sudo useradd -m hadoop sudo passwd hadoop su - hadoop # 创建安装目录 sudo mkdir -p /opt/hadoop sudo chown -R hadoop:hadoop /opt/hadoop # 解压安装包到指定目录 tar -zxvf hadoop-3.3.6.tar.gz -C /opt/hadoop cd /opt/hadoop # 创建软链接方便以后切换版本 ln -s hadoop-3.3.6 hadoop软链接这个技巧是我个人比较喜欢的操作它让/opt/hadoop/hadoop这个路径永远指向当前使用的版本。以后升级Hadoop只需要解压新版本、改一下软链接指向就行所有配置文件路径都不用变。对于要在这个环境上反复做实验、写作业的人来说省下的时间相当可观。另外数据目录我习惯单独规划比如把NameNode的数据放在/opt/hadoop/data/namenodeDataNode的数据放在/opt/hadoop/data/datanode日志单独放/opt/hadoop/logs。这样以后清理数据、排查日志不用在安装目录里翻来翻去。官方默认的临时目录和日志目录都放在/tmp下一旦系统重启被清空HDFS元数据丢失轻则要重新格式化重则集群起不来这是新人最常踩的暗坑之一。3.3 JDK安装别在这步省时间JDK安装的过程本身不复杂但有几个小细节值得注意。以Ubuntu为例直接sudo apt update sudo apt install openjdk-8-jdkCentOS/Rocky Linux则用sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel安装完成后一定要确认JAVA_HOME环境变量Hadoop启动脚本会去读这个变量。很多人配了JAVA_HOME但路径写错或者只配了PATH导致Hadoop启动时报“JAVA_HOME is not set”之类的错误。检查方式which java # 比如输出 /usr/lib/jvm/java-8-openjdk-amd64/bin/java ls -l /usr/lib/jvm/java-8-openjdk-amd64然后把这个路径配置到环境变量里。我一般会把JAVA_HOME和HADOOP_HOME都写进/etc/profile.d/hadoop.sh这个文件Ubuntu/CentOS都认这个目录而不是直接改/etc/profile这样以后清理配置时目标明确不会在几百行的profile文件里找半天。4. 配置文件逐项拆解每个参数我都告诉你为什么4.1 环境变量配置Hadoop找到JDK的第一步Hadoop启动时需要通过bin目录下的脚本找到Java和自身安装路径。官方推荐在etc/hadoop/hadoop-env.sh里设置JAVA_HOME原因很简单这个文件是Hadoop原生读取的不依赖系统级环境变量是否生效。不同的发行版JDK路径差别很大务必用自己机器上实际查询到的路径来填。# 编辑 $HADOOP_HOME/etc/hadoop/hadoop-env.sh export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export HADOOP_HOME/opt/hadoop/hadoop export HADOOP_CONF_DIR/opt/hadoop/hadoop/etc/hadoop export HADOOP_LOG_DIR/opt/hadoop/logs # 注意不要手动设置HDFS_NAMENODE_USER等变量 # Hadoop 3.x的sbin脚本会根据实际组件自动处理用户身份说到HDFS_NAMENODE_USER这个变量网上很多教程会让你在hadoop-env.sh里手动设置成“root”或“hadoop”其实是旧版本2.x和3.0-3.3早期留下的习惯。新版本对sbin下的启动脚本做了修正不需要手动指定这些变量了如果照搬旧教程设置反而可能和启动脚本逻辑冲突导致启动失败。判断一个教程是不是够新看这一条就够了。环境变量配置完成后建议先执行source /etc/profile.d/hadoop.sh刷新环境然后运行hadoop version验证一下看到图1类似的版本信息输出说明Java环境和Hadoop本身已经打通了。Hadoop 3.3.6 Source code repository https://github.com/apache/hadoop -r abcdef123456 Compiled by ubuntu on 2023-04-18T12:00:00Z Compiled with protoc 3.7.1 This command was run using /opt/hadoop/hadoop-3.3.6/share/hadoop/common/hadoop-common-3.3.6.jar4.2 core-site.xml集群的“公共配置中心”core-site.xml里面存放的是所有组件共享的配置项最重要的就是fs.defaultFS它决定了Hadoop的默认文件系统地址和端口。伪分布式模式下我们把它配成hdfs://localhost:9000意思是让HDFS运行在本机的9000端口。configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/data/tmp/value /property property namehadoop.http.staticuser.user/name valuehadoop/value /property /configurationhadoop.tmp.dir这个参数很关键官方文档里说它默认指向/tmp/hadoop-${user.name}这是所有需要临时存储的组件如NameNode的EditLog、DataNode的数据块、MapReduce中间结果的默认根目录。系统重启后/tmp会被清空所以一定要改成持久化目录。我把它指向/opt/hadoop/data/tmp并且在data目录下手动创建好子目录权限保持hadoop用户可读写。hadoop.http.staticuser.user这个参数估计很多人没注意过它决定你访问HDFS Web界面时默认的身份名称。如果不设置默认是dr.who你在HDFS页面上新建目录时会遇到权限不足的报错折腾半天不知道问题在哪。把它改成hadoop再配合稍后说的权限设置可以省掉很多麻烦。4.3 hdfs-site.xml数据存储和副本策略的调整hdfs-site.xml是HDFS的核心配置单机伪分布式模式下需要关注几个参数。官方文档示例中伪分布式模式把副本数设置为1这是有道理的只有一台DataNode如果副本数默认是3数据写入时会因为找不到足够的DataNode而一直处于等待状态最终超时报错。configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///opt/hadoop/data/datanode/value /property property namedfs.namenode.http-address/name valuelocalhost:9870/value /property property namedfs.permissions.enabled/name valuetrue/value /property /configurationdfs.namenode.name.dir和dfs.datanode.data.dir指定元数据和数据块的存储位置这就是前面说的把数据从/tmp迁走的落地操作。注意这里用的是file://前缀表示本地文件系统路径Hadoop 3.x对这个前缀要求比较严格有的版本不加file://也能跑但加上更保险。dfs.namenode.http-address是NameNode Web界面的监听地址Hadoop 3.x默认端口是9870和2.x时代的50070端口不同。如果你照抄2.x教程访问50070必然失败。这个差别很容易被忽略我专门列出来避免你在验证结果时卡住。dfs.permissions.enabled控制HDFS的权限检查开关。默认是true对于学习环境其实可以但如果你只是本地写写MapReduce想省事一些也可以显式设置为false跳过权限问题。不过我不建议这么做学习阶段还是保留真实环境的权限行为比较好不然连着开发环境里的Hive、Spark时权限问题暴露出来你又得回头折腾。4.4 yarn-site.xml资源调度器的关键配置YARN负责集群资源的管理和任务调度伪分布式模式下需要确保ResourceManager和NodeManager都启在同一台机器上并且能相互通信。yarn-site.xml里最关键的配置是ResourceManager的地址和辅助服务。configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.aux-services.mapreduce_shuffle.class/name valueorg.apache.hadoop.mapred.ShuffleHandler/value /property property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property property nameyarn.nodemanager.vmem-check-enabled/name valuefalse/value /property property nameyarn.nodemanager.pmem-check-enabled/name valuefalse/value /property /configurationyarn.nodemanager.aux-services是YARN NodeManager的辅助服务列表MapReduce作业运行依赖shuffle过程来传输Map阶段输出到Reduce阶段所以必须配置为mapreduce_shuffle。旧教程里会让你同时配置mapreduce_shuffle.class这个类名在新版本上其实只配aux-services也能运行但显式指定类名更可靠。vmem-check-enabled和pmem-check-enabled这两个参数是内存检测开关默认开启虚拟内存和物理内存占用超过容器申请额度就杀掉任务。个人电脑上跑实验可用的物理内存本来就有限YARN计算虚拟内存时还会乘一个比例因子经常出现明明机器还有空闲内存任务却被误杀的情况。关掉这两个检测是最省心的做法学习环境里不涉及生产安全的取舍判断。很多人跑WordCount报错“Container killed on request. Exit code is 143”多半就是被这个机制误杀了排查半天找不到原因。4.5 mapred-site.xml让MapReduce跑在YARN上mapred-site.xml控制MapReduce框架的运行模式。这个文件在Hadoop 3.x中可能不存在需要自己复制模板创建cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml然后编辑其中的配置configuration property namemapreduce.framework.name/name valueyarn/value /property property namemapreduce.jobhistory.address/name valuelocalhost:10020/value /property property namemapreduce.jobhistory.webapp.address/name valuelocalhost:19888/value /property /configurationmapreduce.framework.name必须设置成yarn表示作业提交给YARN调度执行。如果忘了配置这一项MapReduce默认在本地运行local你提交作业后看不出问题但YARN监控页面里永远看不到任何作业会让人觉得环境没装好。这个值和yarn-site.xml是配合使用的少了谁后面都会出现诡异现象。JobHistory相关配置是给后续看历史作业用的本地实验可以先不管但配上不影响以后调试作业历史记录时不用再改配置重启。4.6 workers文件告诉Hadoop“节点们在哪”Hadoop 3.x里没有slaves文件了改名为workers别被旧教程带偏了。这个文件用来列出所有DataNode和NodeManager的节点地址伪分布式模式下只需要一行localhost如果你改成真实集群部署这里每行写一个主机名或IP即可。这个文件的格式要特别注意Hadoop脚本读取时按行列出行不支持像普通配置文件那样的#注释行后尾随空格之类的格式错误容易导致加载到空节点名导致启动异常。我习惯在里面只写地址不写任何多余内容。4.7 SSH免密登录少一次输入省一堆麻烦Hadoop启动时通过SSH登录到各个节点这里是localhost来拉起守护进程。如果配置了免密启动脚本跑得又顺又安静没配置的话每次start-dfs.sh都会反复问你密码而且如果是在脚本循环中有的版本SSH密码输入逻辑还会出岔子让你误以为卡死了。实际上Hadoop官网单节点配置教程并没有强制要求SSH但实操时配上能省心很多。配置步骤很简单# 生成密钥对一路回车即可 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa # 把公钥加到authorized_keys中 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 如果是多节点集群需要拷贝到各台机器的authorized_keys里 # 设置权限确保ssh能正常读取 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh # 验证免密 ssh localhost hostname这里有个细节如果之前以root或者其他用户生成过SSH密钥hadoop用户目录下的~/.ssh可能不存在或者权限不对需要先创建和修正。SSH对~/.ssh目录的权限要求非常严格权限过宽会导致免密失效SSH直接拒绝加载密钥这个坑很多人踩过。5. 配置文件都明白了初始化文件系统和启动5.1 为什么必须格式化NameNode以及怎么格式化才安全配置文件改完之后启动HDFS之前必须先初始化NameNode上的元数据目录。这个操作对应命令hdfs namenode -format格式化的本质是在dfs.namenode.name.dir指定的路径下创建文件系统结构生成current/VERSION等元数据文件。这个过程会把NameNode上的命名空间清空相当于把一张空白地图画好等待记录后续目录信息。操作上有一个必须注意的事项HDFS集群启动成功后后续不管是重启还是重新配置都不应该再对NameNode执行格式化操作。格式化会抹掉所有元数据导致DataNode上已有的数据块和NameNode记录的映射关系对不上整个文件系统看起来是空的极难修复。如果你已经存在重要实验数据重新格式化等于全没了而且这种丢失不可恢复。格式化过程中如果出现下图类似的输出说明初始化成功2024-01-01 12:00:00,123 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host localhost/127.0.0.1 STARTUP_MSG: args [-format] ... ************************************************************/ 2024-01-01 12:00:05,456 INFO common.Storage: Storage directory /opt/hadoop/data/namenode has been successfully formatted.如果你看到的是Storage directory already exists且没有格式化的字样说明之前已经格式化过了。这时候就要停下来判断一下如果是第一次安装时误操作重复格式化不影响如果集群本来就有数据千万别手贱带-force参数强刷。5.2 启动HDFS和YARN的完整流程与正常输出格式化完成后就能启动HDFS了。Hadoop 3.x的统一启动脚本是# 启动HDFS相关守护进程 $HADOOP_HOME/sbin/start-dfs.sh # 启动YARN相关守护进程 $HADOOP_HOME/sbin/start-yarn.sh # 或者用一条命令依次启动HDFS和YARN $HADOOP_HOME/sbin/start-all.sh个人习惯是分开执行两个脚本原因简单一个问题好定位。如果start-all.sh启动到一半YARN失败你还得翻日志找是哪个进程的问题不如自己按顺序启动多敲一次命令心里更有数。启动过程如果配置正确会出现若干条“Starting NameNode”、“Starting DataNode”等提示并且伴随着进程被记录的输出。脚本执行完毕之后用jps命令查看Java进程一个正常的伪分布式环境应该至少看到以下几个进程NameNodeHDFS的名称节点DataNodeHDFS的数据节点ResourceManagerYARN的资源管理器NodeManagerYARN的节点管理器jps输出大致如下12345 NameNode 12346 DataNode 12347 ResourceManager 12348 NodeManager 9999 Jps如果少了哪个进程不要慌先看对应日志。日志位置在HADOOP_LOG_DIR之前我们在hadoop-env.sh里配置过HDFS相关日志在logs目录下YARN相关日志也在同一个目录。我用得最多的排查方式是直接tail -n 100 logs/hadoop-hadoop-namenode-localhost.log看到具体异常信息后再决定怎么处理。5.3 通过Web界面验证环境是否真的健康命令行启动成功只是第一步HDFS和YARN本身是否工作正常要看Web界面上的指标。Hadoop 3.x版本的访问地址和2.x不同注意别用老端口。HDFS NameNode Web界面http://localhost:9870YARN ResourceManager Web界面http://localhost:8088浏览器打开HDFS界面后正常状态下Overview页面会显示Live Nodes为1说明DataNode已经注册成功。如果Live Nodes显示为0说明DataNode没有正常连接NameNode常见原因包括hosts文件解析问题、防火墙未放行端口、DataNode和NameNode的clusterID不一致。YARN界面打开后Active Nodes应该显示为1。如果显示0大概率是NodeManager没起来或没注册成功查看nodemanager日志。这里的Active Nodes和HDFS的Live Nodes是两套独立体系一个挂了不影响另一个新手经常只检查其中一个结果HDFS能用、YARN提交作业就跑不起来。另外有本机防火墙的话至少放行以下端口9000端口HDFS RPC、9870端口NameNode Web、9864端口DataNode Web、8088端口YARN Web、9866端口DataNode数据传输。用云服务器的话安全组规则里也要放行这些端口不然只能本机访问外部机器看不到界面。如果你用的是虚拟机可以把防火墙直接停掉做实验毕竟学习环境不需要太注重网络安全隔离sudo systemctl stop firewalld # CentOS/Rocky Linux sudo ufw disable # Ubuntu5.4 第一次提交作业用官方WordCount样例跑通全链路环境启动成功之后拿官方自带的WordCount示例做一次完整的“写数据-读数据-提交作业-查看结果”验证。这是整个安装过程中最让人安心的时刻。首先在HDFS上创建测试目录# 创建目录 hdfs dfs -mkdir -p /user/hadoop/input # 查看目录是否创建成功 hdfs dfs -ls /user/hadoop/然后把一个本地文本文件上传到HDFS。这里建议自己造一个有几句英文的测试文件比如echo hello hadoop hello world /tmp/test.txt echo hadoop is useful /tmp/test.txt echo learn hadoop step by step /tmp/test.txt # 上传到HDFS hdfs dfs -put /tmp/test.txt /user/hadoop/input/Hadoop官方提供了示例jar包位于$HADOOP_HOME/share/hadoop/mapreduce/目录下文件名类似hadoop-mapreduce-examples-3.3.6.jar。使用方法# 运行WordCount作业 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/hadoop/input /user/hadoop/output注意output目录必须是HDFS上不存在的目录如果它已经存在作业会直接报错。这个设计是为了防止覆盖已有结果数据刚开始不熟悉的人经常会在这报“Output directory already exists”的错。解决办法就是换个新名字或者用hdfs dfs -rm -r删除旧目录。作业提交后控制台会滚动输出MapReduce执行进度从map 0%逐步到map 100%、reduce 0%再到reduce 100%。最终看到类似“Job completed successfully”的输出就说明整个链路完全通了。验证结果# 查看输出目录的文件列表 hdfs dfs -ls /user/hadoop/output # 查看结果内容 hdfs dfs -cat /user/hadoop/output/part-r-00000正常会看到类似hadoop 3 hello 2 is 1 learn 1 step 1 useful 1 world 1到这里你的Hadoop单机伪分布式环境已经真正可用了。6. 本地模式到伪分布式两种模式的切换逻辑很多新手会有个疑问我配置了这么多东西如果我突然只想在本地模式跑一个测试不需要HDFS和YARN那些后台进程需要怎么做答案很简单本地模式不需要额外配置Hadoop自带的本地运行能力是默认行为。你把那些XML配置文件里的fs.defaultFS改成file:///或者干脆用另一套配置文件目录启动就能切换到本地模式。实际上MapReduce程序不指定框架名时默认以本地模式运行。一个实用技巧是维护两套配置文件目录。比如安装目录下自带一套etc/hadoop用于伪分布式模式再复制一份etc/hadoop-local里面把mapreduce.framework.name改成localfs.defaultFS改成file:///。启动程序时指定不同的HADOOP_CONF_DIR即可切换互不干扰。这个思路对后续学习Spark、Flink部署方式也有借鉴意义环境隔离永远是减少麻烦的第一原则。7. 常见问题排查与避坑技巧实录7.1 Hadoop命令全家桶你真的会用吗配置和运行过程中你会频繁使用Hadoop自带的命令行工具。这里整理一下最常用的几组每一条都是实际项目中反复用到的。HDFS文件操作hdfs dfs -ls / # 查看根目录 hdfs dfs -mkdir -p /user/hadoop # 创建目录 hdfs dfs -put 本地文件 HDFS路径 # 上传文件 hdfs dfs -get HDFS路径 本地目录 # 下载文件 hdfs dfs -cat HDFS路径 # 查看文件内容 hdfs dfs -rm -r HDFS路径 # 递归删除用前确认路径 hdfs dfs -du -h /user/hadoop # 查看目录占用空间进程和集群管理hdfs dfsadmin -report # 查看DataNode健康状态和数据块情况 hdfs dfsadmin -safemode leave # 手动退出安全模式 hdfs haadmin -getAllServiceState # HA模式查询状态伪分布式用不上 yarn node -list # 查看YARN上注册的NodeManager yarn application -list # 查看正在运行的作业 yarn application -kill application_id # 杀掉卡死的作业遇到任何命令报找不到类或者类似NoClassDefFoundError的问题先确认环境变量HADOOP_CLASSPATH是否配置正确。这在后面整合Hive或者Spark的时候尤为重要很多整合难题其实根源都在CLASSPATH没包含Hadoop生态的依赖包。7.2 端口冲突9000和8088被占用怎么办Hadoop默认使用一堆端口如果同一台机器上还跑着其他服务可能存在冲突。最常见的是8088端口被其他Web服务占用或者9000端口被某些中间件占用比如Nacos、Dubbo的默认端口是8848还好但有些服务确实会把9000作为HTTP服务端口。解决思路有两个改Hadoop配置比如把yarn.resourcemanager.webapp.address改成8089等未占用端口。先停掉占用端口的其他服务或者把Hadoop调整到其他端口。排查端口占用ss -tlnp | grep 8088 # 或 lsof -i:8088如果看到进程没有用那就是端口还没监听起来问题在进程启动那一步。7.3 常见错误速查表错误信息原因解决方式JAVA_HOME is not set and could not be found没有正确配置JAVA_HOME在hadoop-env.sh中显式设置JAVA_HOME路径Cannot create directory /user/hadoop. Name node is in safe modeNameNode处于安全模式等待安全模式自动退出或执行hdfs dfsadmin -safemode leaveContainer killed on request. Exit code is 143YARN内存检测误杀容器将yarn.nodemanager.vmem-check-enabled和pmem-check-enabled设为falseThere is no more space available in the virtual memory虚拟内存不足调整yarn.nodemanager.vmem-pmem-ratio或关闭内存检测Output directory hdfs://localhost:9000/... already exists输出目录已存在换新目录名或用hdfs dfs -rm -r删除旧目录Operation category READ is not supported in state standby误访问了Standby节点检查是否有多个NameNode配置文件确保只配了一个Incompatible clusterIDsDataNode集群ID与NameNode不匹配清理DataNode的current目录重新格式化注意数据会丢失Name or service not knownhosts文件没有主机名映射在/etc/hosts中添加localhost和主机名映射Could not resolve hostname XX主机名解析失败修正/etc/hosts确保ssh localhost解析正常7.4 重新格式化导致的“DataNode起不来”这是我在教学和答疑过程中遇到频率最高的一个问题。流程通常是Hadoop第一次跑起来了隔几天想重新搭一遍或者照着教程又格式化了一次结果再启动时NameNode正常、DataNode却一直起不来日志里报Incompatible clusterIDs。这是Hadoop的一个自我保护机制DataNode会记录自己所属集群的clusterIDNameNode重新格式化后生成了新的clusterID两边对不上DataNode拒绝提供服务。解决办法是同时清理两边的数据目录再重新格式化# 停止服务 $HADOOP_HOME/sbin/stop-dfs.sh # 清理元数据和数据 rm -rf /opt/hadoop/data/namenode/* rm -rf /opt/hadoop/data/datanode/* rm -rf /opt/hadoop/data/tmp/* # 重新格式化 hdfs namenode -format # 重新启动 $HADOOP_HOME/sbin/start-dfs.sh这里再次提醒如果HDFS上有重要数据这个操作会把数据全部清空。格式化之前一定要备份或确认不需要保留。线上环境的HDFS元数据是可以通过备份恢复的但伪分布式没有做备份机制删了就没了。7.5 日志文件里的“线索”怎么定位问题所有Hadoop守护进程的日志都在HADOOP_LOG_DIR下面日志文件命名方式遵循hadoop-{user}-{daemon}-{hostname}.log的格式。比如hadoop-hadoop-namenode-localhost.logNameNode日志hadoop-hadoop-datanode-localhost.logDataNode日志hadoop-hadoop-resourcemanager-localhost.logResourceManager日志hadoop-hadoop-nodemanager-localhost.logNodeManager日志排查问题第一件事是打开对应进程的日志翻到最后的Exception或者ERROR。很多新手不习惯看日志就直接百度报错但日志里往往已经写清楚了原因和具体类名远比搜索引擎里泛泛而谈的答案更精准。看日志的时候重点关注Caused by后面的内容那才是问题的根因前面的Exception信息可能只是表象。8. 最后再分享几个小技巧走了这一整套流程Hadoop单机伪分布式环境就算彻底跑通了。但有些经验不在安装教程里是我实际用了很久之后才体会到的在这里一并分享给大家。第一个技巧是关于环境变量管理的。养成把所有大数据组件的环境变量统一放在/etc/profile.d/下的习惯每装一个组件新建一个对应的.sh文件比如hadoop.sh、hive.sh、spark.sh各管各的互不干扰。以后环境出了问题排查或者要换版本改一处就好不用在/etc/profile里大海捞针。第二个技巧是给自己建立一个“启动清单”。Hadoop的启动顺序是HDFS - YARN关停顺序反过来YARN - HDFS。如果后期还装了Hive、HBase启动关系会更复杂。把这些依赖关系记在一张表里每次开实验环境照着执行能避免很多“为什么Hive连不上”这类低级问题。第三个技巧和日常使用有关HDFS命令行工具hdfs dfs与Hadoop 2.x时代的hadoop fs命令在很多教程里混着用新版里两个都能执行但hdfs dfs更聚焦于文件系统操作hadoop fs同时兼容本地文件系统。我习惯用hdfs dfs语义更清晰。另外如果你用的是Windows本子远程访问Hadoop可以通过Web界面操作HDFS文件不一定非要在Linux终端里敲命令。在NameNode的9870端口界面里有个Utilities - Browse the file system入口可以直接浏览、上传、下载文件和目录做实验验证非常方便。最后一个建议关乎长期使用保持学习环境整洁的另一个重要手段是定期查看/opt/hadoop/logs目录的大小。跑过大量作业后日志文件增长速度快得超出想象不清理的话硬盘很快就满了。我一般会保留最近一个月的日志更早的直接清掉或者配置脚本定期清理。Hadoop单机环境的搭建算是大数据实操路上的第一道门槛。这道门槛看起来琐碎但每踩过一个坑你对Hadoop整体架构的理解都会加深一层。现在环境已经通了接下来可以放心去试HDFS命令、写MapReduce程序、整合Hive或者Spark不用再担心底层环境的干扰。