sujins 2014-08-13
【HDFS Federation(2.2+)】
一、Background
HDFS数据存储主要有两层:
1、 Namespace,包含“目录”、“文件”、“blocks”信息,支持所有的与namepace相关的文件系统的操作,例如目创建、删除、修改,以及对目录文件的列表操作。
2、Block存储服务:
A) Block管理:Namenode负责,集群中的Datanodes向Namenode注册状态且间歇性的发送心跳;Namenode接收Datanodes提交的Blocks报告,并负责维护Blocks的位置关系;支撑Blocks相关的操作,例如Block的创建、删除、修改、迁移,以及获取block的位置信息;管理replicas的放置,以及对under-replicated的blocks进行备份,以及删除over-replicated的多余的blocks。
B) Storage:由Datanodes负责,用于提供Blocks实际数据的存储和读写操作。
HDFS架构中,集群中只允许一个Namespace,即一个Namenode管理Namespace。HDFS Federation(联盟)通过在HDFS文件系统中增加支持多个Namenodes/namespaces,以解决这种架构上的限制。
二、Multiple Namenodes/Namespaces
为了水平扩展name service,Federation使用了多个独立的Namenodes/namespace。Namenodes是联合的(federated),即他们互相独立,不需要彼此间互相协同。Datanodes作为普通的存储,服务于所有的Namenodes。每个Datanodes会与集群中所有的Namenodes注册,Datanodes向Namenodes发送心跳和Block reports,以及处理Namenodes发送的指令。
1、Block Pool
Block Pool就是同一个namespace下的多个Blocks的集合。Datanodes为整个集群中所有Block pools提供存储服务。各个Block pool在被管理上是互相独立的。每个Namespace会为新的Block生成Block ID,而且无需和其他Namespace协调;一个Namenode的失效,不会影响Datanodes继续为其他Namendoes服务。(每个Namespace对应一个Block Pool)
Namespace与其Block pool统称“Namespace volume”,它是一个子包含(selft-contained)的管理单元。当一个Namenode/Namespace被删除,那么Namespace对应的Block Poll也将被删除。每个Namespace Volume在软件更新时(ungrade)也作为一个单元。
2、ClusterID
一个新的标识ClusterID添加到集群,用来标记所有的Nodes,当Namenode格式化时(formated),将会自动创建ClusterID,这个ID用来区分集群中的Namenodes。
3、Key Benefits(主要收益)
A) Namespace 扩展性:HDFS集群中存储层可以水平扩展,但是namespace无法做到,大规模集群部署或者系统中有较多的小文件时,将可以通过添加多个Namenodes实现namespace的水平扩展。
B) 性能:根据HDFS的架构,文件系统操作的吞吐量将受限于单个Namenode,通过添加多个Namenodes的方式扩展文件系统,可以提升其读写能力。
C) Isolation(隔离):单个Namenode在多用户环境中无法提供“隔离”。一个测试(experimental)程序可以将Namenode过载,并拖慢production核心应用。通过使用多个Namenode,将不同类型的应用和用户隔离到不同的Namenodes中。(环境 + 用户隔离)
三、Federation配置
Federation配置时向后兼容的,对于现存的单Namenode配置而言,不需要任何修改即可工作。新的配置文件可以在所有的nodes都一样,不需要根据node类型而部署不同的配置文件。
一个新的概念NameServiceID被添加到Federation中,Namdenode和相应的SNN、backup、checkpoiner节点都按照NameServiceID划分。为了能够在一个配置文件中支持Federation(即多Namenodes),那么和Namenode、SNN、backup、checkpoint配置参数,都需要以相应的NameServiceID作为后缀。
1、配置
A) Step 1:将"dfs.nameservices"配置项添加到hdfs-site.xml中,它的值为NameServiceID列表,以“,”分割;Datanodes将使用它们来判断集群中的Namenodes。
B) Step 2:每个Namenode、SNN、Backup、Checkpointer中,将下文中几个配置项添加到配置文件中,每个配置项以对应的NameServiceID作为后缀。(hdfs-site.xml)
Namenode | dfs.namenode.rpc-address dfs.namenode.servicerpc-address dfs.namenode.http-address dfs.namenode.https-address dfs.namenode.keytab.file dfs.namenode.name.dir dfs.namenode.edits.dir dfs.namenode.checkpoint.dir dfs.namenode.checkpoint.edits.dir |
Secondary Namenode | dfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.file |
BackupNode | dfs.namenode.backup.address dfs.secondary.namenode.keytab.file |
配置样例:
<configuration> <property> <name>dfs.nameservices</name> <value>ns1,ns2</value> </property> <property> <name>dfs.namenode.rpc-address.ns1</name> <value>nn-host1:rpc-port</value> </property> <property> <name>dfs.namenode.http-address.ns1</name> <value>nn-host1:http-port</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.ns1</name> <value>snn-host1:http-port</value> </property> <property> <name>dfs.namenode.rpc-address.ns2</name> <value>nn-host2:rpc-port</value> </property> <property> <name>dfs.namenode.http-address.ns2</name> <value>nn-host2:http-port</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.ns2</name> <value>snn-host2:http-port</value> </property> .... Other common configuration ... </configuration>
如果配置中,上述配置项没有NameServiceID作为后缀,将默认对所有的NameService有效。
2、格式化Namenodes
一次在每个Namenode上执行“bin/hdfs namenode -format [-clusterId <clusterId>]”,format指令可以指定clusterID,如果不指定将自动生成一个唯一的ClusterID。(基于UUID生成,因此多次format事实上UUID不变,参见,Namenode#format)
因为ClusterID是标记集群的唯一标记,那么一个集群中所有的Nodes包括Namenodes都应该持有相同的ClusterID,否则这些Namenodes将不能构建Federation。
因此在集群中所有的Namenodes上执行-format指令时,需要指定相同的ClusterID。对于默认生成的ClusterID,可以在"${dfs.namenode.name.dir}/current"目录下的VERSION文件中获得,并将此值传递给后续的其他Namenodes。
3、向集群添加新的Namenode
基于集群中现有的配置文件,将新的Namenode相关的配置项添加到配置文件中(以NameserviceID作为后缀)。调整结束后,将配置文件同步分发给集群中所有的nodes,然后启动当前Namenode、Backup、SNN等。
因为配置文件的修改,通常需要重启集群,这是一种比较保守且安全的方式。不过因为Federation就是实现环境隔离的,所以我们可以只启动那些与新Namenode有关的Datanodes,那么只有这些Datanodes上会存储此Namenode有关的blocks,通过-refreshNamenodes指令可以实现不重启Datanodes的情况下,让其刷新并加载新的Namenode,此后它会与新Namenode注册。
“hdfs dfsadmin -refreshNamenodes <datanodehost:port>”
不过为了安全起见,建议将refresh集群中的所有Datanodes。
四、集群管理
1、Startup and Stop
通常我们可以使用“sbin/start-dfs.sh”、“sbin/stop-dfs.sh”来分别启动和关闭集群中所有的守护进程,是一个便捷的方式。此指令可以在集群中任何node上运行,指令可以根据配置文件来判断Namenode(hdfs-site.xml)以及其他nodes的位置(slaves),并SSH到各个node依次执行。
2、Balancer
Relancer机制是HDFS中很重要的特性,用来动态平衡集群中存储资源的放置位置。start-dfs.sh默认并不会启动balancer,因此balancer功能组件需要额外运行:
“sbin/start-balancer.sh [-policy <node | blockpool>] [-threshold <num>]”
-policy参数指定balancer使用的策略,有两个合法值“node”、“blockpool”,其中node为默认值,表示balancing将基于datanode级别;“blockpool”只能在Federation架构下有效,balancer级别为“blockpool”表示每个datanode上每个blockpool的blocks个数分布均衡。建议保持默认。