一、Hadoop 是什么?

Hadoop 是 Apache 基金会下的一个开源大数据处理框架,主要用于在普通服务器集群上存储和处理海量数据。

它最早受到 Google 三篇经典论文的启发:

  • GFS:分布式文件系统
  • MapReduce:分布式计算模型
  • Bigtable:分布式结构化数据存储

Hadoop 的核心思想很简单:

使用大量普通机器组成集群,把大文件切成多个数据块分散存储,并把计算任务移动到数据所在的节点上执行,从而实现低成本、高扩展、高容错的大数据处理能力。

Hadoop 适合处理 TB、PB 级别的数据,尤其适合离线批处理、日志分析、数据仓库、用户行为分析、搜索索引构建等场景。


二、Hadoop 解决了什么问题?

在传统单机系统中,数据处理通常面临几个瓶颈:

  1. 单机磁盘容量有限
  2. 单机 CPU 和内存有限
  3. 数据量越大,读取和计算越慢
  4. 单点故障会导致服务不可用
  5. 高端服务器成本非常高

Hadoop 的解决方式是横向扩展。

也就是说,它不是依赖一台特别昂贵的高性能服务器,而是把很多普通服务器组成一个集群:

  • 数据分散存储在多台机器上
  • 计算任务分散运行在多台机器上
  • 某台机器坏了,系统仍然可以继续运行
  • 需要更大容量或更强算力时,继续加机器即可

三、Hadoop 的核心组件

Hadoop 主要由以下几个核心模块组成:

组件作用
HDFS分布式文件系统,负责存储海量数据
MapReduce分布式计算框架,负责批处理计算
YARN资源调度系统,负责管理集群计算资源
Hadoop Common公共工具库,提供基础能力

其中最重要的是 HDFS、MapReduce 和 YARN。


四、HDFS:Hadoop 的分布式文件系统

HDFS 全称是 Hadoop Distributed File System,即 Hadoop 分布式文件系统。

它的主要目标是:

  • 存储超大文件
  • 支持高吞吐量访问
  • 支持廉价机器集群
  • 提供容错能力

1. HDFS 的基本思想

HDFS 会把一个大文件切分成多个 Block,也就是数据块。

例如,一个 1GB 的文件,如果 Block 大小是 128MB,那么它会被拆成 8 个 Block:

file.log
├── block_1
├── block_2
├── block_3
├── block_4
├── block_5
├── block_6
├── block_7
└── block_8

这些 Block 会被分散存储到不同机器上。

为了防止某台机器损坏导致数据丢失,HDFS 还会为每个 Block 保存多个副本。默认情况下,一个 Block 通常会保存 3 份副本。

block_1 -> DataNode A
block_1 -> DataNode B
block_1 -> DataNode C

这样即使其中一台服务器宕机,数据仍然可以从其他副本读取。


2. HDFS 的核心角色

HDFS 主要有两个核心角色:

角色作用
NameNode管理文件系统元数据
DataNode存储真实数据块

NameNode

NameNode 是 HDFS 的管理节点,负责维护文件系统的元数据信息,例如:

  • 文件目录结构
  • 文件和 Block 的映射关系
  • Block 存储在哪些 DataNode 上
  • 文件权限
  • 副本数量

需要注意的是,NameNode 本身不存储真正的文件内容,它只存储元数据。

DataNode

DataNode 是 HDFS 的数据节点,负责保存真实的数据块。

它会定期向 NameNode 汇报自己的状态,包括:

  • 当前节点是否存活
  • 存储了哪些 Block
  • 磁盘空间使用情况

如果某个 DataNode 长时间没有向 NameNode 汇报心跳,NameNode 就会认为该节点失效,并安排其他节点重新复制数据块,保证副本数量满足配置要求。


3. HDFS 的写入流程

当客户端向 HDFS 写入文件时,大致流程如下:

  1. 客户端向 NameNode 请求创建文件
  2. NameNode 检查文件是否存在、权限是否满足
  3. NameNode 返回可写入的 DataNode 列表
  4. 客户端把文件切分为多个 Block
  5. 每个 Block 按副本策略写入多个 DataNode
  6. DataNode 之间通过流水线方式复制数据
  7. 写入完成后,客户端通知 NameNode

