hdfs是nas_HDFS的高可用性

本文围绕HDFS高可用性展开,介绍了联邦HDFS架构、缺点,提及利用NAS实现HA的缺陷。重点阐述QJM高可用机制、NameNode主备选举机制、脑裂原因及规避方法,还说明了基于QJM的共享存储系统架构、数据同步机制等信息技术相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDFS的高可用性

联邦hdfs

由于namenode在内存中维护系统中的文件和数据块的映射信息,所以对于一个海量文件的集群来说,内存将成为系统横向扩展瓶颈。Hadoop在2.x的版本引入了联邦HDFS(HDFS Federation),通过在集群中添加namenode实现。

Federation的架构:

image

原理

1、每个namenode相互独立,单独维护一个由namespace元数据和数据块池(block pool)组成的命名空间卷(namespace volume)——图中的NS-x。

2、数据块池包含该命名空间下文件的所有数据块。命名空间卷相互独立,两两间互不通信,即使一个namenode挂掉,也不会影响其他namenode

3、datanode被用作通用的数据存储设备,每个datanode要向集群中所有的namenode注册,且周期性的向所有namenode发送心跳和报告,并执行来自所有namenode的命令

4、当一个namespace被删除后,所有datanode上与其对应的block pool也会被删除。当集群升级时,每个namespacevolume作为一个基本单元进行升级。

联邦hdfs的缺点

虽然引入了多个namenode管理多份namespace,但是对于单个namenode,依然存在单点故障问题(Single point of failure),如果某个namenode挂掉了,那么所有客户端都无法操作文件。

联邦hdfs仍然需要引入secondary namenode。直到secondary namenode满足以下所有条件时,才能提供服务:

1、将命名空间镜像导入内存

2、重演编辑日志

3、接收到足够的来自datanode的块映射报告并退出安全模式。

利用NAS实现HA

保障集群的可用性,可以使用NAS共享存储。主备namenode之间通过NAS进行元数据同步。但是有一下缺陷:

1、硬件设备必须支持NAS

2、部署复杂,部署完namenode还需要在NFS挂载、解决NFS的单点及脑裂,容易出错

3、无法实现同一时间只能有一个namenode写数据

QJM高可用

Hadoop2针对以上问题增加了QJM(Quorum Journal Manager),由多个JN组成,一般配置为奇数个。QJM中有一对active-standby的namenode。当active namenode失效时,standby namenode会接管它继续提供服务。

工作原理如下:

image

1、namenode之间通过一组 journal node 共享编辑日志,standby namenode接管后,需要读取整个编辑日志来与active namenode同步状态,并继续读取active namenode写入的新操作。

2、datanode需要同时向这组active-standby namenode发送数据块处理报告,因为数据块的映射信息保存在namenode的内存中。

3、客户端使用ZKFC(zookeeper failover-controller)来处理namenode失效问题,该进程运行在每个namenode上,通过heartbeat监测active namenode是否失效

4、secondary namenode的角色被standby namenode取代,由standby namenode为active namenode设置check point

5、QJM的实现没有使用zookeeper。但是在HA选举active namenode时,使用了zookeeper。

6、在某些特殊情况下(如网速慢),可能发生故障转移,这时有肯能两个namenode都是active namenode——脑裂。QJM通过fencing(规避)来避免这种现象。

NameNode 的主备选举机制

Namenode(包括 YARN ResourceManager) 的主备选举是通过 ActiveStandbyElector 来完成的,ActiveStandbyElector 主要是利用了 Zookeeper 的写一致性、 临时节点和观察者机制

主备选举实现如下

1、 创建锁节点: 如果 ZKFC 检测到对应的 NameNode 的状态正常,那么表示这个 NameNode有资格参加Zookeeper 的主备选举。如果目前还没有进行过主备选举的话,那么相应的会发起一次主备选举,尝试在 Zookeeper 上创建一个路径为/hadoopha/${dfs.nameservices}/ActiveStandbyElectorLock 的临时结点, Zookeeper 的写一致性会保证最终只会有一次结点创建成功,那么创建成功的 NameNode 就会成为主 NameNode, 进而切换为 Active 状态。而创建失败的 NameNode 则切换为 Standby 状态。

2、 注册 Watcher 监听: 不管创建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点是否成功, ZKFC 随后都会向 Zookeeper 注册一个 Watcher 来监听这个节点的状态变化事件, ActiveStandbyElector 主要关注这个节点的 NodeDeleted 事件。

