HDFS副本放置节点选择的优化

前言



我们都知道,HDFS在准备写文件块的时候,必须要做的一个步骤是要从集群内数以千计的节点中选择一个有效的节点作为待写入块的目标节点。那么这里何为”有效的节点”呢?指的是此节点内包含有快文件需要的Storage Type(存储类型)。比如说某block要求的类型是SSD,而当前选出的节点所有数据目录都是DISK的话,那这个节点就不是满足要求的节点,此轮选举就会被废弃,将选过的节点加入exclude列表,然后重新进行下一轮的选取。所以在这里,笔者想要只要聊聊其中选择效率的问题。这种策略其实是有一定问题的,比如说,集群内包含1000个节点,999个节点都是DISK类型,而只有1个节点是SSD类型的,那么要为SSD存储类型的文件选择目标节点,岂不是得经过好几轮选举了?因为目前的策略是每次随机挑选一个节点,然后拿来进行对比。当然如果节点完全是同构的,这当然没问题,但是如果出现多种异构型的节点,这种做法显然不够合理。本文笔者就来聊聊这个话题。

多异构存储的节点选择问题



多异构存储环境下的节点选择问题,并不是笔者直接发现的,而是源自于社区JIRA HDFS-11419(BlockPlacementPolicyDefault is choosing datanode in an inefficient way),大致提到的意思就是笔者在前言中所阐述的。归纳起来一句话,在一些集群环境结构十分特殊的情况下(比如集群存储类型比例完全不平衡时),选择偏少一方的存储类型节点的效率将会非常低。基于这个问题,社区提出了一种改进设想:能否将需要的存储类型传入到选择的节点方法内,提前筛选出包含有目标存储类型的节点,这样可以过滤掉大量无效的节点。换句话说,在这种设想中,选出来的节点是至少能满足块文件要求的候选节点。要想实现以上提到的方案,我们必须要对原始的NetworkTopology结构进行改造,加入StorageType的条件,社区也的确做了这样的改造,名为DFSNetworkTopology。

DFSNetworkTopology的实现



从DFSNetworkTopology这个名字我们能够看出,这是一个专属HDFS内部使用的新的Topology类。此类是NetworkTopology的子类,作者在其内部做的最大的改造是在每个逻辑节点内,添加了StorageType->Count这样的映射值关系。也就是说,在每个节点下,我可以知道此位置下,是否包含有我想要的存储类型的节点,而且我能知道到底有几个满足条件的节点。有了这样一个附加信息,我能够从根节点由上而下选出满足要求的节点。而之前默认的逻辑结构则是盲目的随机进行选择。

那么DFSNetworkTopology拓扑逻辑是如何构建StorageType->Count这样的映射信息的呢?归纳起来一句话:

当节点从拓扑逻辑中添加/移除的时候,获取此节点包含的StorageType信息,进行相应拓扑逻辑节点的map计数更新,往上更新直到根节点。

尽管说上面只用一句话进行了简单的概括,但真正的代码逻辑还是具有一定的复杂性的,里面涉及了比较多的树型结构的状态更新、维护等操作。感兴趣的读者可以自行前往HDFS-11419进行更进一步的学习。

DFSNetworkTopology的应用



既然新的基于存储策略计数值的拓扑逻辑已经实现了,是否意味着我们可以直接将DFSNetworkTopology应用到HDFS默认的副本放置策略中来进行节点的选择呢?答案是否定的。

之前上文中也提到过,DFSNetworkTopology是为了方便于多异构存储环境下而实现的,如果说集群不是异构的,那么原来的方式对于我们来说还是OK的,而且老方法相比较于新方法而言,在单次执行效率上而言,是要高于新方法的,,因为它不用考虑Storage Type因素的条件,随机选择一个就行了。所以在这里,一种比较好的做法是采取二者结合使用的方案。在HDFS-11535中,社区进行了这块内容的讨论。

首先有这么一个初始方案:根据集群所包含的Storage Type类型判断,如果集群内所有节点都是同一种Storage Type,也就是同构集群,则毫无疑问,沿用老的方法。否则,

使用新的选择节点的方法。

这个方法提出之后,笔者发现其中一个弊端,当其中如果某个Storage Type只有1%的比例时,这样也会被迫选择新方法,但是在此集群环境下,绝大多情况是比较适用于第一种情况的。

于是社区讨论提出了方案2.0版本,采用一种“2阶段选择”方案,什么意思呢?第一次采用老方法,就是随机选取方法,如果第一次不成功,则采用新方法。如果集群是同构的,则第一次方法肯定能选出节点来,否则不是的话,说明是存在异构的,则用新方法。这种方案的好处在于说能够同时利用了新,老方法共同的优点。而且也不会过于复杂。

事实上在2阶段选择方案提出之前,笔者曾提出过基于阈值的选择方案,这里的阈值指的是目标Storage Type在集群中的所占比,根据实际占比与阈值进行进行比较,从而来判断选择哪个topology下的方法。更多详细的讨论细节读者可以关注HDFS-11535。

DFSNetworkTopology的展望



目前对于这块的优化工作还在进行当中,笔者目前在HDFS-11530中正在将DFSNetworkTopology应用到HDFS内部的BlockPlacementPolicyDefault中,考虑到这个新的Topology还需要进行更多的压力测试和检验,目前打算采用的做法是将会用一个新的配置名来使用这个类,并将默认值先设置为老的NetworkTopology,等到了未来可以再变为DFSNetworkTopology。

参考资料