简化示意:

Client
  |
  | 请求创建文件
  v
NameNode
  |
  | 返回 DataNode 列表
  v
DataNode A -> DataNode B -> DataNode C

4. HDFS 的读取流程

当客户端读取 HDFS 文件时,大致流程如下:

  1. 客户端向 NameNode 请求文件的 Block 位置信息
  2. NameNode 返回每个 Block 所在的 DataNode 地址
  3. 客户端优先选择距离自己最近的 DataNode 读取数据
  4. 如果某个 DataNode 不可用,则切换到其他副本节点
  5. 所有 Block 读取完成后,客户端组装成完整文件

5. HDFS 的特点

HDFS 的优点:

  • 适合存储超大文件
  • 高吞吐量
  • 高容错
  • 易于横向扩展
  • 成本相对较低

HDFS 的不足:

  • 不适合大量小文件
  • 不适合低延迟访问
  • 不适合频繁随机修改
  • 更适合一次写入、多次读取的场景

五、MapReduce:Hadoop 的分布式计算模型

MapReduce 是 Hadoop 早期最核心的计算框架。

它的思想是把一个复杂的大任务拆成两个阶段:

  • Map 阶段:分而治之,处理局部数据
  • Reduce 阶段:汇总结果,得到最终输出

1. MapReduce 的基本模型

以统计单词出现次数为例。

假设有一批日志文件:

hello hadoop
hello spark
hadoop mapreduce

Map 阶段会把每个单词拆出来,并生成键值对:

hello -> 1
hadoop -> 1
hello -> 1
spark -> 1
hadoop -> 1
mapreduce -> 1

Shuffle 阶段会把相同 key 的数据分组:

hello -> [1, 1]
hadoop -> [1, 1]
spark -> [1]
mapreduce -> [1]

Reduce 阶段会对每组数据进行聚合:

hello -> 2
hadoop -> 2
spark -> 1
mapreduce -> 1

2. MapReduce 的执行流程

一个 MapReduce 任务通常包括以下步骤:

  1. InputFormat 读取输入数据
  2. 数据被切分成多个 InputSplit
  3. 每个 InputSplit 启动一个 Map Task
  4. Map Task 输出中间结果
  5. Shuffle 阶段按 key 分区、排序、分组
  6. Reduce Task 拉取 Map 输出
  7. Reduce Task 聚合计算
  8. OutputFormat 输出最终结果到 HDFS

完整链路可以理解为:

Input -> Split -> Map -> Shuffle -> Reduce -> Output

3. MapReduce 的优点和缺点

MapReduce 的优点:

  • 编程模型简单
  • 容错能力强
  • 适合大规模离线批处理
  • 与 HDFS 结合紧密
  • 能把计算移动到数据所在节点附近

MapReduce 的缺点:

  • 执行链路较重
  • 中间结果频繁落盘
  • 不适合实时计算
  • 不适合复杂迭代计算
  • 开发效率不如 Spark、Flink 等新框架

因此,在现代大数据体系中,MapReduce 更多是底层基础和历史核心,很多新业务会选择 Spark、Flink、Trino、Hive 等更高层或更高性能的计算框架。


六、YARN:Hadoop 的资源调度系统

YARN 全称是 Yet Another Resource Negotiator。

它是 Hadoop 2.x 之后引入的资源管理框架,用于统一管理集群中的 CPU、内存等计算资源。

在 YARN 出现之前,Hadoop 的 MapReduce 既负责计算,又负责资源管理,扩展性较差。

YARN 把资源管理和计算框架拆开,让 Hadoop 集群不再只能运行 MapReduce,也可以运行 Spark、Flink、Tez 等计算框架。


1. YARN 的核心角色

YARN 主要包括以下角色:

角色作用
ResourceManager集群级资源管理者
NodeManager单个节点上的资源管理者
ApplicationMaster单个应用的任务协调者
Container资源分配单位

