随着大数据技术的发展,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 的核心组件
- 核心组件包括 HDFS(分布式文件系统)
- MapReduce(分布式计算框架)
- YARN(资源调度系统)
- Hadoop Common(基础库)
HDFS 是 Hadoop 的分布式文件系统,专为大数据存储而设计。HDFS 的设计目标是能够高效地存储和访问大规模数据集,并在硬件故障发生时保持数据的高可用性。它通过将文件分割成多个块,并将这些块分布式存储在不同的节点上,实现大规模数据的存储和管理。
MapReduce 是 Hadoop 的分布式计算框架,提供了一种简化的大规模数据处理模型。MapReduce 的设计遵循"分而治之"的思想,将复杂的任务分解成许多独立的小任务,使得可以并行处理大规模数据,极大地提高了数据处理的效率。它通过将任务分为 Map 和 Reduce 两个阶段,实现了数据的分布式并行计算。
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),并分散存储在集群中的各个节点上。
数据存储流程
- 文件分块:当一个大文件被存入 HDFS 时,HDFS 将文件分割成固定大小的块(默认是 128 MB),每个块存储在不同的 DataNode 上。
- 数据副本:为了提供容错能力,每个数据块会有多个副本(通常是 3 个)。这些副本会被存储在不同的节点上,以确保在节点发生故障时数据不会丢失。
- NameNode 的元数据管理:NameNode 负责管理元数据,它不会存储实际的数据,而是保存关于数据块分布和存储位置的信息。
具体的文件写入流程:
Client向NameNode发送写数据请求。
NameNode返回可写入数据的DataNode列表。
Client将文件分块并按顺序写入这些DataNode。
每个DataNode写完数据后,会通知NameNode。
NameNode更新元数据信息。
数据读取流程
- 客户端请求数据:当客户端请求读取文件时,它会向 NameNode 请求文件的元数据。
- 获取数据块位置:NameNode 返回该文件的各个块所在的 DataNode 列表,并指明每个块的多个副本位置。
- 并行数据读取:客户端根据返回的块信息,从最近的 DataNode 中并行读取数据,最终将各个块组合成完整的文件。
具体的读取文件流程:
Client向NameNode发送读数据请求。
NameNode返回存储该数据块的DataNode列表。
Client从最近的DataNode读取数据
YARN
YARN (Yet Another Resource Negotiator) 是 Hadoop 的资源调度框架,负责为集群中的各种计算任务提供资源管理和任务调度。YARN 的核心组件包括 ResourceManager 和 NodeManager。
- ResourceManager:集群的中央控制器,负责调度集群中所有的计算资源。它会根据任务的需求,决定如何分配资源,分配多少节点来执行任务。
- NodeManager:运行在每个节点上,负责监控本地资源(如 CPU、内存)的使用情况,并向 ResourceManager 汇报。同时,NodeManager 负责启动和管理在其节点上运行的任务。
- ApplicationMaster:每个作业都有一个专用的 ApplicationMaster,负责管理该作业的生命周期,包括任务调度、失败重试和任务状态监控。
- Container:容器,里面封装了任务运行所需要的资源。
YARN 通过任务的权限控制,确保用户只能提交和管理自己的任务,避免不同用户的任务相互干扰或恶意破坏其他用户的任务。
容错与任务调度
- 任务失败重试:如果某个节点在执行任务时发生故障,YARN 会将该任务重新调度到其他健康节点继续执行。
- 资源动态调整: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集群工作时主要有哪些进程?**
- **NameNode**:管理HDFS的命名空间和客户端对文件的访问,存储文件系统的元数据。
- **DataNode**:在HDFS中存储实际的数据块,执行数据块的读写操作,并定期向NameNode发送心跳和块报告。
- **Secondary NameNode**(Hadoop 1.x版本):辅助NameNode,周期性合并EditLog和FsImage,减轻NameNode的负担。在Hadoop 2.x及更高版本中,Secondary NameNode被Standby NameNode取代。
- **Standby NameNode**:作为Active NameNode的备份,提供故障转移功能。
- **ResourceManager(YARN)**:负责管理集群资源和调度作业,分配计算资源给各个任务。
- **NodeManager(YARN)**:在每个工作节点上运行,监控节点的健康状况,执行任务,并报告资源使用情况给ResourceManager。
- **HDFS Client**:客户端库,用于访问HDFS,执行文件读写操作。
- **YARN Client**:客户端库,用于提交MapReduce作业和其他计算任务。
- **MapReduce HistoryServer**:记录已完成作业的历史信息,供用户查询。
- **HBase Master** 和**HBase RegionServer**(如果使用HBase):HBase Master管理表和区域的元数据,HBase RegionServer负责存储和处理表数据。
- **Hive Metastore**(如果使用Hive):存储Hive表的元数据信息。
这些进程共同协作,确保Hadoop集群的高效运行和数据的可靠存储。
补充二、HDFS如何确保数据的一致性和完整性?
HDFS通过以下方式确保数据的一致性和完整性:
-
数据块的复制:HDFS将数据划分为多个块,并将每个块复制到多个不同的数据节点上。这样即使某个数据节点出现故障,也不会丢失数据。
-
数据块的校验和:HDFS对每个数据块计算一个校验和,并将校验和与数据块一起存储在NameNode中。在读取数据时,HDFS会计算数据块的校验和,并与存储的校验和进行比较,以确保数据的完整性。
-
数据写入确认:在向HDFS写入数据时,客户端会将数据块写入多个数据节点,并等待这些数据节点的确认。只有当所有数据节点都确认写入成功后,客户端才会收到写入成功的确认。
-
心跳机制: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写数据时遇到失败,系统会采取以下几个步骤来处理这种情况,以确保数据的可靠性和系统的稳定性:
-
重试写操作:如果写操作失败,客户端会尝试重新连接到同一个DataNode,并重试写操作。这种情况可能是由于网络问题或DataNode的临时问题引起的。
-
寻找其他副本:如果重试仍然失败,客户端会与NameNode通信,获取该块的其他副本的位置(如果有的话)。然后客户端会尝试连接到其中一个副本所在的DataNode,继续写操作。
-
排除故障节点:如果连续对一个DataNode的尝试都失败了,客户端会将该DataNode标记为故障,并通知NameNode。NameNode随后会从其维护的DataNode列表中排除该节点,并选择另一个DataNode用于存储该数据块的副本。
-
重新复制数据:NameNode在接到故障通知后,会检查该块的副本数量是否低于配置的副本数(默认是3)。如果是的话,NameNode会指示其他DataNode复制该块,以保证数据的冗余性和可靠性。
-
错误报告:如果客户端无法找到任何可用的DataNode来存储数据,或者其他重试尝试都失败了,客户端最终会收到一个错误报告。这时,应用程序可以决定如何处理这个错误,比如记录日志、通知管理员或者尝试整个操作。
-
监控和维护:管理员可以通过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高可用配置的具体实现方式
- ResourceManager(RM)的高可用配置:RM的高可用配置通过Zookeeper实现。当一个RM失败时,Zookeeper会自动选举出一个新的活跃RM来接管工作。
- NodeManager(NM)的高可用配置:NM是每个节点上的组件,负责管理该节点上的资源和任务。在高可用配置中,NM也可以通过Zookeeper实现自动切换。
- ApplicationMaster(AM)的高可用配置:AM是每个应用程序的主控制器,负责与RM通信并管理应用程序的资源。AM的高可用配置也可以通过Zookeeper实现,以便在AM失败时自动切换到备用AM。