HDFS的新特性Federation
Posted 王sir说运维
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS的新特性Federation相关的知识,希望对你有一定的参考价值。
Namespace(命名空间)的限制
由于Namenode在内存中存储所有的元数据(metadata),因此单个Namenode所能存储的对象(文件+块)数目受到Namenode所在JVM的heap size的限制。例如,在NameNode的配置文件中配置JVM 的heap size 的-Xmx为50G的话,大概能够存储20亿(200 million)个对象。
性能的瓶颈
由于是单个Namenode的HDFS架构(这里一定和HA区别开来),因此整个HDFS文件系统的吞吐量受限于单个Namenode的吞吐量,在NameNode很繁忙的时候,打一下管理命令都可能报错。比如:hdfs fsck / 这种耗时较长,需要大量访问NameNode的命令。
隔离问题
如果HDFS仅有一个Namenode,无法隔离各个用户的应用,因此,假如在HDFS上运行的一个未充分测试的程序很有可能影响到(减慢)生产环境HDFS上运行的程序。在HDFS Federation中,可以用不同的Namespace来隔离不同的用户应用程序,使得不同Namespace Volume中的程序相互不影响。
集群的可用性
在只有一个Namenode的HDFS中,此Namenode的宕机无疑会导致整个集群不可用,当然这里有HA的集群不在这个范围中。
需要注意的,HDFS Federation并不能解决单点故障问题,也就是说,每个NameNode都存在在单点故障问题,你需要为每个namenode部署一个backup namenode以应对NameNode挂掉对业务产生的影响。
比如将Namenode的Heap空间扩大10倍,由原来的50G增大到500GB,这样纵向扩展带来的
第一个问题就是启动问题,启动花费的时间太长。因为,启动的过程中读的fsimage和editlog,当内存设置到500G时,你的fsimage会非常大。
配置50GB Heap size时,Namenode的HDFS启动一次大概需要半个小时,甚至更久,那500GB的需要多久? 这个不是线性的扩大10倍的问题,即使线性扩大10倍,那也不是客户所能接受的。
第二个潜在的问题就是Namenode在Full GC时,如果发生错误将会导致整个集群宕机,Full GC 的时间会变得很长,长的超过集群大部分的超时时间。
第三个问题是对大JVM Heap进行调试比较困难。优化Namenode的内存使用性价比比较低。
Federation中文意思为联邦,联盟,是NameNode的Federation,也就是会有多个NameNode。
Federation能够快速的解决了大部分单Namenode HDFS的问题。
Federation 整个核心设计实现大概用了3.5个月。大部分改变是在Datanode、Config和Tools,而Namenode本身的改动非常少,这样Namenode原先的鲁棒性不会受到影响。
Federation良好的向后兼容性,已有的单Namenode的部署配置不需要任何改变就可以继续工作。
HDFS Federation使用了多个独立的Namenode/namespace来使得HDFS的命名服务能够水平扩展。在HDFS Federation中的Namenode之间是联盟关系,他们之间相互独立且不需要相互协调。HDFS Federation中的Namenode提供了命名空间和块管理功能。HDFS Federation中的datanode被所有的Namenode用作公共存储块的地方。
每一个datanode都会向所在集群中所有的Namenode注册,并且会周期性的发送心跳和块信息报告,同时处理来自Namenode的指令。
HDFS的两大两大模块得先了解下
Namespace
包括目录、文件和块,它支持所有命名空间相关的文件操作,如创建、删除、修改,查看所有文件和目录。
Block Storage Service(块存储服务)包括两部分
在namenode中的块的管理
提供datanode集群的注册、心跳检测等功能。
处理块的报告信息和维护块的位置信息。
支持块相关的操作,如创建、删除、修改、获取块的位置信息。
管理块的冗余信息、创建副本、删除多余的副本等。
存储:datanode提供本地文件系统上块的存储、读写、访问等。
架构的变化
单NameNode架构中,HDFS只有一个命名空间(Namespace),它控制管理集群中全部的块。而Federation HDFS中有多个独立的命名空间(Namespace),并且每一个命名空间使用一个块池(block pool)。
单NameNode架构中,HDFS中只有一组块,而Federation HDFS中有多组独立的块。块池(block pool)就是属于同一个命名空间的一组块。
单NameNode架构中,HDFS由一个Namenode和一组datanode组成。而Federation HDFS由多个Namenode和一组datanode,每一个datanode会为多个块池(block pool)存储块。
Namenode
namenode直接相互独立,各自分工管理自己的区域,且不需要互相协调,一个namenode挂掉了不会影响其他的namenode。
Block Pool(块池)
Block pool(块池)就是属于某一个命名空间的一组block(块)。每一个datanode 可以为所有的block pool存储块。Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念。
同一个datanode中可以存着属于多个block pool的多个块。Block pool允许一个命名空间在不通知其他命名空间的情况下为一个新的block创建Block ID。
一个Namenode挂掉后不会影响其下的datanode为其他Namenode的服务。当datanode与Namenode建立联系并开始会话后自动建立Block pool。每个block都有一个唯一的标识, 这个标识我们称之为扩展的块ID(Extended Block ID)= BlockID+BlockID。这个扩展的块ID在HDFS集群之间都是唯一的,这为以后集群归并创造了条件。
Datanode中的数据结构都通过块池ID(BlockPoolID)索引,即datanode中的BlockMap,storage等都通过BPID索引。在HDFS中,所有的更新、回滚都是以Namenode和BlockPool为单元发生的。即同一HDFS Federation中不同的Namenode/BlockPool之间没有什么关系。
Datanode的改进
在datanode中,对应于每个Namnode都有相应的线程。每个datanode会去每一个Namenode注册,并且周期性的给所有的Namenode发送心跳及datanode的使用报告。
Datanode还会给Namenode发送其所在的block pool的block report(块报告)。由于有多个Namenode同时存在,因此任何一个Namenode都可以随时动态加入、删除和更新。
多命名空间的管理问题
在一个集群中需要唯一的命名空间还是多个命名空间,核心问题是命名空间中数据的共享和访问的问题。在多命名空间下,可以使用Client Side Mount Table方式做到数据共享和访问,而Client Side Mount Table 则是通过新的文件系统viewfs实现的。后面写一篇文章单独详细展开讲解。
Namespace Volume(命名空间卷)
一个Namespace和它的Block Pool合在一起称作Namespace Volume。Namespace Volume是一个独立完整的管理单元。当一个Namenode/Namespace被删除,与之相对应的Block Pool也也被删除。在升级时每一个Namespace Volume也会整体作为一个单元。
ClusterID
在HDFS Federation中添加了Cluster ID用来区分集群中的每个节点。当格式化一个Namenode时,这个ClusterID会自动生成或者手动提供。在格式化同一集群中其他Namenode时会用到这个ClusterID。
HDFS Federation对老版本的HDFS是兼容的
这种兼容性可以使得已有的Namenode配置不需要任何改变继续工作。
平衡的配置有针对blockpool的选项了
Balancer 已经被用来改变集群中多个NameNode的的平衡。可以运行下面的命令:
hdfs start balancer [-policy <policy>]
Policy:
node -默认的策略。这个会平衡datanode的存储,和先前的版本类似。
blockpool - 针对block 池平衡。平衡block池存储也会平衡datanode。
以上是关于HDFS的新特性Federation的主要内容,如果未能解决你的问题,请参考以下文章