HDFS Federation[官网整理]

【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发送的指令。


HDFS Federation[官网整理]
 

    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个数分布均衡。建议保持默认。

相关推荐