☰
Hadoop安装实战:单机与伪分布式模式完整指南
2026/10/7 3:18:44 网站建设 项目流程

很多新手第一次接触 Hadoop 时,最容易栽跟头的地方不是 MapReduce 逻辑,也不是 HDFS 的架构原理,而是第一步——到底怎么把环境装起来。网上一搜 Hadoop 安装,教程五花八门,有些让你直接上三台虚拟机搞完全分布式,结果光 SSH 免密就折腾到半夜,最后连 NameNode 都没起来。所以我在带人的时候,一贯的主张是先跑单机,再上伪分布式,集群的事后面再说。

这次文章就围绕 Hadoop 安装里的两个关键模式展开:单机模式(Local Mode)和伪分布式模式(Pseudo-Distributed Mode)。单机模式适合快速验证安装、跑通一个最简单的 MapReduce 示例;伪分布式则是在一台机器上用多个独立 Java 进程模拟完整的 HDFS 和 YARN 体系,让你真实体验上传文件、提交作业、打开 Web UI 看监控的完整链路。无论你是刚接触大数据的学生、准备转行做开发的新人,还是想在虚拟机上搭一套离线学习环境的老手,这套流程基本可以直接照抄。

我先说结论:只要你把下面这几步走完,Hadoop 单机和伪分布式两种模式全部搞定,大概只需要半天时间。中间每个坑我会用“为什么”解释清楚,而不是让你死记命令。

1. 装之前,先把“单机”和“伪分布式”的定位搞清楚

很多人看到标题里的“单机、伪分布式”会觉得这是同一个东西,其实这完全是两种运行模式,用途和配置差别很大。在学习之前把它们的概念掰扯清楚,后面操作时你才知道每一步到底在干嘛。

1.1 三种部署模式,一张表看懂

Hadoop 官方把部署模式分为三种:本地模式(Local Mode)、伪分布式模式(Pseudo-Distributed Mode)和完全分布式模式(Fully-Distributed Mode)。我先用一张表把它们的核心差异列出来:

部署模式进程数量HDFSYARN典型用途学习成本
本地模式1 个 Java 进程不使用,读写本地文件系统不使用,直接在本地跑 MapReduce快速验证代码、调试逻辑极低
伪分布式5 个以上独立进程启动,NameNode/DataNode 都在本机启动,ResourceManager/NodeManager 都在本机体验完整 Hadoop 工作流中等
完全分布式每台机器若干进程启动,角色分散在多台机器启动,角色分散在多台机器生产环境或真实集群学习较高

本地模式下,Hadoop 就是一个普通的 Java 程序,没有 HDFS,也没有 YARN,MapReduce 作业直接跑在本地文件系统上。而伪分布式模式下,虽然所有角色都挤在同一台机器上,但每个角色都是独立的 Java 进程,通过 Socket 互相通信,和真实集群的交互逻辑几乎一样。你在伪分布式下学会的操作,比如格式化 NameNode、启动 HDFS、通过命令行上传文件、用 Web UI 查看监控,到了完全分布式下全部通用。

1.2 为什么我劝你别一上来就搞三台机器

市面上一堆教程默认你要搭三台虚拟机做完全分布式,我不否认这更接近生产环境,但初学者的核心任务不是复刻一个高可用集群,而是搞明白 MapReduce 和 HDFS 是怎么协作的。

在完全分布式下,你遇到的大部分问题都和环境相关:三台虚拟机网络不通、Master 和 Slave 之间 SSH 免密不成功、防火墙拦截端口、时间不同步导致节点失联。这些问题会疯狂消耗你的耐心,而且排查起来需要集群基础知识,你还没学会走就被迫学着跑。

伪分布式把这些问题全部砍掉了。它不需要多台机器互通,不需要复杂的网络规划,你在本机就能观察 NameNode 和 DataNode 如何协同,ResourceManager 如何为任务分配容器。等你彻底理解了这套机制,再往多节点扩展时,至少你已经知道“正常”是什么样子。我的习惯是:学 Hadoop,先在伪分布式上把 HDFS 命令和 MapReduce 流程玩熟,再考虑集群。

2. 环境准备:版本选择、JDK 与 SSH 免密

在真正写配置文件之前,先把基础环境铺好。这里我推荐一套经过大量验证的版本组合,能帮你避开很多莫名其妙的兼容性问题。

2.1 版本清单与选型建议

