🐇明明跟你说过:个人主页
🏅个人专栏:《大数据前沿:技术与应用并进》🏅
🔖行路有良友,便是天堂🔖
一、引言
1、Hadoop简介
Hadoop 是一个开源的分布式计算框架,主要用于处理和存储大量数据。它由 Apache 软件基金会开发,基于 Google 的 MapReduce 和 Google 文件系统 (GFS) 的理念设计。Hadoop 提供了一种可扩展、容错的方式来处理大规模数据集,使得用户能够在廉价的硬件上进行分布式计算。
2、Hadoop生态系统概览
Hadoop 生态系统是围绕 Hadoop 分布式计算框架所建立的一系列工具和技术的集合。这些工具涵盖了数据存储、数据处理、数据管理、数据分析等多个方面,旨在帮助用户处理和分析大规模数据集。
- 数据存储与管理
HDFS (Hadoop Distributed File System):
- Hadoop 分布式文件系统,用于存储大规模数据,具备高容错性和高吞吐量。
HBase:
- 一个基于列存储的分布式数据库,适合处理大规模结构化数据,支持实时读写。
Hive:
- 一个数据仓库工具,可以将结构化数据映射为表,支持使用类似 SQL 的查询语言 HiveQL 进行查询。
HCatalog:
- Hive 的元数据管理服务,帮助不同 Hadoop 工具(如 Pig、MapReduce)之间共享数据元数据。
HCFS (Hadoop Compatible File System):
- 支持与 HDFS 兼容的第三方文件系统,如 Amazon S3。
- 数据处理
MapReduce:
- Hadoop 的核心分布式计算框架,负责大规模数据的并行处理。
YARN (Yet Another Resource Negotiator):
- 资源管理框架,负责集群资源的分配和任务调度,支持多种计算模型。
Tez:
- 一种基于 DAG(有向无环图)的计算框架,作为 MapReduce 的更高效替代方案。
Spark:
- 一个内存计算框架,比 MapReduce 更快,支持实时数据处理和复杂计算任务。
Pig:
- 一个数据流处理工具,使用 Pig Latin 语言编写数据分析任务,适合处理非结构化和半结构化数据。
Flink:
- 一个分布式流处理框架,支持流式和批处理数据的实时计算。
- 数据分析与查询
Hive:
- 前面提到的 Hive 也属于数据分析工具,可以通过 SQL 查询大规模数据。
Impala:
- 由 Cloudera 开发的一个分布式 SQL 查询引擎,提供快速的查询能力,适合交互式分析。
Drill:
- 一个低延迟查询引擎,支持各种数据源(如 HDFS、HBase、NoSQL 等)的查询。
Phoenix:
- 用于 HBase 的 SQL 查询引擎,支持低延迟的查询操作。
Kylin:
- 一个分布式数据仓库引擎,支持多维分析和 OLAP 查询,适合大规模数据集的分析。
- 数据流处理
Storm:
- 实时流处理框架,适合低延迟处理和分布式计算任务。
Kafka:
- 一个分布式消息队列系统,支持高吞吐量的消息发布与订阅,广泛用于实时数据流处理。
Flink:
- 既支持流式处理又支持批处理的数据处理框架,提供低延迟的实时计算。
二、Hadoop Distributed File System (HDFS) 深度解析
1、HDFS核心概念
- 分布式架构:
- HDFS 是一个主从(master-slave)架构,由一个NameNode(主节点)和多个DataNode(数据节点)组成。
- NameNode 负责管理文件系统的元数据,包括文件的路径、块(block)的位置等。
- DataNode 负责存储实际的数据块,并定期向 NameNode 报告其存储的块信息。
- 块存储(Block Storage):
- 在 HDFS 中,文件被划分为多个块(默认大小为 128 MB),并将这些块分布式地存储在不同的 DataNode 上。
- 每个块会被复制多个副本(默认是 3 份)并存储在不同的 DataNode 上,以提供容错能力。
- 高容错性:
- HDFS 通过数据块的多副本机制来提供容错能力。当一个 DataNode 发生故障时,系统可以从其他副本中恢复数据,确保数据的高可用性。
- NameNode 持有文件系统的元数据,并将其存储在本地磁盘和定期保存的镜像文件中,以防止数据丢失。
- 高吞吐量:
- HDFS 优化了大规模数据的顺序读写操作,适合大数据量的批处理任务,如 MapReduce。
- 通过将数据分布在多个 DataNode 上,并行地进行数据读写操作,提高了系统的整体吞吐量。
- 数据本地性:
- HDFS 充分利用了数据本地性原则,即将计算任务尽量安排到存储目标数据的节点上,以减少网络带宽的消耗,提高处理效率。
- 流式数据访问(Streaming Data Access):
- HDFS 适用于一次写入、多次读取的场景。数据写入后一般不会被修改(append-only 模式),支持数据的流式访问,这与传统的文件系统有所不同。
2、HDFS工作机制
- 文件写入过程:
- 当一个文件被写入 HDFS 时,它会被切分成多个块。
- NameNode 会为这些块指定存储位置,并将位置信息记录到元数据中。
- 客户端将数据块顺序写入到指定的 DataNode,并根据复制策略将块的副本存储到不同的 DataNode 上。
- 文件读取过程:
- 客户端向 NameNode 请求读取文件时,NameNode 会返回文件块的位置列表。
- 客户端根据这个列表并行地从多个 DataNode 读取数据块,从而提高读取速度。
- 数据再平衡(Data Rebalancing):
- HDFS 通过 DataNode 的自动再平衡机制,确保数据块均匀分布在集群的所有节点上,以提高系统的存储利用率和性能。
- 故障恢复:
- 当一个 DataNode 发生故障时,NameNode 会检测到并安排在其他健康的 DataNode 上复制丢失的块,从而恢复数据的完整性。
3、HDFS的优势与局限
优势:
- 容错性:通过数据块的多副本机制,HDFS 提供了较高的容错能力。
- 可扩展性:HDFS 可以轻松地扩展,支持成千上万的节点和数 PB 级的数据存储。
- 高吞吐量:适合大规模数据处理任务,优化了顺序读写操作。
局限:
- 低延迟访问:HDFS 主要设计用于高吞吐量的大规模批处理场景,不适合低延迟的数据访问需求。
- 小文件问题:HDFS 不擅长处理大量小文件,因为 NameNode 的内存中存储着文件系统的元数据,大量的小文件会占用过多的元数据存储空间。
三、Yet Another Resource Negotiator (YARN) 架构剖析
1、YARN诞生背景与意义
YARN(Yet Another Resource Negotiator)是 Hadoop 生态系统中的一个关键组件,其主要目的是为 Hadoop 集群中的资源管理和任务调度提供支持。
- MapReduce 的局限性:
- Hadoop 最初是以 MapReduce 为核心的计算框架,这种设计虽然适合处理批量数据,但在处理其他类型的计算任务(如实时处理、图计算、机器学习等)时存在局限性。
- MapReduce 模型的硬编码限制了它的灵活性,使得其在面对不同的计算需求时难以扩展和优化。
- 资源管理的挑战:
- 早期的 Hadoop 版本(如 Hadoop 1.x)将资源管理和任务调度与计算模型(MapReduce)紧密耦合在一起,导致资源管理不够灵活且难以扩展。
- 集群中的资源管理和任务调度通常由单一的 JobTracker 负责,这种集中式的管理方式限制了集群的可扩展性和可靠性。
- 需求变化:
- 随着大数据技术的发展,企业和研究机构对集群资源的管理需求变得越来越复杂,需要支持多种计算框架(如 Spark、Tez、HBase、Storm 等),而不仅仅是 MapReduce。
- 对于大规模数据处理的需求不断增长,需要一种更为灵活和可扩展的资源管理解决方案来适应不同的应用场景。
2、YARN架构概览
- ResourceManager(RM):
**职责: **负责整个集群的资源管理和调度。ResourceManager 主要包括两个部分:
- **Scheduler: **负责将资源分配给不同的应用程序。Scheduler 按照资源请求、队列优先级和其他调度策略进行资源分配。常见的调度策略包括容量调度器(Capacity Scheduler)和公平调度器(Fair Scheduler)。
- **ResourceManager Core: **管理集群的整体资源,跟踪每个节点的资源使用情况,处理来自 ApplicationMaster 的资源请求。
- NodeManager(NM):
**职责: **负责单个节点的资源管理和任务监控。NodeManager 主要包括两个部分:
- **ResourceManager Client: **向 ResourceManager 注册节点的资源信息,并处理从 ResourceManager 收到的任务请求。
- **Container Management: **启动和管理在本地节点上运行的容器,并监控容器的资源使用情况。
- ApplicationMaster(AM):
**职责: **每个应用程序(如 MapReduce、Spark 作业等)有一个独立的 ApplicationMaster 负责管理其生命周期。ApplicationMaster 负责:
- 向 ResourceManager 请求资源。
- 跟踪应用程序的任务进度,协调任务的执行。
- 处理应用程序的失败恢复和重新调度。
**独立性: **ApplicationMaster 是应用程序级别的,并且可以根据实际需要动态请求资源和调度任务。
- Container:
- 职责: 是在节点上运行的资源单位。每个容器分配了一定的 CPU、内存和磁盘资源,用于执行任务。容器的管理由 NodeManager 负责,包括启动、监控和资源回收。
3、YARN工作流程
- 应用程序提交
应用程序提交:
- 用户提交应用程序(如 MapReduce、Spark 作业)到集群。
- 提交过程通常包括定义作业的需求(资源、执行环境等)和作业的配置参数。
启动 ApplicationMaster:
- 提交的应用程序包含一个 ApplicationMaster 的实例,该实例负责管理应用程序的整个生命周期。
- 提交请求被传递给 ResourceManager。
- 资源申请与分配
ResourceManager 资源管理:
- ResourceManager 负责集群资源的全局管理,包括资源的分配和调度策略。
- ResourceManager 接收来自 ApplicationMaster 的资源请求,并决定是否满足这些请求。
Scheduler 调度:
- ResourceManager 的 Scheduler 根据调度策略(如容量调度器或公平调度器)来决定资源的分配。
- Scheduler 考虑资源的可用性、队列优先级和其他调度策略来分配资源。
分配容器:
- ResourceManager 将资源分配给 ApplicationMaster,通常以容器的形式分配给应用程序。
- 每个容器包括 CPU、内存和磁盘资源,并在 NodeManager 上启动。
- 任务执行
启动容器:
- NodeManager 接收到 ResourceManager 的指令,在本地节点上启动分配的容器。
- ApplicationMaster 在容器中启动任务并执行作业的计算。
任务管理:
- ApplicationMaster 负责管理任务的执行,协调多个任务之间的工作,处理任务失败和恢复。
- ApplicationMaster 跟踪每个任务的状态,并根据需要调整资源请求。
任务监控:
- NodeManager 负责监控容器的资源使用情况,并将状态报告返回给 ResourceManager 和 ApplicationMaster。
- 监控信息包括容器的资源使用、健康状况等。
- 资源释放与回收
任务完成:
- 当任务完成时,容器释放其占用的资源。
- NodeManager 将完成的信息报告给 ResourceManager。
资源回收:
- ResourceManager 更新资源的可用状态,将释放的资源重新纳入集群资源池。
- 这些资源可以被其他应用程序请求和使用。
- 应用程序完成
完成报告:
- ApplicationMaster 在任务完成后向 ResourceManager 报告作业的最终状态,包括成功、失败或其他状态。
- ApplicationMaster 处理应用程序的最终清理和资源释放。
结果存储:
- 应用程序的结果可以被存储在 HDFS 或其他存储系统中,以供后续使用。
结束生命周期:
- ApplicationMaster 完成其生命周期,释放所占用的资源,清理相关的运行状态。
4、YARN应用场景
YARN(Yet Another Resource Negotiator)作为 Hadoop 的资源管理和调度平台,为各种计算框架和应用程序提供了高效的资源管理。
1. 大数据处理
MapReduce
- **应用场景: **传统的 MapReduce 作业仍然是 YARN 的核心应用之一。适用于批处理、数据挖掘和数据分析。
- **示例: **ETL(提取、转换、加载)作业、日志分析、数据统计等。
Spark
- **应用场景: **Spark 是一个通用的数据处理引擎,支持批处理、流处理、机器学习和图计算。
- **示例: **实时数据分析、图计算任务、机器学习训练等。
2. 实时数据处理
Apache Storm
- 应用场景: 处理实时流数据,适用于需要低延迟的应用场景。
- **示例: **实时数据监控、实时日志分析、点击流分析等。
Apache Flink
- 应用场景: 提供强大的流处理能力,支持有状态流处理和事件时间处理。
- **示例: **实时数据分析、实时指标计算、流数据的复杂事件处理等。
3. 交互式查询
Apache Hive
- **应用场景: **为 Hadoop 提供 SQL 查询能力,适用于需要交互式数据查询和分析的场景。
- 示例:数据仓库查询、业务智能分析、数据报表生成等。
Apache Impala
- **应用场景: **提供低延迟的 SQL 查询能力,适用于对数据进行快速查询的应用。
- **示例: **实时数据分析、OLAP 查询等。
四、MapReduce编程模型与实现机制
1、MapReduce基本概念
- Map 阶段:
- 任务:在 Map 阶段,数据被分割成若干块(通常是文件的分块),然后由多个 Map 任务并行处理。每个 Map 任务将输入数据(键-值对)处理成中间结果(键-值对)。
- 输入:原始数据通常以键-值对的形式提供给 Map 任务。例如,输入数据可以是一个文本文件,其中每一行是一个键值对(如行号和行内容)。
- 处理:Map 函数会遍历这些键值对,并生成一组中间键值对。这些中间键值对会被整理(通过 Shuffle 和 Sort 过程)以准备进入 Reduce 阶段。
- Shuffle 和 Sort:
- 任务:在 Map 和 Reduce 之间,MapReduce 框架会进行一个 Shuffle 和 Sort 过程。这个过程将 Map 输出的中间结果根据键进行分组和排序,以便将相同键的中间结果传递到同一个 Reduce 任务。
- 目的:确保每个 Reduce 任务只处理一种键的数据,从而有效地进行聚合操作。
- Reduce 阶段:
- 任务:Reduce 阶段将处理 Shuffle 和 Sort 阶段输出的中间结果。Reduce 任务接收一组键以及与之对应的一系列值,然后对这些值进行聚合操作。
- 输出:Reduce 函数将这些聚合的结果(通常也是键-值对)写入最终的输出文件中。
2、MapReduce 工作流程
- 数据切分:
- 输入数据被切分成多个块(Splits),每个块由一个 Map 任务处理。
- Map 任务:
- 每个 Map 任务将输入块处理为一组中间的键-值对,并将这些中间结果写入到本地磁盘上。
- Shuffle 和 Sort:
- Map 任务的中间结果被读取并根据键进行排序。相同的键会被分配到同一个 Reduce 任务进行处理。
- Reduce 任务:
- 每个 Reduce 任务从 Shuffle 和 Sort 阶段读取中间结果,对其进行聚合处理,并将最终结果写入输出文件。
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于大数据的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!
版权归原作者 明明跟你说过 所有, 如有侵权,请联系我们删除。