[1].HDFS-11419,BlockPlacementPolicyDefault is choosing datanode in an inefficient way, https://issues.apache.org/jira/browse/HDFS-11419

[2].HDFS-11530,Use HDFS specific network topology to choose datanode in BlockPlacementPolicyDefault,https://issues.apache.org/jira/browse/HDFS-11530

[3].HDFS-11535,Performance analysis of new DFSNetworkTopology#chooseRandom, https://issues.apache.org/jira/browse/HDFS-11535

时间: 2024-08-04 17:51:00

HDFS副本放置节点选择的优化的相关文章

HDFS副本放置策略及机架感知

副本放置策略 副本放置策略的基本思想是: 第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node). 第二个副本放置在与第一个节点不同的机架中的node中(随机选择). 第三个副本和第二个在同一个机架,随机放在不同的node中. 如果还有更多的副本就随机放在集群的node里. Hadoop的副本放置策略在可靠性(block在不同的机架)和带宽(一个管道只需要穿越一个网络节点)中做了一个

HDFS副本放置策略

前言 前一篇文章中刚刚分析完HDFS的异构存储以及相关的存储类型选择策略,浏览量还是不少的,说明大家对于HDFS的异构存储方面的功能还是很感兴趣的.但是其实一个文件Block块从最初的产生到最后的落盘,存储类型选择策略只是其中1步,因为存储类型选择策略只是帮你先筛选了一些符合存储类型要求的存储节点目录位置列表,通过这些候选列表,你还需要做进一步的筛选,这就是本文所准备阐述的另外一个主题,HDFS的副本放置策略.在写本文之前,我搜过网上关于此方面的资料与文章,还是有许多文章写的非常不错的,所以我会

HDFS副本选择策略

在client向DataNode写入block之前,会与NameNode有一次通信,由NameNode来选择指定数目的DataNode来存放副本.具体的副本选择策略在BlockPlacementPolicy接口中,其子类实现是BlockPlacementPolicyDefault.该类中会有多个chooseTarget()方法重载,但最终调用了下面的方法: 1 /** 2 * This is not part of the public API but is used by the unit t

HDFS副本存放读取

HDFS作为Hadoop中 的一个分布式文件系统,而且是专门为它的MapReduce设计,所以HDFS除了必须满足自己作为分布式文件系统的高可靠性外,还必须为 MapReduce提供高效的读写性能,那么HDFS是如何做到这些的呢?首先,HDFS将每一个文件的数据进行分块存储,同时每一个数据块又保存有多个 副本,这些数据块副本分布在不同的机器节点上,这种数据分块存储+副本的策略是HDFS保证可靠性和性能的关键,这是因为:一.文件分块存储之后按照数据 块来读,提高了文件随机读的效率和并发读的效率:二

分布式存储系统可靠性系列五:副本放置算法 & CopySet Replication

本文来自网易云社区 作者:孙建良 在分布式存储系统 中说明了,在一定情况下,copyset的数量不是越多越好,在恢复时间确定的情况下,找到合适的copyset的数量可以降低数据丢失的概率. 在分布式存储系统可靠性系列文章分布式存储系统可靠性-设计模式一文中也总结道: 为了提高存储系统数据可靠性,首先在系统允许的成本范围内选择合适的副本数,再次在系统设计中我们首先优先考虑加快数据恢复时间,在此基础上减小系统的copyset数量.使得在既定的成本下达到尽可能高的可靠性. 其实在业界也已经有团队在这方

Hadoop 副本放置策略的源码阅读和设置

本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_block_placement_policy 大多数的叫法都是副本放置策略,实质上是HDFS对所有数据的位置放置策略,并非只是针对数据的副本.因此Hadoop的源码里有block replicator(configuration). BlockPlacementPolicy(具体逻辑源码)两种叫法. 主要用途:上传文件时决定文件在HDFS上存储的位置

014_HDFS存储架构、架构可靠性分析、副本放置策略、各组件之间的关系

1.HDFS存储架构 (1)HDFS 架构 —— 文件 1)文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)2)NameNode 是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等3)DataNode 在本地文件系统存储文件块数据,以及块数据的校验和.4)可以创建.删除.移动或重命名文件,当文件创建.写入和关闭之后不能修改文件内容. (2)

ceph学习笔记之十 副本放置策略

副本放置策略 CRUSH 算法的设置目的是使数据能够根据设备的存储能力和宽带资源加权平均地分布,并保持一个相对的概率平衡.副本放置在具有层次结构的存储设备中,这对数据安全也有重要影响.通过反射系统的物理安装组织,CRUSH算法可以将系统模块化,从而定位潜在的设备故障.这些潜在故障的资源包括物理的,比如共用电源,共用的网络.通过向集群映射编码信息,CRUSH副本放置策略可以将数据对象独立在不同故障域,同时仍然保持所需的分布.例如,为了定位可能存在的并发故障,应该确保设备上的数据副本放置在不同的机架

Mongodb的副本集节点角色介绍及选举过程浅析

一个副本集ReplicaSet一般由一组mongod实例组成,这组mongod实例协调配合工作,共同向外提供高可用的数据库访问服务. 副本集中的不同节点虽然都是mongod实例,但是角色上却有不同,一般分为三种:主节点.副本节点和仲裁者节点. 主节点:负责所有的数据库写操作,默认情况下,主节点也负责处理所有的数据库读操作: 副本节点:负责同步主节点的数据操作日志更新本地数据库,从而保证副本节点的数据和主节点上的数据的一致性:副本节点的从某种意义上来讲有点像赛跑,永远在追赶主节点的数据操作: 仲裁