我用的这套组合非常“保守”,但正是这种保守让安装过程异常顺利:

组件推荐版本说明
操作系统CentOS 7 或 Ubuntu 22.04命令略有差异,文章会标注
JDKJDK 8(如 8u202)Hadoop 3.x 官方支持 Java 8 和 11
HadoopHadoop 3.3.x(如 3.3.4/3.3.6)挑一个稳定版本就行
虚拟机配置2 核 4G 内存、30G 磁盘伪分布式够用

为什么选 JDK 8 而不是新版 JDK 17?因为 Hadoop 官方发行包对 JDK 版本的验证周期滞后,JDK 8 是经过最多生产案例验证的版本。新版本不是不能用,但你在安装阶段遇到类加载异常的概率会高很多,何必给自己添堵。Hadoop 版本推荐 3.3.x,因为 2.x 版本已经进入维护尾声,而且 3.x 的 NameNode Web UI 端口、默认配置都有调整,学新不学旧。

另外提一句,如果你用的是 Ubuntu 22.04,JDK 安装可以通过 apt 直接装 OpenJDK 8,也可以用 tar 包手动安装。CentOS 7 用户建议直接下载 Oracle JDK 8 或 OpenJDK 8 的 tar.gz 包,统一放到/opt/module目录下管理,这样环境变量配置只有一套路径。

2.2 安装 JDK 并配置环境变量

先创建统一的软件安装目录,我习惯用一个不常动的位置来集中管理大数据组件,方便以后装 Hive、Spark 时保持目录风格一致:

mkdir -p /opt/module

把下载好的 JDK tar 包解压到该目录:

tar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt/module/

接着配置环境变量,编辑/etc/profile:

vim /etc/profile

在文件末尾追加下面几行:

export JAVA_HOME=/opt/module/jdk1.8.0_202 export PATH=$JAVA_HOME/bin:$PATH

保存后使其生效并验证:

source /etc/profile java -version

能看到类似“java version 1.8.0_202”的输出就算成功。这里有一个关键细节:Hadoop 脚本不会自动识别你系统里所有位置的 Java,它会优先读取JAVA_HOME环境变量。如果你干净到连JAVA_HOME都没配,后面执行hadoop命令时十有八九会报错或者只能用系统默认版本,所以这一笔一定不能省。

2.3 SSH localhost 免密登录配置

伪分布式模式启动 HDFS 时,NameNode 需要通过 SSH 登录到本机来拉起 DataNode 和 SecondaryNameNode。如果你不配置免密,每次执行start-dfs.sh都会要你输密码,麻烦不说,自动化脚本还可能直接卡住。

配置免密分成三步:

# 1. 生成密钥对 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 2. 将公钥写入 authorized_keys cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 3. 修正权限 chmod 600 ~/.ssh/authorized_keys

验证一下,能直接登录不提示输密码就说明成功了:

ssh localhost

我遇到不少人在这一步卡住,问题通常是当前用户没有.ssh目录,或者authorized_keys的权限是 644 而不是 600。SSH 对私钥和公钥文件的权限非常敏感,权限过宽它会直接拒绝加载这个文件。另外要注意,如果你配置免密时用的是 root 用户,后面也最好统一用 root 操作,不要一会儿 root 一会儿普通用户,权限差异会引出一堆诡异问题。

2.4 防火墙、主机名与目录规划

伪分布式模式下,所有进程都通过 localhost 通信,理论上防火墙不关也能通,但为了不让端口访问问题干扰你排查,安装阶段建议直接关闭防火墙:

# CentOS 7 systemctl stop firewalld systemctl disable firewalld # Ubuntu / Debian ufw disable

同时确认主机名和/etc/hosts配置一致。我建议保持localhost的默认解析即可:

cat /etc/hosts # 确保存在 127.0.0.1 localhost localhost.localdomain

最后是目录规划。伪分布式会把 NameNode 和 DataNode 的元数据存在本地磁盘,如果你不主动指定,Hadoop 默认会塞到/tmp下。这个坑非常大,因为系统重启后/tmp经常被清空,你的 HDFS 数据说没就没。目录规划我参考了现在业界比较通用的做法:

/opt/module/hadoop-3.3.6 # 安装目录 /opt/module/hadoop-3.3.6/data/tmp # hadoop.tmp.dir /opt/module/hadoop-3.3.6/data/nn # namenode 元数据目录 /opt/module/hadoop-3.3.6/data/dn # datanode 数据目录

