这次我们直接进入 Hadoop 课程的核心路线来拆:不是只讲概念,而是从伪分布式搭建、集群部署、HA 高可用、Zookeeper 整合,到 DistCp 参数、面试题和常见排错,完整跑一遍大数据入门必须掌握的实操链路。
如果你正在准备 Hadoop 课程设计,或者在自学大数据平台的安装与配置,这篇文章会非常有用。我会把每一步需要验证的点、常见失败原因、命令示例都整理出来,方便你直接复制到自己的实验室环境操作。学习 Hadoop,关键不是背文档,而是能在一台或几台机器上把 HDFS 和 YARN 跑起来。
Hadoop 课程最终要掌握的不只是启动几个进程,而是理解分布式存储和分布式计算的协作关系。伪分布式解决“能不能跑通”的问题;全分布式解决“多节点协作”的问题;HA 解决“单点失效”的问题;Zookeeper 则负责协调状态。下面逐层展开。
1. Hadoop 课程核心能力速览
| 能力项 | 说明 |
|---|---|
| 课程主题 | Hadoop 安装与配置、伪分布式搭建、全分布式集群搭建、HA 高可用、Zookeeper 整合、HDFS 操作、MapReduce 作业、DistCp 使用、面试题整理 |
| 适用人群 | 数据科学与大数据专业学生、大数据平台开发工程师、准备大数据面试的求职者、自学 Hadoop 的开发者 |
| 学习目标 | 掌握 HDFS 和 YARN 的架构原理,熟悉 Hadoop 集群的部署流程,能独立完成伪分布式和简单分布式集群的安装配置 |
| 推荐硬件 | 单机学习建议内存 8G 以上,集群实验至少 3 台虚拟机,每台内存 2G~4G,磁盘 50G 以上 |
| 操作系统 | Linux 优先,推荐 CentOS、Ubuntu、Rocky Linux;Windows 可通过虚拟机或 Docker 模拟 |
| 基础依赖 | JDK 8、SSH 免密登录、Hadoop 安装包、Zookeeper 安装包(HA 场景)、Docker(可选) |
| 启动方式 | 命令行启动,也可用一键脚本或 Docker 镜像简化操作 |
| 是否支持 API | Hadoop 提供 FileSystem API 和 REST API,可通过 Java、Python(hdfs 库)调用 HDFS 接口 |
| 是否支持批量任务 | 支持,MapReduce、DistCp、定时调度(Oozie/Airflow)均可处理数据批处理 |
| 适合场景 | 数据仓库入门、离线日志分析、课程设计、分布式文件系统学习、MapReduce 计算练习 |
这里不写死具体版本,是因为 Hadoop 生态迭代较快,不同发行版(Apache、CDH、HDP 等)的配置文件和启动方式有差异。实际学习时建议统一使用 Apache Hadoop 的某一个稳定版本,并记录安装包版本、JDK 版本和系统版本,避免后期排查问题时无从入手。
2. Hadoop 课程适用场景与学习边界
Hadoop 最核心的定位是解决大规模数据的可靠存储和分布式计算。在课程练习中,它通常用于以下场景:
- 把大量的日志文件、文本文件放入 HDFS,验证文件切块和副本机制。
- 编写简单的 MapReduce 程序,统计词频、计算用户访问量、清洗数据。
- 用 Hive 或 Spark 在 Hadoop 之上做结构化查询,但课程起步阶段可以先只看 Hadoop 本身。
- 用 DistCp 在集群之间或目录之间复制数据,理解跨节点数据传输。
- 通过 Zookeeper 配合实现 NameNode HA,验证 Active/Standby 状态切换。
Hadoop 不适合所有场景。实时查询、小文件随机读写、复杂的多表关联计算、需要毫秒级响应的业务,不应该优先选择 Hadoop。MapReduce 的磁盘迭代机制决定了它更适合离线批处理,不适合交互式分析。在学习时也要分清“企业级生产拓扑”和“实验环境”的差异,实验环境不需要完全复刻生产容灾方案,但必须理解原理。
使用边界也很重要。如果在虚拟机或云平台上做实验,要注意:
- 安装软件前检查是否具备管理员权限。
- 集群实验不要暴露公网端口,避免被扫描和恶意访问。
- 涉及生产数据时,必须获得数据使用授权,不得把未脱敏的用户信息随意放到实验集群。
- 如果使用 Docker 镜像,注意镜像来源的可靠性,不要运行来路不明的镜像。
3. Hadoop 本地学习环境准备
无论你是做 Hadoop 课程设计,还是准备 Hadoop 面试题,环境准备都是第一步。建议先在一台 Linux 虚拟机或使用 Docker 镜像完成伪分布式搭建,成功后再扩展到多台机器。
3.1 系统与硬件检查
学习阶段的推荐配置如下:
- CPU:4 核以上,伪分布式可以降低要求,但集群实验建议每个节点不少于 2 核。
- 内存:单机学习 8G 起,NameNode + DataNode + ResourceManager 都跑在同一台机器上时,内存占用会上升。3 节点集群建议宿主机 16G 内存,每个虚拟机分配 2G~4G。
- 磁盘:至少预留 50G。HDFS 的副本机制会消耗额外存储,数据量大时磁盘很容易吃紧。
- 网络:使用 NAT 或桥接模式都可以。多个虚拟机之间必须能互相 ping 通。
3.2 安装 JDK 并配置环境变量
Hadoop 底层是 Java,安装前需要确认 JDK 版本。下面以 JDK 8 为例,给出通用命令。
# 查看是否已经安装 JDK java -version # 如果未安装,使用包管理器安装 OpenJDK 8 sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel配置JAVA_HOME时,需要把路径替换为实际安装路径。
sudo vi /etc/profile export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export PATH=$PATH:$JAVA_HOME/bin source /etc/profile3.3 配置 SSH 免密登录
Hadoop 启动时,NameNode 需要通过 SSH 免密登录到各台机器上启动 DataNode。伪分布式环境下通常只需要配置本机 localhost 免密。
# 生成密钥,按提示直接回车即可 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 把公钥追加到 authorized_keys cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 验证免密登录 ssh localhost如果是多节点集群,需要把每台机器的公钥都加入所有节点的authorized_keys文件中。这一步没做好,经常会导致 start-dfs.sh 启动后部分节点没有进程。
3.4 下载 Hadoop 并解压
从 Apache Hadoop 官网下载稳定版二进制包后,放到/opt目录下解压。解压后建议把目录名改成便于记忆的版本路径。
cd /opt wget https://dlcdn.apache.org/hadoop/common/stable/hadoop-x.x.x.tar.gz tar -zxvf hadoop-x.x.x.tar.gz mv hadoop-x.x.x hadoop把 Hadoop 的bin和sbin目录加入 PATH,并在配置文件里明确HADOOP_HOME。这一步容易忽略,会导致执行hdfs命令时报 command not found。
sudo vi /etc/profile export HADOOP_HOME=/opt/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin source /etc/profile4. Hadoop 伪分布式搭建与验证
伪分布式是 Hadoop 课程里最优先要掌握的搭建方式。它用一台机器模拟分布式环境,每个守护进程都运行在本地,是理解 HDFS 和 YARN 工作机制的最短路径。
4.1 修改配置文件
进入 Hadoop 配置目录。
cd /opt/hadoop/etc/hadoop伪分布式需要修改 4 个核心文件:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。先从模板复制mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml配置core-site.xml,指定默认文件系统为hdfs://localhost:9000。
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/tmp</value> </property> </configuration>配置hdfs-site.xml,设置副本数为 1。伪分布式只有一台机器,如果副本数保持默认的 3,DataNode 可能因为剩余副本不足而一直报错。
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hadoop/data</value> </property> </configuration>配置mapred-site.xml,指定 MapReduce 运行的框架为 YARN。
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>配置yarn-site.xml,指定 ResourceManager 的地址。这里要注意,新版 Hadoop 还会启动 WebAppProxy,如果把 bind-host 写成0.0.0.0,在部分环境中会绑定失败,设置成本机地址更稳妥。
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>同时,建议在hadoop-env.sh中显式设置JAVA_HOME。
vi /opt/hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk4.2 格式化 NameNode
首次启动前必须格式化 NameNode。这一步会初始化文件系统的元数据目录。格式化是以当前操作用户的身份执行,后续启动 Hadoop 时也必须使用同一个用户,否则可能出现权限问题。
/opt/hadoop/bin/hdfs namenode -format格式化成功后,日志里会出现successfully formatted之类的信息。此时检查/opt/hadoop/name目录下是否生成了current目录。不要把格式化当成万能操作,每次重新格式化会导致旧的数据和元数据失效。
4.3 启动 HDFS 和 YARN
启动 HDFS。
/opt/hadoop/sbin/start-dfs.sh启动 YARN。
/opt/hadoop/sbin/start-yarn.sh启动后用jps查看 Java 进程。伪分布式正常情况下应该出现以下进程:
- NameNode
- DataNode
- SecondaryNameNode
- ResourceManager
- NodeManager
执行jps时注意,每个进程前面是进程号,后面是进程名。如果缺少 DataNode,优先查看日志目录/opt/hadoop/logs中的hadoop-*datanode*.log,多数情况下是配置路径或格式化冲突导致。
4.4 验证 Web 界面
Hadoop 提供了 Web UI 来查看集群状态:
- NameNode Web 界面:
http://localhost:9870。旧版本是50070。可以查看 HDFS 存储容量、DataNode 节点列表和文件目录。 - YARN ResourceManager Web 界面:
http://localhost:8088。可以查看运行的 MapReduce 作业和节点资源情况。 - SecondaryNameNode 界面:默认端口
9868或50090,主要用于检查检查点状态。
如果浏览器打不开这些页面,检查是否配置了防火墙。在虚拟机中可以临时关闭防火墙。
sudo systemctl stop firewalld4.5 执行一个最简单的 HDFS 命令
伪分布式能不能正常工作,最终要看 HDFS 读写。
hdfs dfs -mkdir -p /test/input hdfs dfs -put /etc/profile /test/input/ hdfs dfs -ls /test/input hdfs dfs -cat /test/input/profile如果以上命令能正常执行,说明 HDFS 的基本写入和读取链路已经通了。这也是 Hadoop 课程里第一个必须通过的验收标准。
5. Hadoop 全分布式集群搭建
伪分布式跑通之后,才适合做全分布式集群。集群实验最少需要 3 个节点:一个主节点,两个从节点。主节点运行 NameNode 和 ResourceManager,从节点运行 DataNode 和 NodeManager。
5.1 节点规划
| 节点 | 主机名 | 角色 |
|---|---|---|
| 节点1 | hadoop01 | NameNode、ResourceManager |
| 节点2 | hadoop02 | DataNode、NodeManager |
| 节点3 | hadoop03 | DataNode、NodeManager |
把每个节点的/etc/hosts都配置成相同的映射关系。
192.168.137.11 hadoop01 192.168.137.12 hadoop02 192.168.137.13 hadoop035.2 配置 workers 和免密登录
在 Hadoop 2.x 中,从节点列表文件叫slaves;在 Hadoop 3.x 中,改成workers。你的 Hadoop 版本里对应的是哪个文件,就以哪个文件为准。
vi /opt/hadoop/etc/hadoop/workers hadoop02 hadoop03配置完 workers 后,在主节点执行免密登录配置。把hadoop01的公钥发给hadoop02和hadoop03,再把hadoop02、hadoop03的公钥互相发给其他节点。
ssh-copy-id hadoop02 ssh-copy-id hadoop03测试三台节点之间都能免密登录。
ssh hadoop02 hostname ssh hadoop03 hostname5.3 分发 Hadoop 安装包和 JDK
在主节点上完成 Hadoop 的解压和配置之后,把整个安装目录和 JDK 目录同步到其他节点。最简单的方式是使用scp或rsync。
scp -r /opt/hadoop hadoop02:/opt/ scp -r /opt/hadoop hadoop03:/opt/实际操作中不建议反复手动复制,每台机器的临时目录、日志目录、数据目录最好保持一致。如果某个节点上的配置和主节点不一致,启动时会出现进程数不齐或 DataNode 不连续的问题。
5.4 格式化并启动集群
首次启动集群时,在主节点执行格式化。
hdfs namenode -format然后启动整个 HDFS 和 YARN。
/opt/hadoop/sbin/start-dfs.sh /opt/hadoop/sbin/start-yarn.sh启动完成后,分别在hadoop02和hadoop03上执行jps,应能看到DataNode和NodeManager进程。
Web 界面上可以看到 DataNode 节点的数量和容量信息。如果某个 DataNode 没有注册进来,检查该节点的log目录下的hadoop-*datanode*.log,常见原因是集群 ID 不一致、防火墙未关闭、主机名无法解析。
6. Hadoop HA 高可用与 Zookeeper 整合
HA 是 Hadoop 课程里难度较高的部分。它通过让两个 NameNode 一主一备,实现元数据的热备份和自动故障切换。Zookeeper 在这里扮演的是分布式协调者角色,负责维护 Active NameNode 的选举结果,并在 Active 节点故障时通知 Standby 节点切换。
6.1 引入 JournalNode
HA 的关键是让 Active NameNode 和 Standby NameNode 共享编辑日志。Active NameNode 把编辑日志写入一组 JournalNode,Standby NameNode 从 JournalNode 读取日志,从而保持元数据一致。
生产环境通常配置 3 个 JournalNode,用于达到多数派投票条件。实验环境下至少配置 3 个,否则无法形成多数派判断。
6.2 修改 HA 相关配置
core-site.xml中需要配置逻辑名称和 Zookeeper 地址。
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property> </configuration>hdfs-site.xml中需要配置 NameNode 服务 ID、NameNode 节点列表、JournalNode 地址以及故障切换类。
<configuration> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop02:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop01:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop02:9870</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>ha.failover-controller.cli-check.enabled</name> <value>true</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/hadoop/jn</value> </property> </configuration>以上是通用模板,实际参数需要按你的主机名和端口调整。
6.3 启动 Zookeeper 集群
HA 依赖 Zookeeper。先在每台节点上配置zoo.cfg,指定dataDir和集群节点列表。
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/data clientPort=2181 server.1=hadoop01:2888:3888 server.2=hadoop02:2888:3888 server.3=hadoop03:2888:3888每台节点的dataDir下创建myid文件,内容分别为 1、2、3。启动 Zookeeper。
/opt/zookeeper/bin/zkServer.sh start启动后查看状态。
/opt/zookeeper/bin/zkServer.sh status如果输出leader或follower就说明集群选举正常。这里最常出现的问题是 2181 端口被占用,或者myid文件内容写错。
6.4 初始化 HA 元数据
先把 Zookeeper 中与 HDFS 相关的内容注册好。
hdfs zkfc -formatZK然后分别启动 JournalNode。
/opt/hadoop/sbin/hadoop-daemon.sh start journalnode在第一个 NameNode 上格式化。
hdfs namenode -format启动第一个 NameNode。
/opt/hadoop/sbin/hadoop-daemon.sh start namenode在第二个 NameNode 上同步元数据。
hdfs namenode -bootstrapStandby最后启动 ZKFC。
/opt/hadoop/sbin/hadoop-daemon.sh start zkfc当所有进程起来后,访问两个 NameNode 的 Web 界面,应该能看到一个处于 Active 状态,另一个处于 Standby 状态。手动kill掉 Active 进程,再刷新界面,可以看到 Standby 在几十秒内切换为 Active。这一步是通过 Zookeeper 整合实现 HA 的核心验证流程。
7. HDFS 常用操作与 DistCp 参数说明
HDFS 的命令行操作是 Hadoop 课程设计里非常实用的部分。无论后续是否使用 Hive 或 Spark,你都需要掌握文件上传、下载、目录管理和复制的基础命令。
7.1 常用文件命令
# 创建目录 hdfs dfs -mkdir -p /data/logs # 上传本地文件 hdfs dfs -put /home/user/app.log /data/logs/ # 查看文件列表 hdfs dfs -ls -R /data # 下载文件 hdfs dfs -get /data/logs/app.log /home/user/ # 查看文件块信息 hdfs fsck /data/logs/app.log -files -blocks如果你使用 Python,也可以通过hdfs库调用 HDFS API。
from hdfs import InsecureClient client = InsecureClient(url='http://hadoop01:9870', user='root') # 上传文件 client.upload('/data/python/test.txt', '/home/user/test.txt') # 读取文件 with client.read('/data/python/test.txt') as reader: print(reader.read())7.2 DistCp 参数说明
DistCp 是 Hadoop 自带的跨集群或跨目录数据复制工具,命令写法类似cp,但底层使用 MapReduce 完成并行拷贝。
hadoop distcp hdfs://hadoop01:8020/data/logs hdfs://hadoop02:8020/backup/logs生产环境中,数据量较大时建议加上并行度和校验参数。常见参数如下:
| 参数 | 作用 |
|---|---|
-m | 设置最大并行数,默认 20 |
-r | 设置每个 map 任务的重试次数,默认 3 |
-skipcrccheck | 跳过 CRC 校验,能加快拷贝速度,但不建议用于关键数据 |
-update | 只覆盖源目录中已变化或新增的文件 |
-delete | 删除目标目录中源目录没有的文件,适合目录同步 |
-diff | 对比源目录与目标目录的差异,并在日志中输出差异项 |
一个比较稳妥的同步命令是:
hadoop distcp -update -delete -m 10 hdfs://hadoop01:8020/data/logs hdfs://hadoop02:8020/backup/logs执行 DistCp 时注意目标目录最好不存在或者为空。如果目标目录已有大量文件,建议先在小目录上试跑,确认参数符合预期后再处理全量数据。
8. MapReduce 与 YARN 作业提交
Hadoop 课程的另一个核心是 MapReduce。虽然现阶段大部分人更愿意用 Spark 或 Flink,但 MapReduce 仍然是理解分布式计算思想的基础。建议至少跑通一个 WordCount 示例。
8.1 准备输入文件
先把测试文件放到 HDFS。
hdfs dfs -mkdir -p /wordcount/input hdfs dfs -put /home/user/test.txt /wordcount/input/8.2 打包并提交作业
用 Maven 或直接编译的方式生成 jar 包后,执行以下命令。
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /wordcount/input /wordcount/output也可以使用自己写的 Java 或 Python Streaming 作业。下面是一个 Python Streaming 的通用模板:
hadoop jar /opt/hadoop/share/hadoop/tools/lib/hadoop-streaming-*.jar \ -input /wordcount/input \ -output /wordcount/output_py \ -mapper "python3 mapper.py" \ -reducer "python3 reducer.py" \ -file mapper.py \ -file reducer.py其中mapper.py需要从标准输入逐行读取,按制表符或空格切分,输出单词 1的格式;reducer.py按相同的 key 分组并累加。提交后可以到 YARN 的 8088 界面查看作业状态。
8.3 查看运行结果
作业运行完成后,输出目录会多出_SUCCESS文件和若干个part-r-00000文件。
hdfs dfs -ls /wordcount/output hdfs dfs -cat /wordcount/output/part-r-00000如果输出目录为空,检查是否因为重名导致覆盖问题。MapReduce 默认不允许输出目录已经存在,第二次运行前需要手动删除旧输出。
hdfs dfs -rm -r /wordcount/output9. Hadoop 面试题重点整理
学习 Hadoop 课程的另一个连带收益,是能应对大数据入门面试。面试官通常不会只问工具命令,更关心你对架构和容错机制的理解。
9.1 基础概念类
- HDFS 中块大小为什么是 128MB 而不是更小?块越大,元数据压力越小,寻址成本越低,但过大会导致数据分布不均匀。
- 副本因子默认是多少?默认是 3,对应同一机架不同节点和跨机架策略。
- NameNode 和 DataNode 各自作用是什么?NameNode 维护元数据,DataNode 存储真实数据块。
- SecondaryNameNode 不是热备节点,它只负责定期合并编辑日志和镜像文件,不能直接接管 Active 节点。
- HDFS 适合存储大文件,不适合存储大量小文件,小文件会占用大量元数据内存。
9.2 架构与流程类
- MapReduce 的 Shuffle 过程包含哪几个阶段?一般包括 map 端分区、排序、溢写、合并,以及 reduce 端拉取、合并、归并排序。
- Map 任务数量如何决定?通常由输入分片数量决定,而不是数据量越大 map 数越多。
- Reduce 任务数量如何设置?可以手动指定,也可以使用默认的 1。合理设置需要考虑分区数和结果文件大小。
- YARN 的 ResourceManager 如何调度资源?容器(Container)是最小资源单位,NodeManager 负责启动和管理容器。
- 数据倾斜如何解决?常见方案包括增加随机前缀打散 key、调整分区策略、使用 Combine 合并中间结果、局部聚合加全局聚合。
9.3 HA 与 Zookeeper 类
- NameNode 出现单点故障怎么办?使用 Zookeeper 实现自动故障转移,两个 NameNode 通过 ZKFC 争抢 Active 锁。
- JournalNode 的作用是什么?共享编辑日志存储,让 Standby NameNode 能持续同步元数据。
- 为什么 Zookeeper 集群通常配置奇数台?因为选举需要大多数投票,奇数台可以避免脑裂时出现等票情况。
- 脑裂如何防止?通过 fencing 机制,Active NameNode 在切换前会被隔离,防止两个节点同时写入数据。
这些内容在课程设计说明书和面试准备中都可以直接引用。
10. 资源占用与性能观察
Hadoop 进程常驻内存,实验时要注意资源占用。伪分布式环境下,如果只分配 2G 内存给虚拟机,启动许多进程后系统会变得极卡。建议保留至少 4G。
10.1 查看进程和端口
jps free -h top -c常用的 Hadoop 端口有:
| 服务 | 端口 |
|---|---|
| NameNode RPC | 8020 |
| NameNode Web | 9870 或 50070 |
| DataNode Web | 9864 |
| ResourceManager Web | 8088 |
| JournalNode RPC | 8485 |
| Zookeeper client | 2181 |
如果端口被其他进程占用,优先杀掉旧进程,或者修改对应配置文件中的端口号。
10.2 调整内存参数
hadoop-env.sh中有HADOOP_HEAPSIZE或HADOOP_NAMENODE_OPTS等参数,可以用于控制 JVM 堆内存。实验环境下可以适当调小,例如给 NameNode 和 ResourceManager 各分配 512M 或 1G,避免宿主机内存耗尽。实际数值需要根据机器内存和并发任务数调整。
10.3 降低资源占用的建议
- 伪分布式设置副本数为 1。
- 不启动 YARN 的额外历史服务时,只保留 ResourceManager 和 NodeManager。
- 如果在 Docker 中运行,可以给容器设内存限制,例如
-m 4g。 - 观察 MapReduce 作业时,适当缩小输入数据量,不要一上来就跑几个 GB 的文件。
11. Hadoop 课程常见问题与排查方法
实验过程中,排查问题是提升最快的方式。下面整理一张常见问题表。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
hdfs命令找不到 | PATH 未配置或未 source | 执行echo $PATH检查 | 在/etc/profile中加入 HADOOP_HOME/bin |
| 格式化后启动看不到 NameNode | 目录权限错误或端口被占用 | 查看 hadoop 用户日志 | 检查 name 目录权限,杀掉占用进程 |
| 只有 NameNode 没有 DataNode | 配置了副本数 3,但只有一个节点 | 查看 DataNode 日志 | 伪分布式设置dfs.replication为 1 |
| Web 界面打不开 | 防火墙未关闭或 bind 地址不对 | curl localhost:9870测试 | 关闭防火墙或改为0.0.0.0 |
| DataNode 无法注册到集群 | 集群 ID 不一致 | 查看 DataNode 日志中的 clusterID | 删除旧数据目录后重新格式化 |
| YARN 作业一直卡在 ACCEPTED | ResourceManager 没收到 NodeManager 心跳 | 查看 RM 日志和 NodeManager 状态 | 检查 aux-services 配置和主机名解析 |
| MapReduce 输出目录已存在 | 上次运行结果未删除 | hdfs dfs -ls output | 删除输出目录后重新提交 |
| SSH 免密失败 | authorized_keys 权限不对 | ssh -vvv localhost | 修改 authorized_keys 权限为 600 |
| NameNode 自动切换失败 | Zookeeper 未启动或 zkfc 未运行 | zkServer.sh status | 先启动 ZK,再启动 zkfc |
| Disk 空间不足 | 重复日志和输出文件堆积 | df -h检查 | 清理日志和临时文件,Docker 中重建数据目录 |
排错的核心思路是看日志。Hadoop 的日志通常位于$HADOOP_HOME/logs下,文件名包含进程类型和主机名。遇到报错时先定位到具体行,再上网搜索异常关键词,不要盲目重装。
12. 最佳实践与学习建议
Hadoop 课程能不能学扎实,关键在于动手次数。只看配置文件和命令输出远远不够,下面这些建议来自常见的实验总结,值得直接复用。
12.1 维护一套最小可运行配置
把伪分布式、集群、HA 三种形态分别保存到独立的配置目录中。每次实验切换形态时,只复制对应配置,不要临时修改核心文件。这样可以避免在 HA 实验时不小心把伪分布式环境改乱。
12.2 数据目录和日志目录分离
HDFS 数据目录、临时目录、日志目录最好放在固定的几块位置。不要和系统盘混在一起,因为日志会快速增长。格式化操作前备份原有数据目录,实验数据不重要时也要保证能快速清理。
12.3 先小参数测试,再跑全量
无论写 MapReduce 还是执行 DistCp,第一次都先使用少量数据、小并行度跑通。确认逻辑正确后,再逐渐增加文件数量和-m参数。这样能大大减少排错时间。
12.4 善用脚本与自动化
手动执行一堆 start 脚本很容易漏掉某个节点。可以写一个简单的start-all.sh辅助脚本,按顺序完成必要检查、启动 Zookeeper、启动 HDFS、启动 YARN 并输出过程日志。脚本本身是课程设计的一个亮点。
12.5 注意数据安全与合规
企业环境中,不要在未授权的情况下把生产数据复制到测试集群。实验中使用生成的或公开的样例数据更稳妥。涉及用户日志、手机号、地址等信息时,必须做脱敏处理。这是学习大数据技术时最容易忽略,也最不应该踩雷的地方。
13. 总结与下一步
Hadoop 课程的价值,在于它用一套完整的开源生态把分布式存储、分布式计算、协调服务这些底层概念串了起来。最值得优先验证的是伪分布式能否顺利启动,并完成一次 HDFS 文件读写和一次 MapReduce 作业提交。
最容易踩的坑是配置路径写错、格式化后数据目录不一致、SSH 免密没配好、端口被占用。这些问题通过日志定位都不难,难的是养成先看日志、再改配置的习惯。
后续扩展方向也很明确:先把 HA 和 Zookeeper 整合跑通,再试着接入 Hive 做 SQL 查询,最后可以过渡到 Spark 或 Flink。Hadoop 本身是批处理时代的基石,掌握了它,再上手其他大数据组件会轻松很多。建议把本文的配置模板和排查表格收藏备用,做课程设计或面试准备时可以直接对照操作。