Federation HDFS VS HDFS

序言

主要是为了解决HDFS如何把NameNode升级为多个,之前只能部署一个NameNode加一个配合的计算节点 secondaryNameNode,注意secondaryNameNode 并不是主备模式的节点,而是用于协助NameNode做某些计算的节点,以提升吞吐量[email protected]

如下内容来自于:

单个Namenode的HDFS架构的局限性

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挂掉对业务产生的影响。-------------并不能提供高可用性[email protected]

为什么纵向扩展目前的Namenode不可行?

比如将Namenode的Heap空间扩大10倍,由原来的50G增大到500GB,这样纵向扩展带来的:

  1. 第一个问题就是启动问题,启动花费的时间太长。因为,启动的过程中读的fsimage和editlog,当内存设置到500G时,你的fsimage会非常大。配置50GB Heap size时,Namenode的HDFS启动一次大概需要半个小时,甚至更久,那500GB的需要多久? 这个不是线性的扩大10倍的问题,即使线性扩大10倍,那也不是客户所能接受的。

  1. 第二个潜在的问题就是Namenode在Full GC时,如果发生错误将会导致整个集群宕机,Full GC 的时间会变得很长,长的超过集群大部分的超时时间。

  1. 第三个问题是对大JVM Heap进行调试比较困难。优化Namenode的内存使用性价比比较低

为什么要引入Federation

Federation中文意思为联邦,联盟,是NameNode的Federation,也就是会有多个NameNode。

Federation能够快速的解决了大部分单Namenode HDFS的问题。

Federation 整个核心设计实现大概用了3.5个月。大部分改变是在Datanode、Config和Tools,而Namenode本身的改动非常少,这样Namenode原先的鲁棒性不会受到影响。

Federation良好的向后兼容性,已有的单Namenode的部署配置不需要任何改变就可以继续工作。

HDFS的Federation机制

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提供本地文件系统上块的存储、读写、访问等。

Federation HDFS与当前HDFS的比较及改进

架构的变化

单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都可以随时动态加入、删除和更新。

Federation中的其他方面的改进

提供了工具,对于Namenode的初始化和退役的监控和管理。 允许在datanode级别或者block pool级别的负载均衡。 Datanode的后台守护进程,为Federation所做的磁盘和目录扫描。 提供了显示Namenode的Block pool的使用状态的Web UI。 还提供了对全部集群存储使用状态的UI展示。 在Web UI中列出了所有的Namenode及其细节,如Namenode-BlockPoolID和存储的使用状态,失去联系的、活的和死的块信息。还有前往各个Namenode Web UI的链接。 Datanode退役状态的展示。

多命名空间的管理问题

在一个集群中需要唯一的命名空间还是多个命名空间,核心问题是命名空间中数据的共享和访问的问题。使用全局唯一的命名空间是解决数据共享和访问的一种方法。在多命名空间下,可以使用Client Side Mount Table方式做到数据共享和访问,而Client Side Mount Table 则是通过新的文件系统viewfs实现的。----------多个命名空间下的 数据共享,比如我们的Java应用通过连接一个namespace,来获取所有的数据[email protected]

Namespace Volume(命名空间卷=Namespace+Block Pool)

一个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>]

猜你喜欢

转载自blog.csdn.net/cuiyaonan2000/article/details/129755924