前言
我们都知道,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的条件,社区也的确做了这样的改造,名为DFSNetw