【hadoop 2学习】联合的HDFS
【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访问
- Block Management(块管理)
多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都可以访问。
评论暂时关闭