ResourceManager

ResourceManager 是整个 YARN 集群的资源管理中心,负责:

  • 接收任务提交
  • 分配集群资源
  • 调度应用程序
  • 监控集群资源状态

NodeManager

NodeManager 运行在每台计算节点上,负责:

  • 管理本机资源
  • 启动和停止 Container
  • 向 ResourceManager 汇报节点状态
  • 监控任务运行情况

ApplicationMaster

每个应用程序都会有自己的 ApplicationMaster。

它负责:

  • 向 ResourceManager 申请资源
  • 协调任务执行
  • 处理任务失败重试
  • 跟踪应用执行进度

Container

Container 是 YARN 中资源分配的基本单位。

一个 Container 通常包含:

  • 一定数量的 CPU
  • 一定数量的内存
  • 运行任务所需的环境

2. YARN 的任务执行流程

以提交一个 MapReduce 作业为例:

  1. 客户端向 ResourceManager 提交任务
  2. ResourceManager 分配一个 Container 启动 ApplicationMaster
  3. ApplicationMaster 向 ResourceManager 申请更多资源
  4. ResourceManager 在合适的 NodeManager 上分配 Container
  5. NodeManager 启动具体的 Map Task 或 Reduce Task
  6. ApplicationMaster 监控任务执行状态
  7. 任务完成后释放资源

简化示意:

Client
  |
  v
ResourceManager
  |
  v
ApplicationMaster
  |
  v
NodeManager -> Container -> Task

七、Hadoop 生态系统

Hadoop 不只是 HDFS、MapReduce 和 YARN。围绕 Hadoop,形成了庞大的大数据生态。

常见组件包括:

组件作用
Hive基于 SQL 的数据仓库工具
HBase分布式列式数据库
Sqoop关系型数据库与 Hadoop 之间的数据导入导出工具
Flume日志采集工具
Oozie工作流调度工具
ZooKeeper分布式协调服务
Spark通用分布式计算引擎
Kafka分布式消息队列,常用于数据采集链路
Pig脚本式数据分析工具
Tez面向 DAG 的计算执行引擎

其中 Hive 是 Hadoop 生态中非常重要的组件。

它允许用户使用类 SQL 语句分析 HDFS 上的数据:

SELECT user_id, COUNT(*) AS visit_count
FROM access_log
WHERE dt = '2026-08-16'
GROUP BY user_id;

Hive 会把 SQL 转换成底层执行任务,例如 MapReduce、Tez 或 Spark。

这让数据分析人员不必直接编写 MapReduce 程序,也能处理大规模数据。


八、Hadoop 的典型应用场景

1. 日志分析

互联网系统每天会产生大量访问日志、业务日志、行为日志。

Hadoop 可以把这些日志统一存储到 HDFS 中,然后通过 Hive、Spark、MapReduce 等工具进行离线分析。

典型问题包括:

  • 每日活跃用户数
  • 页面访问量
  • 用户访问路径
  • 错误日志统计
  • 接口耗时分析

2. 数据仓库

企业可以把来自业务数据库、日志系统、埋点系统的数据同步到 Hadoop 中,构建离线数据仓库。

常见分层包括:

分层说明
ODS原始数据层
DWD明细数据层
DWS汇总数据层
ADS应用数据层

这些数据可以用于报表、经营分析、风控、推荐系统等场景。


3. 用户画像

Hadoop 可以处理大量用户行为数据,生成用户标签。

例如:

  • 用户活跃度
  • 消费能力
  • 兴趣偏好
  • 地域分布
  • 设备偏好
  • 留存情况

这些标签可以用于推荐、广告、营销和风控。


4. 搜索和推荐

搜索引擎和推荐系统需要处理大量文档、点击、曝光和用户行为数据。

Hadoop 可以用于:

  • 构建搜索索引
  • 分析点击日志
  • 训练推荐模型
  • 生成离线特征
  • 计算物品相似度

5. 数据归档

对于访问频率不高但需要长期保存的数据,HDFS 可以作为低成本的大规模存储系统。

