本文主要介绍HDFS Federation(联邦)相关知识,为后续文章《如何为CDH集群启用Federation(联邦)》做一个简单的铺垫。Federation即为“联邦”,该特性允许一个HDFS集群中存在多组Namenode同时对外提供服务,分管一部分目录(水平切分),彼此之间相互隔离,但共享底层的Datanode存储资源。
文章目录结构:
1. 文档编写目的
2. Federation
2.1 单组Namenode架构
2.2 单组Namenode局限性
2.3 为什么要引入Federation
3. Federation介绍
3.1 Federation架构
3.1.1 主要优点
3.1.3 主要缺点
3.2 Federation局限性
4. 总结
HDFS主要有两大模块:
Datanode提供本地文件系统上Block的存储、读写、访问等。
单组Namenode架构
通常情况下,单组Namenode能够满足集群大部分需求,单点故障问题可以通过启用HA解决,单组Namenode包含一主一备两个Namenode,通过Zookeeper保障及控制Failover,而Zookeeper本身具有高可用特性,好像完全不用担心单点故障造成集群不可用的问题,一切看起来似乎非常完美。然而,随着集群规模不断的增长,似乎又不是那么完美了。
单组Namenode只允许整个集群有一个活动的Namenode,管理所有的命名空间。随着集群规模的增长,在1000个节点以上的大型Hadoop集群中,单组Namenode的局限性越发的明显,主要表现在以下几个方面:
既然单组Namenode存在上述局限性,那么为什么要通过Federation的方式横向拓展Namenode,纵向拓展Namenode为什么不行?不选择纵向拓展Namenode的原因主要体现在以下三个方面:
1.采用Federation的最主要的原因是简单,Federation能够快速的解决大部分单Namenode的问题。
2.Federation是简单鲁棒的设计,由于联邦中各个Namenode之间是相互独立的。Federation整个核心设实现大概用了3.5个月。大部分改变是在Datanode、Config和Tools,而Namenode本身的改动非常少,这样Namenode的原先的鲁棒性不会受到影响。比分布式的Namenode简单,虽然这种事先的扩展性比起真正的分布式的Namenode要小些,但是可以迅速满足需求。
3.Federation良好的向后兼容性,已有的单Namenode的部署配置不需要进行太大的改变就可以继续工作。
为了水平扩展名称服务,Federation使用多组独立的Namenodes/Namespaces。所有的Namenodes是联邦的,也就是说,他们之间相互独立且不需要互相协调,各自分工,管理自己的区域。Datanode被用作通用的数据块存储设备,每个DataNode要向集群中所有的Namenode注册,且周期性的向所有Namenode发送心跳和块报告,并执行来自所有Namenode的命令。
Federation架构与单组Namenode架构相比,主要是Namespace被拆分成了多个独立的部分,分别由独立的Namenode进行管理。
Federation架构
增加一个新的ClusterID来标识在集群中所有的节点。当一个Namenode
被格式化的时候,这个标识被指定或自动生成,这个ID会用于格式化集群中的其它Namenode。
HDFS的水平扩展,但是命名空间不能扩展,通过在集群中增加Namenode来扩展Namespace,以达到大规模部署或者解决有很多小文件的情况。
在之前的框架中,单个Namenode文件系统的吞吐量是有限制的,增加更多的Namenode能增大文件系统读写操作的吞吐量。
一个单一的Namenode不能对多用户环境进行隔离,一个实验性的应用程序会加大Namenode的负载,减慢关键的生产应用程序,在多个Namenode情况下,不同类型的程序和用户可以通过不同的Namespace来进行隔离。
由于Namespace被拆分成多个,且互相独立,一个文件路径只允许存在一个Namespace中。如果应用程序要访问多个文件路径,那么不可避免的会产生交叉访问Namespace的情况。比如MR、Spark任务,都会存在此类问题。
启用Federation后,HDFS很多管理命令都会失效,比如“hdfs dfsadmin、hdfs fsck”等,除此之外,“hdfs dfs cp/mv”命令同样失效,如果要在不同Namespace间拷贝或移动数据,需要使用distcp命令,指定绝对路径。
在解决NameNode扩展能力方面,社区虽然提供了Federation,但这个方案有很强的局限性:
对其中一些名词的解释:在HDFS中namespace是指NameNode中负责管理文件系统中的树状目录结构以及文件与数据块的映射关系的一层逻辑结构,在Federation方案中,NameNode之间相互隔离,因此社区也用一个namespace来指代Federation中一组独立的NameNode及其元数据。Scheme是URI命名结构([scheme:][//authority][path][?query][#fragment])中的一部分,用于标识URI所使用的协议,HDFS路径也是一个URI,常见的Scheme为HDFS,在Federation的方案中,HDFS路径Scheme为ViewFs。挂载点(mount point),它在HDFS Federation中和Linux中的概念近似,指在HDFS客户端上下文中,将ViewFs为Scheme的一个路径,比如viewfs://ns/user,映射到一个具体的HDFS路径上,比如hdfs://ns2/user,这个路径可以是任意Scheme的HDFS路径,这样对于viewfs://ns/user实际上会被转换为对hdfs://ns2/user的操作。 |
---|
1、由于单组Namenode在大规模集群中存在较大的局限性,Hadoop开源社区提供了Federation的方案,由多组Namenode在一个集群中共同提供服务,每个Namenode拥有一部分Namespace,工作互相独立,互不影响。
2、在Federation中,Datanode被用作通用的数据块存储设备,每个DataNode要向集群中所有的Namenode注册,且周期性的向所有Namenode发送心跳和块报告,并执行来自所有Namenode的命令。
3、任何事物都存在两面性,Federation在解决单组Namenode的局限性的同时,又带来了新的局限性,详情可参阅3.2节。
参考文章:
https://tech.meituan.com/hdfs_federation.html
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/Federation.html
https://blog.csdn.net/beidiqiuren/article/details/51549007