3、 自动触发主备选举: 如果 Active NameNode 状态异常时, ZKFailoverController 会主动删除临时结点/hadoop-ha/

{dfs.nameservices}/ActiveStandbyElectorLock 结点的流程,如果创建成功,这个本来处于 Standby 状态的 NameNode 就选举为主 NameNode 并随后开始切换为 Active 状态。

4、 当然,如果是 Active 状态的 NameNode 所在的机器整个宕掉的话,那么根据 Zookeeper 的临时节点特性, /hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点会自动被删除,从而也会自动进行一次主备切换。

Namenode 脑裂

脑裂的原因

如果 Zookeeper 客户端机器负载过高或者正在进行 JVM Full GC,那么可能会导致 Zookeeper 客户端到服务端的心跳不能正常发出,一旦这个时间持续较长,超过了配置的 Zookeeper Session Timeout 参数的话, Zookeeper 服务端就会认为客户端的 session 已经过期从而将客户端的 Session 关闭。“假死”有可能引起分布式系统常说的双主或脑裂(brain-split) 现象。具体到本文所述的 NameNode,假设 NameNode1 当前为 Active 状态,NameNode2 当前为 Standby 状态。如果某一时刻 NameNode1 对应的 ZKFC 进程发生了“假死”现象,那么 Zookeeper 服务端会认为 NameNode1 挂掉了,根据前面的主备切换逻辑, NameNode2 会替代 NameNode1 进入 Active 状态。但是此时 NameNode1 可能仍然处于 Active 状态正常运行,即使随后 NameNode1 对应的 ZKFailoverController 因为负载下降或者 Full GC 结束而恢复了正常,感知到自己和 Zookeeper 的 Session 已经关闭,但是由于网络的延迟以及 CPU 线程调度的不确定性,仍然有可能会在接下来的一段时间窗口内NameNode1 认为自己还是处于 Active 状态。这样 NameNode1 和 NameNode2 都处于Active 状态,都可以对外提供服务。这种情况对于 NameNode 这类对数据一致性要求非常高的系统来说是灾难性的,数据会发生错乱且无法恢复。

规避脑裂

Hadoop 的 fencing 机制防止脑裂: 中文翻译为隔离,也就是想办法把旧的 Active NameNode

隔离起来,使它不能正常对外提供服务。 ZKFC 为了实现 fencing,会在成功创建 Zookeeper临时结点 hadoop-ha/

{dfs.nameservices}/ActiveBreadCrumb 的持久节点,这个节点里面也保存了 Active NameNode 的地址信息。 正常关闭 Active NameNode时, ActiveStandbyElectorLock 临时结点会自动删除,同时, ZKFC 会删除 ActiveBreadCrumb结点。但是如果在异常的状态下 Zookeeper Session 关闭 (比如前述的 Zookeeper 假死),那么由于 ActiveBreadCrumb 是持久节点,会一直保留下来。后面当另一个 NameNode 选主成功之后,会注意到上一个 Active NameNode 遗留下来的这个节点,从而会对旧的 ActiveNameNode 进行 fencing

Hadoop ****的两种 fencing 机制:

sshfence:通过 SSH 登录到目标机器上,执行命令将对应的进程杀死;

shellfence:执行一个用户自定义的 shell 脚本来将对应的进程隔离;

只有在成功地执行完成 fencing 之后,选主成功的 ActiveStandbyElector 才会回调ZKFailoverController 的 becomeActive 方法将对应的 NameNode 转换为 Active 状态,开始

对外提供服务。

NameNode 共享存储实现

基于 QJM 的共享存储系统的总体架构: 基于 QJM 的共享存储系统主要用于保存EditLog,并不保存 FSImage 文件。 FSImage 文件还是在 NameNode 的本地磁盘上。

QJM共享存储的基本思想来自于 Paxos 算法,采用多个称为 JournalNode 的节点组成的JournalNode 集群来存储 EditLog。每个 JournalNode 保存同样的 EditLog 副本。

每次NameNode 写 EditLog 的时候,除了向本地磁盘写入 EditLog 之外,也会并行地向JournalNode 集群之中的每一个 JournalNode 发送写请求,只要大多数 (majority) 的

JournalNode 节点返回成功就认为向 JournalNode 集群写入 EditLog 成功。如果有 N 台JournalNode,那么根据大多数的原则,最多可以容忍有 (N-1)/2 台 JournalNode 节点挂掉。 基于 QJM 的共享存储系统的数据同步机制: Active NameNode 和 StandbyNameNode 使用JouranlNode 集群来进行数据同步的过程如图所示, Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog

image

Active NameNode 提交 EditLog 到 JournalNode 集群的过程实际上是同步阻塞的,但是并不需要所有的 JournalNode 都调用成功,只要大多数 JournalNode 调用成功就可以了。如果无法形成大多数,那么就认为提交 EditLog 失败, NameNode 停止服务退出进程。

当 NameNode 进入 Standby 状态之后,会启动一个线程, 定期从 JournalNode 集群上同步 EditLog,然后把同步的 EditLog 回放到内存之中的文件系统镜像上 (并不会同时把EditLog 写入到本地磁盘上)。

<think>嗯,用户问的是HDFS和手动上传文件的区别,我需要先理解这两个概念分别是什么,然后再比较它们的区别。首先,HDFS是Hadoop分布式文件系统,用于处理大数据,而手动上传文件通常指通过界面或命令行将文件传到本地或传统存储系统。用户可能想了解不同场景下使用哪种方式更合适,或者为什么需要HDFS而不是普通上传。 接下来,我需要分解两者的区别。可能要从存储位置、数据管理、适用场景、操作方式等方面展开。比如HDFS是分布式的,数据分块存储在多个节点,而手动上传可能只是单机或简单网络存储。HDFS适合处理大文件,手动上传可能适合小文件。容错性方面,HDFS有副本机制,手动上传可能需要额外备份。 还要考虑用户可能的背景,比如是否有大数据处理经验,或者只是刚开始了解存储系统。需要解释清楚概念,但不过于技术化。可能还需要提到HDFS的优缺点,比如高吞吐量但延迟较高,而手动上传简单但扩展性差。 需要确保回答结构清晰,分点说明,每个区别点有例子或进一步解释。同时注意用中文,避免专业术语过多,必要时举例说明。最后总结适用场景,帮助用户根据需求选择合适的方法。</think>### HDFS与手动上传文件的区别分析 #### 1. **定义与定位** - **HDFS(Hadoop Distributed File System)** 是专为大数据设计的分布式文件系统,核心特性是**跨节点存储**和**高容错性**。数据被自动切分为块(默认128MB/256MB),并以多副本(默认3)形式分布在集群节点上。 ``` 示例:一个1GB文件会被切分为8个块(128MB×8),分散存储在多个服务器 ``` - **手动上传文件** 指通过图形界面、FTP或`scp`等工具,将文件**完整存储到单一服务器或NAS**中,无自动分块或副本机制。 #### 2. **核心差异对比** | 特性 | HDFS | 手动上传 | |---------------------|-------------------------------|-----------------------| | **存储方式** | 分块+分布式存储 | 整体存储 | | **扩展性** | PB级数据线性扩展 | 受单机硬件限制 | | **容错性** | 自动副本恢复(节点故障无感) | 需人工备份 | | **访问模式** | 流式读取(高吞吐量) | 随机访问更灵活 | | **延迟** | 较高(需定位多个节点) | 较低(直接本地访问) | | **适用场景** | 日志分析、机器学习训练等批处理| 文档管理、小型应用 | #### 3. **技术原理差异** - **HDFS写入流程** 1. 客户端将文件分块 2. NameNode分配存储节点 3. 数据管道写入多个DataNode $$ \text{写入时间} \propto \frac{\text{文件大小}}{\text{块大小}} \times \text{网络延迟} $$ - **手动上传** 直接通过TCP协议传输完整文件到目标路径,无中间处理过程。 #### 4. **典型应用场景** - **应选HDFS的情况** - 需要处理TB/PB级数据集(如用户行为日志分析) - 要求高可用性的长期存储(如企业数据湖) - MapReduce/Spark等分布式计算需求 - **适合手动上传的情况** - 小型图片/文档存储(<100GB) - 临时文件共享(如部门周报) - 低并发访问的Web静态资源 #### 5. **运维成本比较** || HDFS | 手动上传 | |---|---|---| | **硬件成本** | 需至少3节点集群 | 单机即可运行 | | **人力成本** | 需专业Hadoop运维 | 普通IT人员可维护 | | **学习曲线** | 需掌握分布式原理 | 操作简单易上手 | **总结建议**: - 当数据量超过单个服务器存储能力,或需要与大数据计算框架(如Spark)配合时,HDFS是必然选择 - 中小规模的非结构化数据(如企业OA文件),使用传统文件上传方式更经济高效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值