3. 先跑单机模式:用自带示例验证安装

在进入伪分布式配置之前,先把单机模式跑通。这一步既验证 Hadoop 安装本身没问题,也让你对 MapReduce 作业的运行流程有个第一印象。

3.1 下载 Hadoop 并配置环境变量

从 Apache 镜像站或者国内镜像源下载 Hadoop 二进制包,这里以 3.3.6 为例:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz tar -zxvf hadoop-3.3.6.tar.gz -C /opt/module/ cd /opt/module mv hadoop-3.3.6 hadoop # 去掉版本号,路径清爽一点

然后再次编辑/etc/profile,追加 Hadoop 相关环境变量:

export HADOOP_HOME=/opt/module/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

执行source /etc/profile后,运行:

hadoop version

能输出版本信息,说明 Hadoop 自带的脚本已经能正确解析你的 JDK 环境。这一步如果报错,不用往下走,先解决环境变量问题,通常集中在JAVA_HOME没配对。

3.2 hadoop-env.sh 里必须显式声明 JAVA_HOME

很多教程不会强调这一步,但它真的很重要。即使你在系统环境变量里已经配好了JAVA_HOME,Hadoop 的启动脚本在某些场景下仍然找不到 Java。最稳妥的做法是直接修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh,把 Java 路径写死:

vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

找到JAVA_HOME相关的行,取消注释并改成你的实际路径:

export JAVA_HOME=/opt/module/jdk1.8.0_202

我见过不少人在伪分布式阶段启动 HDFS 时报一堆 “Cannot find JAVA_HOME” 之类的错误,最后排查半天,就是这个文件里没写。它不是玄学,就是 Hadoop 考虑到某些机器上脚本环境不完整,专门开了这个口子让你显式声明。

3.3 单机模式跑第一个 MapReduce

单机模式不需要启动任何守护进程,你只要确认核心配置文件存在,直接运行 Hadoop 自带的示例 JAR 即可。Hadoop 里有一个经典的示例包,里面有 grep、wordcount、sort 等常用 MapReduce 程序,非常适合新手验证。

比如我们来统计系统/etc/profile文件里哪些单词出现次数最多,可以直接跑 wordcount:

cd $HADOOP_HOME mkdir -p /tmp/input cp /etc/profile /tmp/input/ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /tmp/input /tmp/output

注意,单机模式下输入输出路径都是本地文件系统路径,不是 HDFS 路径。执行过程中你会看到一堆 Map-Reduce 日志,包括 Map 进度、Reduce 进度、最终结果写入时间。运行完成后查看结果:

cat /tmp/output/part-r-00000

能看到单词和次数的统计结果。这里你其实已经完整跑通了一个 MapReduce 作业,只是没有分布式的参与。单机模式的核心价值就在这:帮你把“写代码—打包—提交—看结果”这条链路缩短到最小,用来做代码调试非常舒服。

如果你只想更快验证,官方示例里还带了一个grep程序:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep /etc/profile /tmp/grep-output 'java' cat /tmp/grep-output/part-r-00000

看到包含 “java” 的行片段输出,说明单机模式完全正常。

4. 伪分布式配置:五份配置文件逐一拆解

单机模式过了,接下来就是重头戏伪分布式。所谓伪分布式,本质上就是让 NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager 这些角色全部以独立进程跑在同一台机器上。你要做的,就是通过修改 Hadoop 的配置文件,告诉它“我要用这种模式启动”。

以前改配置是最让人头大的,因为概念不懂的时候,每一行都是天书。我在这里把每一份文件的作用和关键项拆开讲,保证你改完心里有数。

4.1 core-site.xml:告诉客户端“HDFS 在哪”

core-site.xml是 Hadoop 的全局核心配置,最重要的作用是指定默认文件系统地址。伪分布式下,客户端(比如hdfs命令)需要知道 HDFS 的 NameNode 监听在哪里,否则它只会傻乎乎地操作本地文件系统。

编辑$HADOOP_HOME/etc/hadoop/core-site.xml,在<configuration>内加两个属性:

<property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop/data/tmp</value> </property>

fs.defaultFS设置成hdfs://localhost:9000,意思是“默认文件系统是位于本机 9000 端口的 HDFS 集群”。后面的命令行工具和 MapReduce 程序如果不显式指定文件系统,都会默认往这个地址读写。

