Hadoop的三大结构及各自作用?
Hadoop是一个由Apache基金会开发的分布式系统基础架构,主要用于处理大规模数据集的分布式存储和计算。Hadoop的三大核心结构是HDFS(Hadoop Distributed File System)、MapReduce和YARN(Yet Another Resource Negotiator),它们各自的作用如下:
1\. HDFS(Hadoop Distributed File System)
**作用** :提供高可靠性和高吞吐量的分布式文件存储系统。
* **高可靠性** :HDFS将文件分割成多个数据块(默认大小为128MB),并将这些数据块存储在多个节点上(默认每个数据块有3个副本)。即使某个节点出现故障,数据仍然可以从其他副本中恢复,从而保证了数据的高可靠性。
* **高吞吐量** :HDFS采用流式数据访问模式,适合大规模数据的读写操作。它通过将数据分散存储在多个节点上,可以同时启动多个数据块的读写操作,从而提高数据的读写吞吐量。
* **适合大规模数据存储** :HDFS能够存储海量的数据,支持PB级别的数据存储。它通过分布式存储的方式,将数据分散存储在多个节点上,从而解决了单机存储容量有限的问题。
2\. MapReduce
**作用** :提供一个分布式计算框架,用于处理大规模数据集的并行计算。
* **并行计算** :MapReduce将计算任务分解为多个Map任务和Reduce任务,这些任务可以并行运行在不同的节点上。Map任务负责处理输入的键值对,生成中间结果;Reduce任务负责对中间结果进行归并和汇总,最终生成最终结果。通过这种方式,MapReduce能够充分利用集群的计算资源,实现大规模数据的并行计算。
* **容错性** :MapReduce具有良好的容错机制。如果某个节点上的任务失败,系统会自动将该任务重新分配到其他节点上运行,从而保证了计算任务的正常完成。
* **易于编程** :MapReduce提供了简单的编程模型,用户只需要编写Map函数和Reduce函数,就可以实现复杂的分布式计算任务。MapReduce框架会自动处理任务的调度、数据的分发和结果的收集等细节,降低了分布式计算的开发难度。
3\. YARN(Yet Another Resource Negotiator)
**作用** :提供一个通用的资源管理系统,用于管理集群中的计算资源(如CPU、内存等)。
* **资源管理** :YARN负责监控集群中各个节点的资源使用情况,并根据用户的资源申请请求,动态地分配和回收资源。它通过资源调度器(如Capacity Scheduler、Fair Scheduler等)来实现资源的合理分配,确保不同用户和应用程序能够公平地使用集群资源。
* **多框架支持** :YARN不仅支持MapReduce框架,还可以支持其他计算框架(如Spark、Flink等)。它为不同的计算框架提供了一个统一的资源管理平台,使得用户可以在同一个集群上运行多种不同的计算框架,提高了集群资源的利用率。
* **任务调度** :YARN负责调度集群中的计算任务,根据任务的优先级、资源需求等因素,合理地安排任务的运行顺序和运行位置。它通过任务调度器来实现任务的动态调度,确保集群的计算资源能够高效地利用,提高集群的整体性能。
YARN(Yet Another Resource Negotiator)是 Hadoop 生态系统中的一个核心组件,它是一个通用的分布式资源管理系统,主要用于管理和调度集群中的计算资源(如 CPU、内存等),以支持多种分布式计算框架的运行。
YARN 的定义
YARN 是 Hadoop 的下一代计算平台,它将 Hadoop 的资源管理和作业调度功能从 MapReduce 框架中分离出来,成为一个独立的、通用的资源管理框架。它的主要目标是:
1. **解耦资源管理与计算框架**:将资源管理与具体的计算框架(如 MapReduce)分离,使得 Hadoop 能够支持更多类型的计算框架(如 Spark、Flink、Tez 等),而不仅仅是 MapReduce。
2. **提高资源利用率**:通过灵活的资源调度策略,优化集群资源的分配,提高集群的整体利用率。
3. **支持多租户环境**:允许多个用户或应用程序共享同一个 Hadoop 集群,同时保证资源的隔离和公平性。
YARN 的架构
YARN 的架构主要包括以下三个关键组件:
1. **ResourceManager(RM)**
- **作用**:负责整个集群的资源管理和调度。
- **功能**:
- 监控集群中各个节点的资源使用情况。
- 接收应用程序的资源请求,并根据调度策略分配资源。
- 管理应用程序的生命周期,包括启动、停止和监控应用程序。
2. **NodeManager(NM)**
- **作用**:运行在每个节点上,负责管理单个节点上的资源。
- **功能**:
- 启动和管理容器(Container),容器是 YARN 中的资源分配单元,封装了 CPU、内存等资源。
- 监控节点上的资源使用情况,并将资源使用情况报告给 ResourceManager。
- 管理节点上运行的任务,包括启动和停止任务。
3. **ApplicationMaster(AM)**
- **作用**:每个应用程序都有一个 ApplicationMaster,负责管理应用程序的生命周期。
- **功能**:
- 向 ResourceManager 申请资源。
- 与 NodeManager 通信,启动和管理任务。
- 监控应用程序的运行状态,处理任务的失败和重试。
YARN 的工作流程
1. **用户提交应用程序**:用户将应用程序(如 MapReduce 作业)提交到 YARN 集群。
2. **ResourceManager 分配资源**:ResourceManager 根据调度策略为应用程序分配资源。
3. **ApplicationMaster 启动**:ResourceManager 启动 ApplicationMaster,ApplicationMaster 负责管理应用程序的生命周期。
4. **ApplicationMaster 申请资源**:ApplicationMaster 向 ResourceManager 申请更多资源来运行任务。
5. **NodeManager 启动任务**:ResourceManager 将资源分配给 ApplicationMaster,ApplicationMaster 与 NodeManager 通信,启动任务。
6. **任务运行和监控**:任务在 NodeManager 上运行,ApplicationMaster 监控任务的运行状态,处理任务的失败和重试。
7. **应用程序完成**:应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销,释放资源。
YARN 的特点
1. **通用性**:YARN 不依赖于特定的计算框架,可以支持多种计算框架(如 MapReduce、Spark、Flink 等)。
2. **高可用性**:通过多 ResourceManager 的部署,可以实现 ResourceManager 的高可用性。
3. **灵活性**:支持多种资源调度策略(如 Capacity Scheduler、Fair Scheduler 等),可以根据用户的需求灵活配置资源分配。
4. **可扩展性**:能够支持大规模集群的资源管理,适用于 PB 级别的数据处理。
总之,YARN 是 Hadoop 生态系统中一个非常重要的组件,它通过解耦资源管理和计算框架,提高了 Hadoop 的灵活性和资源利用率,使得 Hadoop 能够更好地支持多种分布式计算场景。
YARN(Yet Another Resource Negotiator)的三大核心组件是 **ResourceManager(RM)**、**NodeManager(NM)** 和 **ApplicationMaster(AM)**。它们各自的作用如下:
### 1\. ResourceManager(RM)
**作用** :负责整个集群的资源管理和调度。
* **资源监控** :
* ResourceManager 负责监控集群中每个节点的资源使用情况,包括 CPU、内存等。它通过与 NodeManager 的通信,获取每个节点的资源状态。
* 它维护一个全局的资源视图,知道集群中哪些资源是空闲的,哪些资源已经被分配。
* **资源分配** :
* 当应用程序(如 MapReduce 作业或其他计算框架)提交到 YARN 时,ResourceManager 根据调度策略(如 Capacity Scheduler 或 Fair Scheduler)为应用程序分配资源。
* 它将资源以 **Container** 的形式分配给应用程序的 ApplicationMaster。Container 是 YARN 中的资源分配单元,封装了 CPU、内存等资源。
* **应用程序管理** :
* ResourceManager 负责管理应用程序的生命周期,包括启动、停止和监控应用程序。
* 它维护一个应用程序队列,按照调度策略分配资源给队列中的应用程序。
2\. NodeManager(NM)
**作用** :运行在每个节点上,负责管理单个节点上的资源。
* **资源管理** :
* NodeManager 负责管理单个节点上的资源,包括启动和管理 **Container**。Container 是 YARN 中的资源分配单元,封装了 CPU、内存等资源。
* 它根据 ResourceManager 的指令启动或停止 Container,并确保 Container 在节点上正常运行。
* **资源监控** :
* NodeManager 监控节点上的资源使用情况,包括 CPU、内存等,并将这些信息定期报告给 ResourceManager。
* 如果某个 Container 超出了分配的资源(如内存使用超过限制),NodeManager 会将其杀死,以防止资源滥用。
* **任务管理** :
* NodeManager 负责管理节点上运行的任务,包括启动和停止任务。
* 它与 ApplicationMaster 通信,接收任务的启动和停止指令,并确保任务在节点上正常运行。
3\. ApplicationMaster(AM)
**作用** :每个应用程序都有一个 ApplicationMaster,负责管理应用程序的生命周期。
* **资源申请** :
* ApplicationMaster 向 ResourceManager 申请资源,以获取运行任务所需的资源。
* 它根据应用程序的需求,动态地申请和释放资源。例如,MapReduce 作业的 ApplicationMaster 会根据任务的进度,申请更多的资源来运行更多的任务。
* **任务管理** :
* ApplicationMaster 负责管理应用程序的任务,包括启动和停止任务。
* 它与 NodeManager 通信,启动和管理任务。如果某个任务失败,ApplicationMaster 会重新申请资源并重新启动任务。
* **监控和容错** :
* ApplicationMaster 监控应用程序的运行状态,处理任务的失败和重试。
* 如果某个任务失败,ApplicationMaster 会尝试重新启动任务,直到达到最大重试次数。如果 ApplicationMaster 自身失败,ResourceManager 会重新启动它。
### YARN 的工作流程(结合三大组件)
1. **用户提交应用程序** :
- 用户将应用程序(如 MapReduce 作业)提交到 YARN 集群。提交时,会指定应用程序的资源需求和运行参数。
2. **ResourceManager 分配资源** :
- ResourceManager 接收到应用程序的提交请求后,根据调度策略为应用程序分配资源。它首先分配一个 Container 用于启动 ApplicationMaster。
3. **ApplicationMaster 启动** :
- ResourceManager 在某个节点上启动 ApplicationMaster。ApplicationMaster 负责管理应用程序的生命周期。
4. **ApplicationMaster 申请资源** :
- ApplicationMaster 向 ResourceManager 申请更多资源来运行任务。它根据应用程序的需求,动态地申请资源。
5. **NodeManager 启动任务** :
- ResourceManager 将资源分配给 ApplicationMaster。ApplicationMaster 与 NodeManager 通信,启动任务。NodeManager 在指定的 Container 中启动任务。
6. **任务运行和监控** :
- 任务在 NodeManager 上运行,ApplicationMaster 监控任务的运行状态,处理任务的失败和重试。如果某个任务失败,ApplicationMaster 会重新申请资源并重新启动任务。
7. **应用程序完成** :
- 应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销,释放所有资源。
//
YARN 提供了多种资源调度策略,用于管理和分配集群中的资源。最常见的三种资源调度策略是 **FIFO Scheduler**、**Capacity Scheduler** 和 **Fair Scheduler**。它们各自的特点和作用如下:
1\. FIFO Scheduler(先进先出调度器)
**定义** :
FIFO Scheduler 是 YARN 最简单的调度策略,它按照应用程序提交的顺序进行调度。
**特点** :
- **简单直观**:按照提交顺序处理应用程序,先提交的作业先分配资源。
- **适合小规模集群**:在资源充足且作业数量较少的场景下,FIFO Scheduler 可以高效运行。
- **资源独占**:一旦某个作业开始运行,它会占用所有可用资源,直到完成。这可能导致后续提交的作业长时间等待资源。
**适用场景** :
- **单用户环境**:适用于单用户或少量用户提交作业的场景,因为资源分配不会涉及复杂的用户或队列管理。
- **小规模集群**:在资源充足且作业数量较少的集群中,FIFO Scheduler 可以高效运行。
**缺点** :
- **资源饥饿**:如果一个大型作业长时间运行,后续提交的小型作业可能会长时间等待资源,导致资源饥饿问题。
- **缺乏优先级管理**:所有作业按提交顺序处理,无法根据作业的重要性或紧急程度进行优先级调度。
2\. Capacity Scheduler(容量调度器)
**定义** :
Capacity Scheduler 是 YARN 默认的调度策略,它通过将集群资源划分为多个队列(Queue),并为每个队列分配一定的资源容量,从而实现资源的共享和隔离。
**特点** :
- **资源隔离**:每个队列都有固定的资源容量,不同队列之间的资源相互隔离,避免了资源竞争。
- **多租户支持**:支持多用户或多应用程序共享集群资源,每个用户或应用程序可以分配到一个或多个队列。
- **弹性资源分配**:在资源允许的情况下,队列可以借用其他队列的空闲资源,提高了资源利用率。
- **优先级调度**:支持作业优先级,高优先级的作业可以优先获取资源。
**适用场景** :
- **多用户环境**:适用于多个用户或多个应用程序共享集群资源的场景,可以有效隔离不同用户或应用程序之间的资源竞争。
- **大规模集群**:在资源分配复杂且需要精细管理的集群中,Capacity Scheduler 可以提供高效的资源调度和管理。
**配置示例** :
假设集群有 100 个节点,每个节点有 8GB 内存和 4 个 CPU 核心。可以将集群资源划分为两个队列:`queue1` 和 `queue2`。
- `queue1` 分配 60% 的资源(60 个节点)。
- `queue2` 分配 40% 的资源(40 个节点)。
- 如果 `queue1` 的资源未完全使用,`queue2` 可以借用空闲资源,反之亦然。
**缺点** :
- **配置复杂**:需要详细配置队列的资源容量、最大容量、最小容量等参数,配置和管理较为复杂。
- **资源碎片化**:如果队列的资源分配不合理,可能会导致资源碎片化,降低资源利用率。
3\. Fair Scheduler(公平调度器)
**定义** :
Fair Scheduler 是 YARN 的另一种调度策略,它通过动态调整资源分配,确保所有运行的作业都能公平地获得资源。
**特点** :
- **动态资源分配**:根据作业的运行时间和资源需求,动态调整资源分配,确保所有作业都能获得公平的资源份额。
- **支持多池(Pool)**:可以将作业分组到不同的池(Pool),每个池可以设置不同的资源权重,从而实现更细粒度的资源管理。
- **优先级调度**:支持作业优先级,高优先级的作业可以优先获取资源。
- **资源抢占**:如果某个作业长时间占用过多资源,Fair Scheduler 可以通过资源抢占机制,将部分资源分配给其他作业。
**适用场景** :
- **多作业环境**:适用于多个作业同时运行的场景,可以确保每个作业都能获得公平的资源份额。
- **资源利用率优化**:通过动态资源分配和资源抢占机制,可以提高集群的整体资源利用率。
**配置示例** :
假设集群有 100 个节点,可以将作业分组到两个池:`pool1` 和 `pool2`。
- `pool1` 分配 60% 的资源权重。
- `pool2` 分配 40% 的资源权重。
- 如果 `pool1` 中的作业较少,`pool2` 中的作业可以动态获得更多的资源,反之亦然。
**缺点** :
- **资源抢占可能导致任务失败**:资源抢占机制可能会导致某些作业的资源被强制回收,从而导致任务失败或重新启动。
- **配置复杂**:需要详细配置池的资源权重、优先级等参数,配置和管理较为复杂。