Hadoop生态

随着大数据技术的发展,Hadoop 已成为处理大数据的基础框架之一。它广泛应用于各类大数据处理场景中,如互联网日志分析、推荐系统、数据挖掘、机器学习等。Hadoop 的开源特性和强大的生态系统使其在全球企业中得到了广泛的应用,为大规模数据处理提供了强大的工具。

Hadoop生态圈是一个更广泛的概念,它不仅包括Hadoop框架本身,还包括一系列与之相关的项目和工具,形成一个庞大的体系。

Hadoop是啥?

Hadoop 是一个开源的分布式计算框架,专门用于存储和处理大规模数据。它能够通过简单的编程模型实现海量数据的分布式存储与处理,解决传统单机环境无法处理大数据的问题。

Hadoop 主要有两大核心功能:

  • 分布式存储:利用 HDFS(Hadoop Distributed File System)在集群中的多个节点上分布式存储大规模数据。
  • 分布式计算:通过 MapReduce 等计算框架,允许在多个节点上并行处理数据,极大地提高了计算效率。

Hadoop 的优势 & 局限

可扩展性

Hadoop 的设计基于分布式架构,可以轻松实现水平扩展。通过向集群中增加更多的节点,Hadoop 能够处理和存储越来越大的数据集,无需更换现有硬件设施。Hadoop 的存储和计算能力随着节点数量的增加而线性扩展,这使得它能够应对 PB 级别的数据处理需求。

  • 存储扩展:通过添加新的 DataNode,HDFS 能够轻松增加存储容量。
  • 计算扩展:增加节点意味着更多的计算资源,YARN 可以更好地调度这些资源进行并行计算。

容错性

Hadoop 的容错机制是其强大的优势之一。HDFS 通过将数据分块并在多个节点上存储副本来保证数据的高可用性,即使某个节点或数据块丢失,系统依然能够通过其他节点上的副本恢复数据。此外,MapReduce 和 YARN 也具备任务失败重试机制,在节点或任务发生故障时重新执行任务。

  • 副本机制:数据的多个副本分散在不同节点上,确保即使发生故障,数据也能通过副本恢复。
  • 任务重试:如果某个任务失败,YARN 会自动将任务重新调度到其他节点。

兼容多种数据格式

Hadoop 的 HDFS 能够处理各种格式的数据,包括结构化、半结构化和非结构化数据。企业可以将不同种类的数据(如文本、图像、日志、视频等)存储在同一分布式系统中,进行统一管理。

  • 非结构化数据处理:Hadoop 可以高效处理大量非结构化数据,如文本和图像。
  • 多格式支持:支持多种文件格式和序列化方式,如 Parquet、Avro、JSON 等。

局限性

实时处理能力不足

Hadoop 的核心计算框架 MapReduce 是为批处理设计的,而不是为实时处理设计的。因此,Hadoop 在处理实时数据流、低延迟任务时存在局限性。

虽然 Hadoop 生态系统中的一些工具(如 Spark 和 Storm)可以补充这一不足,但原生的 Hadoop MapReduce 仍然不适用于实时计算场景。

批处理优先:MapReduce 是一个批处理框架,适合处理大规模批量任务,但不擅长实时处理。

高延迟:由于 MapReduce 的多阶段处理流程,作业执行延迟较高,难以满足低延迟任务的要求。

高效的小文件处理不佳

Hadoop 的 HDFS 在设计时是为了处理大文件而优化的,对于大量小文件的处理效率较低。HDFS 需要为每个文件和数据块维护元数据,过多的小文件会导致 NameNode 元数据管理的负担过重,进而影响系统性能。

元数据管理压力:大量小文件会增加 NameNode 的负载,因为它需要为每个小文件维护元数据。

适合大文件处理:HDFS 更适合处理少量的大文件,而不是大量的小文件。

Hadoop 的核心组件

  1. 核心组件包括 HDFS(分布式文件系统)
  2. MapReduce(分布式计算框架)
  3. YARN(资源调度系统)
  4. Hadoop Common(基础库)

HDFS 是 Hadoop 的分布式文件系统,专为大数据存储而设计。HDFS 的设计目标是能够高效地存储和访问大规模数据集,并在硬件故障发生时保持数据的高可用性。它通过将文件分割成多个块,并将这些块分布式存储在不同的节点上,实现大规模数据的存储和管理。