hadoop.tmp.dir原本默认指向/tmp/hadoop-${user.name},即系统临时目录。前面在目录规划时我特意强调过这个,因为 NameNode 的元数据、DataNode 的数据块副本默认都会存放在这个基础目录下。一旦系统重启清了/tmp,你就得重新格式化集群,而且之前上传到 HDFS 的文件全部丢失。这个属性改成/opt/module/hadoop/data/tmp后,数据就安全了。

4.2 hdfs-site.xml:副本数与数据目录

hdfs-site.xml是 HDFS 的专有配置。伪分布式只有一台机器,数据只能存一个副本,所以必须把副本数设为 1。如果你保持默认的 3,DataNode 会一直尝试复制数据到另外两个节点,日志里疯狂报错,文件状态永远不健康。

<property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/module/hadoop/data/nn</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/module/hadoop/data/dn</value> </property>

dfs.replication设为 1,既符合伪分布式实际情况,也避免无谓的副本复制日志。dfs.namenode.name.dir和dfs.datanode.data.dir分别指定 NameNode 元数据目录和 DataNode 数据块目录。这里有一个细节,目录路径前面要加file://前缀,明确告诉 Hadoop 这是“本地文件系统上的路径”,不要解读成 HDFS 路径。

很多教程会省略这两个属性配置,直接依赖默认的/tmp/hadoop-xxx目录。我不建议你省,因为把元数据目录独立出来,日后你想清理或备份 HDFS 数据,直接看这两个目录就一目了然。

4.3 mapred-site.xml:选择 MapReduce 运行框架

MapReduce 程序需要一个地方来调度任务。在 Hadoop 3.x 里,这里的选择就是 YARN。如果你不配置mapreduce.framework.name,MapReduce 会默认跑在本地框架上,即使你的 HDFS 已经启动了,提交作业后也不会走 YARN。

在$HADOOP_HOME/etc/hadoop/下直接编辑mapred-site.xml(Hadoop 3.x 这个文件名是直接存在的,不像 2.x 需要从 template 复制;如果你用 2.x,请先执行cp mapred-site.xml.template mapred-site.xml):

<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>

这个属性值的含义非常直白:MapReduce 作业的“运行框架”是 YARN。配好之后,你提交的 WordCount 作业就会提交给 YARN 的 ResourceManager,由它安排 NodeManager 启动容器来跑 Map 和 Reduce 任务。

4.4 yarn-site.xml:ResourceManager 与 NodeManager 的配合

YARN 是 Hadoop 2.x 之后才有的资源管理器,它的配置分散在几个关键项。在yarn-site.xml里,至少需要配置两个核心属性:

<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property>

第一个属性yarn.nodemanager.aux-services设置 NodeManager 的辅助服务为mapreduce_shuffle。这可能是最难理解的一个概念,简单点说:MapReduce 作业在 Map 阶段结束后,需要把中间结果“洗牌”到 Reduce 任务所在的节点,这个数据转移动作由 NodeManager 上的辅助服务来完成。如果不配置这项,你的 Map 任务全跑完了,Reduce 阶段永远卡住不动。

第二个属性告诉 ResourceManager 它应该绑定到哪个主机名。伪分布式下直接写localhost即可。如果你机器的主机名和/etc/hosts不一致,这里还会引发地址绑定异常,所以建议主机名这块在前面就统一。

4.5 workers 文件与 hadoop-env.sh 的其他细节

在 Hadoop 3.x 里,还有一个文件需要注意:$HADOOP_HOME/etc/hadoop/workers。在 2.x 中它叫slaves,内容是集群中所有 DataNode/NodeManager 所在的主机名列表。伪分布式下,它的内容只有一行:

localhost

start-dfs.sh脚本会读取这个文件,并通过 SSH 连接文件里每一台机器去启动 DataNode 进程。要是这个文件里的主机名写错了,或者 SSH 免密没配好,就会出现“只有 NameNode 启动、DataNode 死活起不来”的经典情况。

最后再强调一次hadoop-env.sh,如果你在第二步已经设置了JAVA_HOME,这里可以跳过。但我自己在实践中,还是会顺手看一眼是否有多余的系统变量污染,比如CLASSPATH里带了无关路径。把基础环境搅干净,后面出问题能少排查一半。

5. 启动伪分布式集群、Web UI 验证与跑通第一个 HDFS 作业

配置都写好后,就到了最激动人心的环节:启动集群。这里面的顺序和细节,决定你是一次过,还是在日志里找半天错误。