例如:

  • 历史订单
  • 历史日志
  • 监控数据
  • 审计数据
  • 备份数据

九、Hadoop 的优缺点

优点

1. 高扩展性

Hadoop 可以通过增加普通服务器来扩展存储和计算能力。

当数据量增长时,可以继续向集群中添加节点,而不是替换更昂贵的单机设备。

2. 高容错性

HDFS 通过副本机制保证数据可靠性。

MapReduce 和 YARN 也支持任务失败重试。如果某个任务执行失败,系统可以把它调度到其他节点重新执行。

3. 成本较低

Hadoop 设计之初就考虑运行在普通硬件上,因此相较于传统高端存储和计算设备,整体成本更低。

4. 适合海量数据

Hadoop 非常适合处理 TB、PB 级别的大规模数据,尤其是离线批处理场景。


缺点

1. 不适合实时计算

Hadoop MapReduce 的执行链路较长,中间结果频繁写磁盘,因此延迟较高。

如果业务需要秒级甚至毫秒级响应,通常会选择 Flink、Spark Streaming、Kafka Streams 等方案。

2. 不适合大量小文件

HDFS 的元数据由 NameNode 管理。每个小文件都会占用 NameNode 内存。

如果系统中存在大量小文件,会给 NameNode 带来较大压力。

常见优化方式包括:

  • 合并小文件
  • 使用 SequenceFile
  • 使用 Parquet、ORC 等列式存储格式
  • 通过 Hive 分区合理组织数据

3. 运维复杂度较高

Hadoop 集群涉及多个组件,如 HDFS、YARN、Hive、ZooKeeper、HBase 等。

在生产环境中,需要关注:

  • 节点状态
  • 磁盘使用率
  • NameNode 高可用
  • 数据副本数
  • 任务资源队列
  • Kerberos 安全认证
  • 集群监控和告警

4. 学习成本较高

Hadoop 生态庞大,组件之间关系复杂。

初学者不仅要理解 HDFS、MapReduce、YARN,还要理解 Hive、HBase、Spark、Kafka 等周边系统。


十、Hadoop 与 Spark 的关系

很多人学习大数据时会问:有了 Spark,还需要 Hadoop 吗?

答案是:两者不是完全替代关系。

Hadoop 更像是一个基础设施体系,其中 HDFS 负责存储,YARN 负责资源调度。

Spark 是一个计算引擎,可以运行在多种资源管理系统上,也可以读取多种存储系统中的数据。

常见组合是:

HDFS + YARN + Spark + Hive

也就是说:

  • HDFS 负责存储数据
  • YARN 负责管理资源
  • Spark 负责计算
  • Hive 负责数据仓库和 SQL 分析

Spark 相比 MapReduce 的优势主要在于:

  • 内存计算能力更强
  • 更适合迭代计算
  • API 更丰富
  • 执行效率通常更高
  • 支持批处理、流处理、机器学习、图计算等多种场景

但 Hadoop 的 HDFS 和 YARN 在很多企业大数据平台中仍然非常重要。


十一、Hadoop 常见文件格式

在 Hadoop 生态中,选择合适的文件格式非常重要。

常见格式包括:

格式特点
TextFile普通文本,简单直观,但存储效率低
SequenceFileHadoop 原生二进制键值文件
Avro支持 Schema 演进,适合数据交换
Parquet列式存储,适合分析查询
ORC列式存储,常用于 Hive 场景
JSON可读性好,但解析成本较高
CSV简单通用,但类型表达能力弱

在数据仓库场景中,Parquet 和 ORC 非常常见。

它们属于列式存储格式,适合 OLAP 分析。

例如查询只需要读取 user_idamount 两列时,列式存储不需要扫描整行数据,因此可以显著减少 I/O。


十二、Hadoop 的高可用机制

早期 Hadoop 中,NameNode 是一个明显的单点。

如果 NameNode 宕机,整个 HDFS 集群就无法正常提供服务。

后来 Hadoop 引入了 NameNode HA,也就是 NameNode 高可用机制。