MapReduce 是 Hadoop 的分布式计算框架,提供了一种简化的大规模数据处理模型。MapReduce 的设计遵循"分而治之"的思想,将复杂的任务分解成许多独立的小任务,使得可以并行处理大规模数据,极大地提高了数据处理的效率。它通过将任务分为 MapReduce 两个阶段,实现了数据的分布式并行计算。

YARN 是 Hadoop 的资源管理系统,用于协调和分配集群中的计算资源。它允许多个数据处理框架(如 MapReduce、Spark)在同一个集群上运行并共享资源,从而实现资源利用的最大化。YARN 的引入使 Hadoop 的计算和资源管理更加灵活高效,能够同时支持多种分布式计算框架。

Hadoop Common 提供了 Hadoop 各个模块的基础工具和服务,包括文件系统抽象、RPC、序列化库等。是所有 Hadoop 模块共同依赖的组件,确保了整个 Hadoop 生态系统的稳定性和扩展性。

HDFS

HDFS(Hadoop Distributed File System)是一个分布式文件系统,用于存储文件,通过目录树来定位文件。

  • NameNode(nn):存储文件元数据,比如文件名、目录结构、文件属性(生成时间、副本数、文件权限),以及每个文件的数据块(Block)列表和数据库映射信息(比如块所在哪几个DataNote)等。
  • DataNode(dn):在本地文件系统存储文件块数据;执行数据块的读写操作。
  • Standby NameNode(2nn):定期备份NameNode元数据;在紧急情况下,可辅助恢复NameNode。NameNode 和 Standby NameNode 不要安装在同一台服务器。

HDFS 设计的目的是在大规模集群中存储海量数据。它将文件拆分成多个数据块(blocks),并分散存储在集群中的各个节点上。

数据存储流程

  1. 文件分块:当一个大文件被存入 HDFS 时,HDFS 将文件分割成固定大小的块(默认是 128 MB),每个块存储在不同的 DataNode 上。
  2. 数据副本:为了提供容错能力,每个数据块会有多个副本(通常是 3 个)。这些副本会被存储在不同的节点上,以确保在节点发生故障时数据不会丢失。
  3. NameNode 的元数据管理:NameNode 负责管理元数据,它不会存储实际的数据,而是保存关于数据块分布和存储位置的信息。

具体的文件写入流程:

  • Client向NameNode发送写数据请求。

  • NameNode返回可写入数据的DataNode列表。

  • Client将文件分块并按顺序写入这些DataNode。

  • 每个DataNode写完数据后,会通知NameNode。

  • NameNode更新元数据信息。

数据读取流程

  1. 客户端请求数据:当客户端请求读取文件时,它会向 NameNode 请求文件的元数据。
  2. 获取数据块位置:NameNode 返回该文件的各个块所在的 DataNode 列表,并指明每个块的多个副本位置。
  3. 并行数据读取:客户端根据返回的块信息,从最近的 DataNode 中并行读取数据,最终将各个块组合成完整的文件。

具体的读取文件流程:

  • Client向NameNode发送读数据请求。

  • NameNode返回存储该数据块的DataNode列表。

  • Client从最近的DataNode读取数据

YARN

YARN (Yet Another Resource Negotiator) 是 Hadoop 的资源调度框架,负责为集群中的各种计算任务提供资源管理和任务调度。YARN 的核心组件包括 ResourceManagerNodeManager

  1. ResourceManager:集群的中央控制器,负责调度集群中所有的计算资源。它会根据任务的需求,决定如何分配资源,分配多少节点来执行任务。
  2. NodeManager:运行在每个节点上,负责监控本地资源(如 CPU、内存)的使用情况,并向 ResourceManager 汇报。同时,NodeManager 负责启动和管理在其节点上运行的任务。
  3. ApplicationMaster:每个作业都有一个专用的 ApplicationMaster,负责管理该作业的生命周期,包括任务调度、失败重试和任务状态监控。
  4. Container:容器,里面封装了任务运行所需要的资源。

YARN 通过任务的权限控制,确保用户只能提交和管理自己的任务,避免不同用户的任务相互干扰或恶意破坏其他用户的任务。