5.1 格式化 NameNode 前的三个检查

在第一次启动 HDFS 之前,需要先格式化 NameNode。格式化会初始化元数据目录,生成一个空的文件系统镜像。格式化前我建议你检查三件事:

第一,确认所有配置文件都已经保存,尤其是core-site.xml和hdfs-site.xml。如果你改了配置但忘了保存,格式化时用的还是旧配置。

第二,确认 SSH 免密生效,执行ssh localhost验证一下。这一步不过,你稍后启动 DataNode 必然失败。

第三,确认目录权限没问题。我建议直接用 root 操作,或者把你当前操作用户对/opt/module/hadoop/data的读写权限放好。

确认完毕后执行:

hdfs namenode -format

看到屏幕输出 “successfully formatted”,同时日志里给出存储目录路径,就说明格式化成功了。这一步有个容易引发灾难的坑:如果你之前已经格式化过一次,然后因为某些原因重新执行格式化,就会导致 NameNode 的 clusterID 和 DataNode 的 clusterID 不一致,后面 DataNode 可能永远无法注册成功。所以格式化这个动作,请只在第一次启动前做。

5.2 一键启动与 jps 进程验证

格式化完成后,就可以正式启动所有守护进程:

start-dfs.sh start-yarn.sh

依次执行后,你会看到 Some 进程开始启动的日志。启动完成后,用jps命令(JDK 自带的 Java 进程状态工具)验证一下:

jps

一个正常的伪分布式集群,至少应该出现以下 5 个进程:

进程名角色作用
NameNodeHDFS 主节点管理文件系统命名空间和元数据
DataNodeHDFS 从节点存储实际数据块
SecondaryNameNodeHDFS 辅助节点定期合并 edit log 和 fsimage
ResourceManagerYARN 主节点资源调度与作业分配
NodeManagerYARN 从节点启动容器执行 Map/Reduce 任务

如果 jps 里少了 DataNode 或 ResourceManager,不要慌,下面第 6 节有排查表。启动阶段看到零星几行WARN util.NativeCodeLoader: Unable to load native-hadoop library是正常的,只是说本地增强库没加载,不影响核心功能。

5.3 Web UI 地址变了:9870 与 8088

验证集群是否真正可用,除了看进程,更直观的方式是访问 Web UI。这里特别提醒一下:如果你以前看过 Hadoop 2.x 的教程,那里面写的 NameNode Web UI 地址是http://localhost:50070,但 Hadoop 3.x 已经改了端口,现在是http://localhost:9870。

打开浏览器访问http://localhost:9870,你能看到 NameNode 的概览页,里面有集群 ID、活动节点数量、HDFS 存储空间使用情况等。再访问http://localhost:8088,是 YARN 的 ResourceManager 页面,这里可以查看正在运行和已完成的作业。

我强烈建议你在部署完成后,用浏览器打开这两个页面点一点,哪怕只是看看。这会让你对“集群正在运行”有非常直观的感受,比任何数字输出都强。

5.4 在 HDFS 上完成一次完整的“上传—跑作业—下载”流程

既然 HDFS 和 YARN 都启动了,我们用一次完整体验收尾。先在 HDFS 上创建目录,把本地文件传上去:

hdfs dfs -mkdir -p /input hdfs dfs -put /etc/profile /input/ hdfs dfs -ls /input

看到文件已经出现在 HDFS 目录中。这里注意,hdfs dfs命令操作的是 HDFS,而不是本地文件系统,所以路径/input是 HDFS 上的路径。如果你想对比体验,可以执行hdfs dfs -cat /input/profile查看远程文件内容。

接下来把 WordCount 作业提交到 YARN 上跑,注意输入路径必须换成 HDFS 路径:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output

这个时候,你可以立刻刷新 YARN 的 8088 页面,会看到一条 Application 正在运行。跑完后用命令查看结果:

hdfs dfs -cat /output/part-r-00000

看到单词统计结果后,再把它下载回本地:

hdfs dfs -get /output /tmp/hdfs-output

到此为止,你已经完整走通了“HDFS 存数据—YARN 跑计算—结果写回 HDFS—取回本地”的闭环。这个闭环就是大数据开发的日常,伪分布式用一台机器帮你把整套流程演练清楚了。

6. 高频翻车现场:这些问题我全踩过