典型架构包括:

  • Active NameNode
  • Standby NameNode
  • JournalNode
  • ZooKeeper
  • ZKFC

Active NameNode 对外提供服务。

Standby NameNode 保持和 Active 的元数据同步。

当 Active NameNode 故障时,系统可以自动切换到 Standby NameNode,由它继续对外服务。


十三、Hadoop 的数据倾斜问题

在 MapReduce、Hive、Spark 等分布式计算中,经常会遇到数据倾斜。

所谓数据倾斜,是指某些 key 的数据量特别大,导致部分任务处理的数据远多于其他任务。

例如统计用户访问次数时,大多数用户只有几十条访问记录,但某个特殊用户或系统账号有几亿条记录。

这会导致:

  • 某些 Reduce Task 运行特别慢
  • 整个任务被少数慢任务拖住
  • 集群资源利用不均衡
  • 作业执行时间变长

常见解决方式包括:

  • 过滤异常 key
  • 对热点 key 单独处理
  • 增加随机前缀打散 key
  • 两阶段聚合
  • 调整 Reduce 数量
  • 使用 Map 端聚合
  • 优化 Join 策略

十四、Hadoop 的生产实践建议

1. 避免大量小文件

小文件会增加 NameNode 元数据压力。

建议在采集或入湖前进行合并,或者使用更适合分析的列式格式。

2. 合理设置副本数

默认副本数通常是 3。

对于重要数据,可以保持 3 副本;对于临时数据、中间数据,可以适当降低副本数,减少存储成本。

3. 合理规划分区

在 Hive 数仓中,分区设计非常关键。

常见分区字段包括:

  • 日期
  • 地区
  • 业务线
  • 数据类型

但分区不能过多,否则会增加元数据管理压力。

4. 监控 NameNode 内存

NameNode 的内存压力通常和文件数量、Block 数量有关。

如果小文件过多,NameNode 内存会快速增长。

5. 使用压缩

常见压缩格式包括:

  • Snappy
  • Gzip
  • LZO
  • ZSTD

在大数据场景中,压缩可以减少磁盘占用和网络传输量。

Snappy 常用于追求速度的场景,Gzip 压缩率较高但速度相对较慢。

6. 做好权限和安全控制

生产 Hadoop 集群通常需要关注:

  • HDFS 权限
  • Kerberos 认证
  • Ranger 权限管理
  • 数据脱敏
  • 审计日志
  • 网络访问控制

十五、一个简单的 MapReduce 示例

下面是一个经典的 WordCount 示例,用于统计单词出现次数。

public class WordCountMapper
        extends Mapper<LongWritable, Text, Text, IntWritable> {

    private final Text word = new Text();
    private static final IntWritable ONE = new IntWritable(1);

    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String[] words = value.toString().split("\\s+");
        for (String item : words) {
            if (!item.isEmpty()) {
                word.set(item);
                context.write(word, ONE);
            }
        }
    }
}

Reducer 示例:

public class WordCountReducer
        extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

这个程序背后的逻辑就是:

Map:    word -> 1
Reduce: word -> total_count

虽然实际生产中很少直接手写 MapReduce,但它是理解分布式计算思想的经典入口。


十六、总结

Hadoop 是大数据技术体系中的重要基础设施。

它的核心价值在于:

  • 用 HDFS 解决海量数据的分布式存储问题
  • 用 MapReduce 提供大规模离线批处理能力
  • 用 YARN 统一管理集群计算资源
  • 通过生态组件支持数据仓库、日志分析、用户画像、搜索推荐等场景

虽然今天 Spark、Flink、Trino、ClickHouse、云原生数据湖等技术越来越流行,但 Hadoop 的思想和组件仍然影响深远。

理解 Hadoop,不只是学习一个框架,更是在理解大数据系统的几个核心问题:

  • 数据如何分布式存储
  • 计算如何靠近数据
  • 集群资源如何调度
  • 节点故障如何容错
  • 海量数据如何组织和分析

对于后端工程师、数据工程师和大数据开发者来说,Hadoop 仍然是进入大数据领域的一块重要基石。

更多推荐