容错与任务调度

  1. 任务失败重试:如果某个节点在执行任务时发生故障,YARN 会将该任务重新调度到其他健康节点继续执行。
  2. 资源动态调整:YARN 能够根据作业的需求动态调整资源分配,确保计算资源的高效利用

Yarn如何提交一个MR任务?

以一个MR任务为例,来梳理下YARN的工作流程。

  • 第一步 : 客户端提交运行一个 MR 的程序给 Yarn 集群 , Yarn 主节点首先会先检查提交任务请求是否 OK
  • 第二步 : 如果 OK, RM 会随机选择一台 NodeManager, 启动这个任务对应的一个管理者 : AppMaster( 一个任务一个AppMaster)
  • 第三步 : AppMaster 进行启动 , 启动后会和 RM 进行汇报 , 已经启动成功了 , 同时也会和主节点建立心跳
  • 第四步 : AppMaster 开始进行资源的申请 , 根据任务的对应资源要求 , 向 RM 申请资源 , 通过心跳的形式 , 将需要的资源信息发送给 RM
  • 第五步 : RM 接收到资源申请的信息后 , 将这个资源申请交给其底层的资源调度器 (FIFO 容量 公平 ), 来负责完整资源的分配工作 , 如果当前没有资源 , 那么就需要等待即可 , 如果有资源 , 就会立即分配好 , 等待 AppMaster 来拉取
  • 第六步 : AppMaster 会不断的询问 RM( 心跳 ), 是否已经准备好资源 , 如果发现已经准备好资源 , 那么就会立即拉取过来
  • 第七步 : AppMaster 会根据资源信息 ( 资源信息会采用 container 容器的方式返回 ), 连接对应的 nodeManager, 开始进行任务的分配
  • 第八步 : 将任务分配给对应的 nodemanager 进行执行操作 , nodemanager 收到任务后 , 占用相关的资源 , 启动运行 , 同时一旦占用资源后 , 后续 nodemanager 汇报的时候 , 就会告知 RM 资源已经被占用了
  • 第九步 : AppMaster 不断的监听各个 NN 是否已经执行完成 , 如果 MapTask 全部都执行完成后 , 就会通知 ReduceTask 可以拉取数据 , 完成 reduceTask 的运行操作
  • 第十步 : 当所有的 Task 全部都执行完成后 , AppMaster 就会通知给 RM 任务以及执行完成 , RM 回收资源 , 通知AppMaster 可以关闭了

Yarn的三种调度方案

1- FIFO Scheduler( 先金先出调度器 ) :

只有一个队列 , 将所有的提交任务全部放置在一个队列中 , 根据提交的顺序 , 依次的分配资源进行运行操作

好处 : 配置简单

弊端 : 不合适共享集群 , 因为大的应用会直接将所有的资源全部都拿到了 , 导致后续的其他的任务无法运行

2- Capacity Scheduler( 容量调度器 ) :

可以对资源进行划分 , 形成多个队列 , 不同队列管理不同范围资源 , 比如说 , 分配队列, 分别管理 30% 50% 20% 资源 , 这样可以让不同任务 , 放置到不同队列中 , 既可以保证大任务运行 , 也可以让小任务有资源可用

好处 : 多队列 , 可以多任务的运行 , 可以进行资源的划分

弊端 : 如果是一个庞大的任务 , 是无法拿到全部的资源 , 虽然支持资源抢占 , 但是存在一定抢占比例

注意 : 此调度器是 Apache 版本的 Hadoop 默认使用的

3- Fair Scheduler( 公平调度器 ) :

使用公平调度器, 不需要预留一定的资源 , 因为调度器会在所有运行的作业中进行 动态平衡, 当第一个大的任务运行的时候 , 公平调度器可以将全部的资源分配给第一个任务 , 当第二个大的任务过来后 , 会要求第一个任务释放出50% 的资源 , 交给第二个任务来进行运行 , 当第二个任务运行完成后 , 会将资源在归还给第一个任务

好处 : 可以让大的任务使用全部的资源 , 同时也可以满足其他的任务也可以有资源运行

弊端 : 如果任务比较多 , 会导致大任务迟迟无法结束 , 因为资源一直被其他的任务在使用中