我承认,Hadoop 安装路上几乎没有一个人不踩坑。下面这些问题都是我在实际部署和带新人的过程中反复遇到的,按“现象—原因—解决”的方式整理成速查表。你如果遇到某个,直接对号入座。

6.1 jps 进程少一个,怎么排查

现象可能原因解决方案
没有 DataNodeworkers 文件写错 / SSH 免密失败 / NameNode 与 DataNode 的 clusterID 不一致检查 workers 文件和ssh localhost;到$HADOOP_HOME/logs查看 hadoop-xxx-datanode-localhost.log
没有 ResourceManageryarn-site.xml 中 hostname 配置错误 / 端口冲突确认yarn.resourcemanager.hostname=localhost,检查 8088 端口占用
没有 NodeManageraux-services 配置缺失确认mapreduce_shuffle已配置
SecondaryNameNode 未启动配置文件缺失或目录权限异常查看 logs 下对应日志,确认dfs.namenode.secondary.http-address不冲突

日志是排查的第一依据。$HADOOP_HOME/logs/目录下每个角色都有独立日志文件,报错信息基本都能直接指向原因。不要看到日志很长就慌,搜 “ERROR” 和 “Exception” 两个关键字就够。

6.2 格式化两次导致 DataNode 起不来

这是新手最容易踩的重灾区。你第一次格式化后启动失败,找了半天原因,最后决定“删掉数据重新格式化”,然后 DataNode 就再也起不来了。

原因在于,格式化 NameNode 会生成一个新的 clusterID,而 DataNode 第一次启动后会在自己的数据目录里记录旧的 clusterID。两个节点的 clusterID 对不上,DataNode 就拒绝注册。

解决办法有两种:第一,格式化之前,手动清空 NameNode 和 DataNode 的数据目录(就是你在hdfs-site.xml里配置的那两个目录);第二,修改 DataNode 数据目录里的 VERSION 文件,把 clusterID 改成和 NameNode 元数据目录里的一致。新手建议第一种,简单粗暴。

6.3 Web UI 打不开或端口被占用

访问9870打不开,先确认进程是否都活着。如果进程活着但页面还是不行,用命令检查端口监听:

netstat -tlnp | grep 9870

没输出说明端口没被监听,去看 NameNode 日志。如果端口被其他程序占用,可以在hdfs-site.xml里换掉dfs.namenode.http-address的端口,比如改成 50070 或 9871。注意改完需要重启 HDFS 进程。

6.4 WordCount 作业卡住或容器内存溢出

伪分布式下内存资源很有限。默认情况下,NodeManager 为容器分配的内存可能过大,导致物理内存不足,任务被系统杀掉。典型报错是Container [pid=...,containerID=...] is running beyond physical memory limits。

解决思路是在yarn-site.xml里调低资源上限,比如:

<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>2048</value> </property> <property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>512</value> </property>

这组配置的意义是:NodeManager 最多可分配 2G 内存,单个容器最大申请 2G,MapReduce ApplicationMaster 申请 512M。调完重启 YARN,再次提交作业,内存问题基本消失。

6.5 HDFS 文件上传失败或目录权限不足

上传文件时如果遇到Permission denied,原因是 HDFS 的权限系统默认开启,默认的 superuser 是启动 NameNode 的用户。如果你不是用 root 启动的 HDFS,上传到/根目录时可能被拒。

两个选择:第一,切换成启动 HDFS 的用户身份操作;第二,给目录赋予权限:

hdfs dfs -chmod -R 777 /

伪分布式学习环境直接把权限放开很省事,但生产环境千万别这么干。

写在最后的一点体会

我个人在实际操作中最大的感受是:Hadoop 安装这件事,80% 的问题都不是 Hadoop 本身的问题,而是 Linux 基础没打牢。SSH 配置、环境变量、文件权限、端口通信,这些才是你花时间最多的地方。所以如果你在安装途中卡住了,不妨先离开 Hadoop,回头补一下 Linux 的操作基础,你会发现问题突然变简单很多。

另外建议你把这次安装过程完整记录一份笔记,特别是配置文件里每个属性你查过文档后自己写下的注释。伪分布式装完之后,下一步可以考虑在配置里增加更多参数,比如开启 NameNode HA 的雏形,或者把 ResourceManager 的调度器从默认的 Capacity Scheduler 换成 Fair Scheduler,看看行为差异。总之,把一台机器的伪分布式彻底玩透,比在三台机器上跑通而不求甚解要值钱得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询