HDFS Federation(联邦)
注:这个文档已经有很多译文,但不同的人翻译有不同的理解,时间匆忙,加之英文水平有限,有误的地方请指正。
原文:http://hadoop.apache.org/common/docs/current/hadoop-yarn/hadoop-yarn-site/Federation.html
本指南是对HDFS联邦的简要介绍及如何配置和管理HDFS联邦。
背景
HDFS主要有两大模块:
Namespace
包括目录、文件和块。
它支持所有命名空间相关的文件操作,如创建、删除、修改,查看所有文件和目录。
Block Storage Service(块存储服务)包括两部分
在namenode中的块的管理
提供datanode集群的注册、心跳检测等功能。
处理块的报告信息和维护块的位置信息。
支持块相关的操作,如创建、删除、修改、获取块的位置信息。
管理块的冗余信息、创建副本、删除多余的副本等。
存储:datanode提供本地文件系统上块的存储、读写、访问等。
以前的HDFS框架整个集群只允许有一个namenode,一个namenode管理所有的命名空间,HDFS联邦通过增加多个namenode来打破这种限制。
多namenodes/namespaces。
为了水平扩展名称服务,联邦使用多个独立的namenodes/namespaces。所有的namenodes是联邦的,因此,单个namenode是独立的,不需要和其它namenode协调合作。datanode作为统一的块存储设备被所有namenode节点使用。每一个datanode节点都在所有的namenode进行注册。datanode发送心跳信息、块报告到所有namenode,同时执行所有namenode发来的命令。
Block Pool(块池)
一个块池就是属于一个namespace的一组块。datanodes存储集群中所有的块池,它独立于其它块池进行管理。这允许namespace在不与其它namespace交互的情况下生成块的ID,有故障的namenode不影响datanode继续为集群中的其它namenode服务。一个namespace和它的blockpool一起叫做namespace volume,这是一个自己的管理单位,当一个namenode被删除,那么在datanode上的相应的block pool也会被删除。在集群进行升级的时候,每一个namespace volume独立的进行升级。
ClusterID
增加一个新的ClusterID标识来在集群中所有的节点。当一个namenode被格式化的时候,这个标识被指定或自动生成,这个ID会用于格式化集群中的其它namenode。
主要优点
namespace的可扩展性:HDFS的水平扩展,但是命名空间不能扩展,通过在集群中增加namenode来扩展namespace,以达到大规模部署或者解决有很多小文件的情况。
Performance(性能):在之前的框架中,单个namenode文件系统的吞吐量是有限制的,增加更多的namenode能增大文件系统读写操作的吞吐量。
Isolation(隔离):一个单一的namenode不能对多用户环境进行隔离,一个实验性的应用程序会加大namenode的负载,减慢关键的生产应用程序,在多个namenode情况下,不同类型的程序和用户可以通过不同的namespace来进行隔离。
Federation Configuration(联邦配置)
联邦的配置是向后兼容的,允许在不改变任何配置的情况下让当前运行的单节点环境转换成联邦环境。新的配置方案确保了在集群环境中的所有节点的配置文件都是相同的,没有必要因为节点的不同而配置不同的文件。
在联邦环境下引入了一个新的概念叫NameServiceID,namenode和secondary/backup/checkpointer都属于这个,为了支持单文件配置, Namenode和secondary/backup/checkpointer的配置参数都以NameServiceID为后缀加到同一个配置文件中。
配置过程:
第一步:把dfs.federation.nameservices配置参数加到配置文件,配置以逗号分隔的所有NameServiceID,这将用于让datanode识别在集群中的所有namenode。
第二步:对于每一个Namenode和Secondary Namenode/BackupNode/Checkpointer 增加以NameServiceID为后缀的下列配置项:
Daemon
配置参数
Namenode
dfs.namenode.rpc-address dfs.namenode.servicerpc-address dfs.namenode.http-address dfs.namenode.https-address dfs.namenode.keytab.file dfs.namenode.name.dirdfs.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
下面是两个namenode的配置示例:
<configuration>
<property>
<name>dfs.federation.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>
格式化namenode
第一步:使用下面的命令格式化namenode。
>$HADOOP_PREFIX_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
选择一个唯一的cluster_id,不能和当前环境中的其它集群相同,如果不提供这个参数,则系统会给一个默认值。
第二步:使用如下命令格式化其它的namenode.
>$HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
注意,cluster_id必须和上一步中的相同,如果不同,其它的namenode将不是联邦的一部份。
从老版本升级到0.23并配置联邦
老版本只支持一个namenode,能过下面的步骤能配置为联邦:
第一步:升级集群到新的版本,升级期间你可以像下面一样提供一个cluster_id:
>$HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterId <cluster_ID>
如果不提供cluster_id,它将会自动生成。
第二步:增加一个namenode到当前的HDFS集群。
按如下步骤操作:
增加dfs.federation.nameservices配置项到配置文件。
用NameServiceID为后缀更新其它配置项,从0.2版本,配置项的Key发生了变化,你需要使用新的配置项名称。
增加一个新的namenode配置信息到配置文件。
把配置文件分发到集群中所有的节点。
启动新的Namenode,Secondary/Backup.
通过运行下面的命令来更新datanode以识别新的namenode:
>$HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode<datanode_host_name>:<datanode_rpc_port>
上面的命令必须在集群中所有的datanode上运行。
管理集群
启动和停止集群
执行下面的命令来启动集群:
>$HADOOP_PREFIX_HOME/bin/start-dfs.sh
执行下面的命令来停止集群:
>$HADOOP_PREFIX_HOME/bin/stop-dfs.sh
这些命令可以在有配置文件的任何一个节点上执行即可。这个命令使用配置文件来确定集群中的namenodes,然后启动这些节点。只启动在slaves文件中的datanode节点。你可以编写自己的脚本来启动和停止集群。
平衡器
Balancer 已经针对多个namenodes进行了更改,以保证能够平衡集群环境。可以运行如下命令:
"$HADOOP_PREFIX"/bin/hadoop-daemon.sh--config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer[-policy <policy>]
policy可以是:
node 这是默认策略,这是在datanode一级进行存储平衡,和以前的版本一样。
blockpool 这是在blockpool一级的存储平衡,这将同时平衡blockpool和datanode的存储。
注意:Balancer 只平衡数据,不平衡namesapce。
Decommissioning(退役)
退役和之前的版本很像,需要退役的节点增加到namenodes的exclude文件,每一个namenode退役它自己的block pool。当所有的namenode结束了一个datanode的退役,datanode才被认为已退役。
第一步:使用下面的命令分发exclude文件到所有namenodes:
"$HADOOP_PREFIX"/bin/distributed-exclude.sh<exclude_file>
第二步:更新所有namenodes去获取exclude文件。
"$HADOOP_PREFIX"/bin/refresh-namenodes.sh
上面的命令使用HDFS配置文件去确定集群环境中的所有namenode,然后更新所有namenodes去获取exclude文件.
集群web控制台
和namenode状态web页面一样,联邦环境增加了一个web控制台来监控联邦集群。地址是:http://<any_nn_host:port>/dfsclusterhealth.jsp
集群中的任何一个namenode都可以访问到这个页面。
这个页面提供如下一些信息:
整个集群的文件数、块数、总的配置的存储容量、可用和已用的存储的信息。
提供一个所有namenodes的列表及其所包含的文件数、块数、丢失的块数、在线和离线的datanode。提供一个方便的连接到namenodes Web界面的URL。
同时也提供datanode的退役状态。