注意 : 此调度器是CDH 版本的 Hadoop 默认使用的

补充一、**Hadoop集群工作时主要有哪些进程?**‌

  1. ‌**NameNode**‌:管理HDFS的命名空间和客户端对文件的访问,存储文件系统的元数据‌。
  2. ‌**DataNode**‌:在HDFS中存储实际的数据块,执行数据块的读写操作,并定期向NameNode发送心跳和块报告‌。
  3. ‌**Secondary NameNode**‌(Hadoop 1.x版本):辅助NameNode,周期性合并EditLog和FsImage,减轻NameNode的负担‌。在Hadoop 2.x及更高版本中,Secondary NameNode被Standby NameNode取代‌。
  4. ‌**Standby NameNode**‌:作为Active NameNode的备份,提供故障转移功能‌。
  5. ‌**ResourceManager(YARN)**‌:负责管理集群资源和调度作业,分配计算资源给各个任务‌。
  6. ‌**NodeManager(YARN)**‌:在每个工作节点上运行,监控节点的健康状况,执行任务,并报告资源使用情况给ResourceManager‌。
  7. ‌**HDFS Client**‌:客户端库,用于访问HDFS,执行文件读写操作‌。
  8. ‌**YARN Client**‌:客户端库,用于提交MapReduce作业和其他计算任务‌。
  9. ‌**MapReduce HistoryServer**‌:记录已完成作业的历史信息,供用户查询‌。
  10. ‌**HBase Master** ‌和‌**HBase RegionServer**‌(如果使用HBase):HBase Master管理表和区域的元数据,HBase RegionServer负责存储和处理表数据‌。
  11. ‌**Hive Metastore**‌(如果使用Hive):存储Hive表的元数据信息‌。

这些进程共同协作,确保Hadoop集群的高效运行和数据的可靠存储。

补充二、HDFS如何确保数据的一致性和完整性?

HDFS通过以下方式确保数据的一致性和完整性:

  1. 数据块的复制:HDFS将数据划分为多个块,并将每个块复制到多个不同的数据节点上。这样即使某个数据节点出现故障,也不会丢失数据。

  2. 数据块的校验和:HDFS对每个数据块计算一个校验和,并将校验和与数据块一起存储在NameNode中。在读取数据时,HDFS会计算数据块的校验和,并与存储的校验和进行比较,以确保数据的完整性。

  3. 数据写入确认:在向HDFS写入数据时,客户端会将数据块写入多个数据节点,并等待这些数据节点的确认。只有当所有数据节点都确认写入成功后,客户端才会收到写入成功的确认。

  4. 心跳机制:HDFS中的数据节点会定期向NameNode发送心跳信号,以通知NameNode它们的存活状态。如果数据节点长时间未发送心跳信号,NameNode会认为该数据节点出现故障,并将数据块复制到其他健康的数据节点上,确保数据的一致性和完整性。

通过以上方式,HDFS可以有效地确保数据的一致性和完整性,提高数据的可靠性和可用性。

补充三、HDFS 如何保证HA?

HDFS的NameNode为单一节点,为HDFS提供对外统一服务,这说明如果NameNode因为某些原因掉线了,那整个HDFS集群就会瘫痪。为了防止这种情况在生产环境中出现,就引入了高可用(HA)模式。

在HA模式中,一般由两个NameNode组成,一个是处于激活(Active)状态,另一个就处于待命(Standby)状态,处于激活状态的NameNode对外提供统一服务,而待命状态的NameNode则不对外提供服务。当激活的NameNode掉线了,待命的NameNode就马上切换状态,变成Active。

  • 主备切换器,它是另外一个单独的进程运行,主要负责NameNode的主备切换。主备切换器实时健康NameNode的情况,当NameNode发送故障时,就会通过Zookeeper的选举机制来进行选举和切换。
  • JournalNode集群:这是一个共享数据存储系统,这个系统保存了NameNode在运行过程中产生的HDFS元数据,而备用的NameNode节点则会从通过JournalNode来同步主NameNode的信息。当新的主NameNode确认元数据完全同步后才会对外提供服务。

补充四、HDFS中向DataNode写数据失败了怎么办 ?

如果向DataNode写数据时遇到失败,系统会采取以下几个步骤来处理这种情况,以确保数据的可靠性和系统的稳定性:

  1. 重试写操作:如果写操作失败,客户端会尝试重新连接到同一个DataNode,并重试写操作。这种情况可能是由于网络问题或DataNode的临时问题引起的。

  2. 寻找其他副本:如果重试仍然失败,客户端会与NameNode通信,获取该块的其他副本的位置(如果有的话)。然后客户端会尝试连接到其中一个副本所在的DataNode,继续写操作。

  3. 排除故障节点:如果连续对一个DataNode的尝试都失败了,客户端会将该DataNode标记为故障,并通知NameNode。NameNode随后会从其维护的DataNode列表中排除该节点,并选择另一个DataNode用于存储该数据块的副本。

  4. 重新复制数据:NameNode在接到故障通知后,会检查该块的副本数量是否低于配置的副本数(默认是3)。如果是的话,NameNode会指示其他DataNode复制该块,以保证数据的冗余性和可靠性。

  5. 错误报告:如果客户端无法找到任何可用的DataNode来存储数据,或者其他重试尝试都失败了,客户端最终会收到一个错误报告。这时,应用程序可以决定如何处理这个错误,比如记录日志、通知管理员或者尝试整个操作。

  6. 监控和维护:管理员可以通过HDFS提供的工具和界面监控集群的状态,包括每个DataNode的健康状况。当检测到DataNode故障时,可以进行必要的维护和替换。

通过这些机制,HDFS确保了即使在单个或多个DataNode故障的情况下,数据仍然是可靠的,并且系统能够继续运行。不过,需要注意的是,虽然HDFS尽可能确保数据的可靠性,但在极端情况下(如多个DataNode同时故障),数据丢失的风险仍然存在,因此定期备份和灾难恢复计划是必不可少的。

补充五、YARN高可用怎么保证?

YARN的高可用系统架构主要通过ResourceManager高可用(RM HA)来实现。

RM HA的工作原理是在不同节点上启动多个RM进程,通过leader选举决定有且只有一个Active RM。Active RM负责记录应用的基本信息与状态,并写入Zookeeper存储中。如果Active RM进程或其所在节点出现问题,Standby RM能够基于Zookeeper的分布式锁机制选举出新的Active RM,并从Zookeeper存储中恢复出全部应用的信息与状态,继续提供资源管理与调度服务,从而避免单点故障‌。

YARN高可用配置的具体实现方式

  1. ResourceManager(RM)的高可用配置‌:RM的高可用配置通过Zookeeper实现。当一个RM失败时,Zookeeper会自动选举出一个新的活跃RM来接管工作‌。
  2. NodeManager(NM)的高可用配置‌:NM是每个节点上的组件,负责管理该节点上的资源和任务。在高可用配置中,NM也可以通过Zookeeper实现自动切换‌。
  3. ApplicationMaster(AM)的高可用配置‌:AM是每个应用程序的主控制器,负责与RM通信并管理应用程序的资源。AM的高可用配置也可以通过Zookeeper实现,以便在AM失败时自动切换到备用AM‌。
相关推荐
chanalbert16 分钟前
Nacos 技术研究文档(基于 Nacos 3)
spring boot·分布式·spring cloud
庄小焱18 分钟前
【离线数仓项目】——电商域ADS层开发实战
大数据
庄小焱21 分钟前
【离线数仓项目】——离线大数据系统设计
大数据
吃手机用谁付的款2 小时前
基于hadoop的竞赛网站日志数据分析与可视化(下)
大数据·hadoop·python·信息可视化·数据分析
线条12 小时前
Spark 单机模式安装与测试全攻略
大数据·分布式·spark
老周聊架构2 小时前
大数据领域开山鼻祖组件Hadoop核心架构设计
大数据
TDengine (老段)8 小时前
TDengine 使用最佳实践(2)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Deng9452013149 小时前
基于大数据的电力系统故障诊断技术研究
大数据·matplotlib·深度特征提取·随机森林分类算法·标签编码
C1829818257510 小时前
分布式ID 与自增区别
分布式
小菜鸡062612 小时前
FlinkSQL通解
大数据·flink