HDFS Federation
这是对HDFS Federation特性以及怎样配置管理HDFS Federation的概述。
背景
HDFS 主要有两层:
前一阶段的 HDFS架构中一个集群只支持一个namespace。由这个单独的namenode来管理这些namespace。而 HDFS Federation在hdfs系统中增加了多个Namenodes/namespaces,打破了这一限制.
多个Namenodes/Namespaces
为了使命名服务横向扩展, federation 使用多个各自独立的 Namenodes/namespaces. 这些 Namenodes 组成联邦组织,也就是说, 这些 Namenodes是独立的,不需要与任何其他namenode进行合作. 所有的namenode共享所有的datanode作为存储. 每一个datanode都在集群中所有的namenode注册自己的信息. 而且Datanodes需要阶段性地向所有的namenode发送心跳信息和块信息报告,处理来自namenode的命令.
Block池
Block池就是属于一个namespace的一些block. Datanodes为所有namenode存储block。一个block池与其他block池被分别管理。这样就允许一个namespace产生一些不必与其他namespace的block打交道的新的block。一个namenode的失败就不会影响到其他namenode下的datanode.
一个namespace和它的block池被称为Namespace Volume。它是一个独立的管理单元。当一个Namenode/namespace被删除,对应的block池中的所有datanode都被删除了。每一个namespace volume会在集群升级的时候,作为一个单元被升级。
集群ID
ClusterID 是用来区分集群中的所有节点的。当一个Namenode 被格式化,这个标识符就会自动产生出来,它应该被用来格式化其他namenode到集群中.
关键性能参数
Federation 配置
Federation configuration is 向后兼容(backward compatible) 并且已经存在的namenode继续工作,不用做任何改变. The new configuration is designed such that all the nodes in the clusterhave same configuration without the need for deploying different configurationbased on the type of the node in the cluster.
A new abstraction called NameServiceID is added with federation. Namenode 和它对应的secondary/backup/checkpointer nodes都属于这个ID. 为了区分各个namenode的各自的配置文件, Namenode 和它的 secondary/backup/checkpointer 的配置信息都以 NameServiceID为后缀 ,并且都放进同一个配置文件中.
配置:
Step 1: 在你的配置文件中加入如下参数: dfs.nameservices: 一些NameServiceID,用逗号隔开. 这个参数是被datanode用来识别namenode的.
Step 2: 每一个 Namenode和Secondary Namenode/BackupNode/Checkpointer 加上以自己对应的NameServiceID 为后缀的参数.
Daemon |
Configuration Parameter |
Namenode |
dfs.namenode.rpc-address |
Secondary Namenode |
dfs.namenode.secondary.http-address |
BackupNode |
dfs.namenode.backup.address |
这是一个有两个namendoe的案例:
<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>
格式化Namenodes
Step 1: 使用如下命令格式化namenode:
> $HADOOP_PREFIX_HOME/bin/hdfsnamenode -format [-clusterId<cluster_id>]
选择一个唯一的cluster_id, 这个cluster_id不能和当前环境中的其他集群冲突。如果不写这个参数的话,会自动产生一个.
Step 2:使用如下命令格式化其他namenode:
>$HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
注意这里的cluster_id 必须要和在第一步中使用的一致,否则新加的这个namenode就不会成为第一步中集群的一员.
从老版本升级
老版本支持单节点Namenode. 下面是升级到federation的步骤:
Step 1: 升级集群到一个更新的发布版本,可以提供一个cluster_id:
>$HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterId <cluster_ID>
如果不提供cluster_id, 它还是会自动产生,呵呵.
在已有的hdfs集群中添加namenode
>$HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode<datanode_host_name>:<datanode_rpc_port>
管理集群
启动和停止集群
启动集群:
>$HADOOP_PREFIX_HOME/bin/start-dfs.sh
停止集群:
>$HADOOP_PREFIX_HOME/bin/stop-dfs.sh
只要有HDFS的配置信息,这些命令可以在任意节点运行. 命令运用配置信息去判断集群中的namenode是哪个,然后找到它启动namenode。slaves中指定了namenode。你可以自定义脚本来启动或者停止集群。
Balancer
Balancer被修改成与集群中的多个Namenodes协同工作.
"$HADOOP_PREFIX"/bin/hadoop-daemon.sh--config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer[-policy <policy>]
平衡策略是:
注意: Balander只平衡数据,不平衡namespace.
退役
Decommissioning和以前版本一样. 在所有的namenode,要退役的节点被加入exclude. 每一个Namenode 将他的block池退役. 当所有的Namenodes完成了退役, 这个datanode 就要退役了.
Step 1: 退役一个datanode的命令:
"$HADOOP_PREFIX"/bin/distributed-exclude.sh<exclude_file>
Step 2: 刷新通知所有的namenode.
"$HADOOP_PREFIX"/bin/refresh-namenodes.sh
以上命令通过HDFS配置信息来判断Namenodes并且刷新这些namenodes.
集群 Web 控制台
http://<any_nn_host:port>/dfsclusterhealth.jsp. 集群中的所有可用的Namenode都可以访问这个web页面.
这个web页面提供以下信息: