【hadoop 2学习】联合的HDFS


下文给出了HDFS联合的总体概述,并且和1.x比较,最后是如何管理和配置集群。

图1是1.x HDFS架构:

从上图中,可以看出,HDFS分为两层,Namespace和Block Storage,下面分别回顾一下:

  • Namespace(命名空间)
    • 包含目录、文件和块
    • 支持所有Namespace相关的操作(新建、修改、删除等)
  •  Block Storage Server(块存储服务)
    • Block Management(块管理)
      • 通过处理注册信息和周期性的心跳提供DataNode集群成员(Provides DataNode cluster membership by handling registrations, and periodic heart beats.)
      • 处理块报告和维护块位置
      • 支持块相关操作
      • 管理副本位置和确保一个块的副本数量在允许的副本数量内,删除超出的副本
    • Storage(存储)
      • 由存储在本地文件系统的DataNode提供,并允许read/write访问

多NameNodes/Namespaces

2,x提供NameNode水平扩展,但是NameNodes之间是相互独立,并不需彼此之间合作。DataNodes则被所有的NameNodes用作通用的块存储,每一个DataNode注册在集群中所有的NameNodes上。

    DataNodes发送周期性心跳和块报告到NameNodes,并且处理NameNodes发送的命令。

2.x HDFS联盟的架构图如下:

 

  •    Block Pool(块池)
    • 一个块池是属于一个NameSpace的块集合,DataNodes存储块即集群中的所有块池(DataNodes store blocks for all the block pools in the cluster)。块池之间是独立管理的,因此允许一个NameSpace在不需与其他NameSpace合作的情况下产生一个新的块ID。一个NameNode的失效并不会影响一个DataNode为集群中的其他NameNode提供服务。
    • NameSpace和它的块池一起被称为命名空间卷(NameSpace Volume),这是一个独立的管理单元。
    • 当一个NameNode/NameSpace被删除,DataNode对应的块池也被删除,当集群升级时,每一个命名空间卷作为一个单元升级。
  • ClusterID
    • 作为一个新的标识ID,它标识集群中所有的Nodes,当NameNode格式化时,标识ID被提供或者自动产生,例如上图中的NN-1,NN-K等
    • 这个ID在格式化集群中的其他NameNodes时会用到(如何用?)

主要优点:

  • NameSpace可扩展性。1.x的HDFS集群存储是可扩展的,但是NameNode不行,2.x中增加多个NameSpace/NameNodes到集群中,这样大的部署或者有很多小文件部署将收益于此。
  • 性能。1.x中文件系统操作吞吐量受限于单NameNode,增加更多的NameNode到集群中可以扩展文件系统读/写操作吞吐量
  • 隔离性。单NameNode在多用户环境下五隔离性,这可能出现一个实验性的应用程序使用NameNode过载而降低关键应用程序的工作性能。2.x提供多个NameNodes,不同类别应用和不同用户可以被不同NameSpace 隔离,互不影响。

联合HDFS配置(Federation Configuration)

         联合配置是向下兼容(backword compatibale),允许存在单个NameNode配置运行并且不需要修改任何配置。新的配置被设计成集群中的所有结点具有相同的配置文件,而不需要根据集群中的结点类型部署不同的配置文件。

        联合中增加一个叫NameServiceID的新的抽象。NameNode和它对应的二级/备份/检查点(secondary/backup/checkpointer)属于此。为了支持单配置文件,NameNode和第二/备份/检查点配置参数会加上NameServiceID,并且添加到相同配置文件中。

配置:

step1:增加下面的参数到你的配置文件中:dfs,nameservices:配置带以逗号隔开的NameServicesIDs列表。这个被DataNodes使用来确定集群中所有的NameNodes。

step2:对每个NameNode和二级NameNode/BackupNode/Checkpointer  增加如下的配置后缀对应的NameServiceID到公共配置文件中:

守护进程 配置参数
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

下面是有两个NameNodes的配置文件:

<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.secondary.http-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>

格式化NameNodes

step 1:使用下面的命令格式化一个NameNode:

> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]

选择一个唯一的cluster_id,这个id不会和其他工作环境的集群冲突。如果没有指定,会自动产生一个唯一的ClusterID。

step 2:使用如下的命令格式化其他的NameNode:

> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id>

注意:第二步中的cluster_id 必须和第一步中的cluster_id相同(第二步中的哪个id?),如果不同,附加的NameNodes不会是联合集群中的一部分。

从老版本升级到0.23并且配置联合HDFS

老版本支持单NameNode,下面步骤可以升级到联合HDFS:

step1:升级集群到新的版本,在升级的时候,可以提供一个ClusterID:

> $HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterID <cluster_ID>

如果ClusterID没有提供,会自动产生。

增加一个新的NameNode 到一个存在的HDFS集群

步骤如下:

  • 增加配置参数dfs.nameservices到配在文件
  • 升级配置NameServiceID后缀。配置键值名在0.20版本后已经改变。对于联盟HDFS,需要使用新的配置参数名
  • 增加新的NameNode相关的配置到配置文件
  • 发送配置文件到所有的集群结点
  • 启动新的NameNode,二级/备份NameNode
  • 通过以下命令刷新的DataNodes以包括新的增加的NameNode

> $HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port>
       上面的命令必须在所有的集群中的datanodes中运行一遍

管理集群       

          开始和停止集群

            开启集群命令:

          

> $HADOOP_PREFIX_HOME/bin/start-dfs.sh
           关闭集群命令:

         

> $HADOOP_PREFIX_HOME/bin/stop-dfs.sh

     这些命令可以在任何HDFS配置可以的结点执行。命令使用配置决定集群中的NameNodes,开启这些结点中的NameNode进程。结点中启动的DataNodes是在slave文件中指定的。上面的脚本可以在创建自己的启动和停止集群的脚本时作为参考。

      平衡器

        为了平衡集群 ,平衡器已经改变去协调多个NameNodes(Balancer has been changed to work with multiple Namenodes in the cluster to balance the cluster)。平衡器可以通过下面命令执行:

        

“$HADOOP_PREFIX”/bin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer [-policy <policy>]

     policy为:

  • node--这是默认的策略(policy)。这样可以在DataNode级平衡存储。这个和之前版本的平衡策略相似
  • blockpool--这样可以在块池级别平衡存储。在块池级别平衡存储,也同时在DataNode级别

        注意:这个平衡仅仅平衡数据,不会平衡namespace。

Decommissioning(?排除,撤销)

这个规则和之前版本类似,需要撤销的结点增加到所有NameNode的排除文件中。每个NameNode排除各种的块池。当所有的NameNode完成排除一个DataNode,这个DataNode才被认为被排除。

step1:分派一个排除文件到所有的NameNodes:

"$HADOOP_PREFIX"/bin/distributed-exclude.sh <exclude_file>

step2:刷新所有的NameNodes:

 

"$HADOOP_PREFIX"/bin/refresh-namenodes.sh

上面的命令使用HDFS配置去决定配置在集群的NameNodes,并且刷新所有的NameNode去使用新的排除文件。

集群web控制台

和NameNode状态web页相似,一个集群web控制台增加去监控联盟集群: http://<any_nn_host:port>/dfsclusterhealth.jsp,任何集群中的NameNode都可以访问。



相关内容

    暂无相关文章