Hadoop基础知识
Hadoop 是由 Apache 基金会开发的开源分布式计算框架,主要用于处理海量数据的存储和计算问题。其核心设计基于 Google 的 MapReduce 编程模型和 GFS(Google File System),旨在通过集群化的廉价硬件实现高可靠性、高扩展性的大数据处理。以下是 Hadoop 的核心要点介绍:
一、Hadoop 的核心架构
Hadoop 主要由以下模块组成:
-
HDFS(Hadoop Distributed File System)
-
分布式文件存储系统,支持海量数据的存储,默认将文件分割为 128MB 的块(Hadoop 2.x 及以上版本),并自动复制多份(默认 3 份)存储在不同节点,确保容错性。
-
采用主从架构:
-
NameNode:管理文件系统元数据(如文件名、块位置),处理客户端请求。【元数据表示描述数据的数据,记录DataNode中数据的各种属性】
-
DataNode:存储实际数据块,定期向 NameNode 发送心跳信号。【存储数据本身的模块】
-
DataNode每过几秒会向NameNode发送心跳信号【心跳信号包含:自身状态的信号(是否存活)、资源使用情况、以及一些简单的指令】,使NameNode能够及时知道DataNode的状态。若 NameNode 超过 10 分钟未收到心跳,则认为该 DataNode 宕机,并触发以下操作:将该节点标记为“不可用”,不再分配新任务并启动数据副本恢复流程,将丢失的块从其他节点复制到健康节点。
-
DataNode每过几秒会向NameNode发送块报告【快报告包括所有数据块列表 的详细报告、以及副本状态等保证元数据与真实数据的一致性】
-
-
-
MapReduce
-
分布式计算模型,分为 Map 和 Reduce 两个阶段:
-
Map:将输入数据分解为键值对并并行处理;
-
Reduce:汇总 Map 阶段的中间结果并生成最终输出。
-
-
依赖 JobTracker(主节点)和 TaskTracker(从节点)协调任务执行,但存在单点故障风险。
-
-
YARN(Yet Another Resource Negotiator)
-
资源管理与任务调度框架,负责集群资源的动态分配,支持多种计算模型(如批处理、流处理)。
-
包含 ResourceManager(全局资源管理)和 NodeManager(节点资源管理)。
-
-
Hadoop Common
-
提供其他模块依赖的通用工具库和接口。
-
二、Hadoop 的优势与特点
-
高可靠性
-
数据自动多副本存储,任务失败时自动重新分配,无需人工干预。
-
-
高扩展性
-
支持从单节点扩展至数千节点,适合 PB 级数据处理。
-
-
低成本
-
基于商用硬件构建集群,成本远低于高端服务器。
-
-
高容错性
-
通过数据副本和任务重试机制应对节点故障。
-
-
适用场景
-
适合批处理大规模数据(如日志分析、ETL),不适用低延迟访问、频繁修改数据或小文件存储的场景。
-
三、Hadoop 的工作流程
-
数据存储
-
文件被分割为块,分布存储在多个 DataNode 上,NameNode 记录元数据。
-
-
任务提交
-
用户通过客户端提交作业(包含输入路径、代码和参数),JobTracker 分配任务至 TaskTracker。
-
-
数据处理
-
Map 阶段在数据所在节点并行执行,Reduce 阶段汇总结果并写入 HDFS。
-
四、Hadoop 生态系统
Hadoop 生态包含丰富的工具以扩展功能:
-
Hive:基于 SQL 的数据仓库工具,用于查询和分析。
-
HBase:分布式 NoSQL 数据库,支持实时读写。
-
Spark:内存计算框架,比 MapReduce 更快,支持流处理和机器学习。
-
Flume/Sqoop:分别用于日志收集和关系型数据库与 Hadoop 间数据传输。
-
Zookeeper:提供分布式协调服务。
五、工作流
1、用户发送指令到完成任务的一般工作流(以 MapReduce 任务为例)
(1)指令提交阶段
用户通过客户端工具(如 Hadoop 命令行)提交作业请求。这个请求包含了作业的配置信息(如输入数据路径、输出数据路径、Map 和 Reduce 函数的相关信息等),并发送到 YARN(Yet Another Resource Negotiator)的 ResourceManager。
(2)资源分配阶段
ResourceManager(RM)作用:ResourceManager 收到请求后,会根据集群的整体资源状况(包括各个节点的 CPU、内存等资源的可用性)进行资源分配规划。它维护着集群资源的全局视图,例如,知道每个节点上还有多少空闲的计算资源可以用于执行新的任务。
与 NodeManager(NM)协作:ResourceManager 会和集群中的 NodeManager 进行沟通。NodeManager 运行在集群中的每个节点上,负责管理该节点的资源。ResourceManager 会指示 NodeManager 启动任务容器(Container),这些容器是执行具体任务(如 Map 任务和 Reduce 任务)的基本单位。
(3)任务执行阶段
Map 任务执行:根据任务的分配,在合适的容器中启动 Map 任务。这些 Map 任务会从 HDFS(Hadoop Distributed File System)读取输入数据。HDFS 将数据以数据块(Block)的形式存储在集群中的多个节点上,Map 任务通常会根据数据本地化原则,优先处理存储在本地节点或者临近节点的数据块,以减少数据传输开销。每个 Map 任务对其处理的数据块进行处理,将数据转换为键 - 值对形式的中间结果。
Shuffle 阶段:Map 任务完成后,进入 Shuffle 阶段。在这个阶段,中间结果会被按照键进行排序和分组,并且通过网络传输将相同键的数据发送到执行 Reduce 任务的节点。这是一个复杂的过程,涉及到数据的传输、缓存等操作,以确保 Reduce 任务能够高效地获取到其需要的数据。
Reduce 任务执行:Reduce 任务接收到来自 Shuffle 阶段的数据后,对相同键的值进行聚合等操作,生成最终的输出结果。这些输出结果会被写回到 HDFS 指定的输出路径中。
2、非 MapReduce 任务(如数据存储相关指令)
如果用户指令是将数据存储到 HDFS 中,工作流主要涉及 HDFS 部分。用户通过 HDFS 客户端提交存储请求,HDFS 的 NameNode(主节点,管理文件系统的命名空间和文件块的映射关系)会协调 DataNode(从节点,存储实际的数据块)进行数据存储操作。例如,NameNode 会决定将数据块存储在哪些 DataNode 上,考虑因素包括 DataNode 的可用存储空间、数据的副本策略(为了数据冗余和可靠性,通常会在多个节点存储数据副本)等。这个过程和 MapReduce 任务的资源分配以及任务执行流程有很大不同