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‌。
相关推荐
学术会议3 小时前
“智能控制的新纪元:2025年机器学习与控制工程国际会议引领变革
大数据·人工智能·科技·计算机网络·机器学习·区块链
龙哥·三年风水3 小时前
workman服务端开发模式-应用开发-vue-element-admin挂载websocket
分布式·websocket·vue
明达技术3 小时前
分布式 I/O 配合高冗余 PLC,打造高效控制新典范
运维·分布式
技术路上的苦行僧3 小时前
分布式专题(9)之Mysql高可用方案
分布式·mysql·mgr·mha·mysql高可用·mmm
Azoner4 小时前
hdfs balancer 指定节点做负载均衡
hadoop·hdfs·负载均衡
阿隆ALong4 小时前
跨境电商培训:云手机的新舞台
大数据·智能手机·矩阵·云计算·arm
Lin_Miao_094 小时前
Kafka优势
分布式·kafka
RFID舜识物联网5 小时前
RFID智能文件柜:高效安全的档案管理新方案
大数据·网络·人工智能·嵌入式硬件·物联网
小陈far5 小时前
RabbitMQ
分布式·rabbitmq
AZDNA7 小时前
搭建医疗行业AI知识库:提升信息管理与服务效能
大数据·人工智能