当前位置:编程学习 > 网站相关 >>

HDFS HA功能简介及配置

Hadoop 0.23.2版本之前, NameNode是HDFS集群的单点故障点,每一个集群只有一个NameNode,如果这个机器或进程不可用,整个集群就无法使用,直到重启NameNode或者新启动一个NameNode节点。
影响HDFS集群不可用主要包括以下两种情况:
1、第一种情况是如机器宕机这样的意外情况,将导致集群不可用,只有在重启NameNode之后才可使用。
2、第二种情况是计划内的软件或硬件升级(NameNode节点),将导致集群在短时间范围内不可用。
HDFS的HA就是为了解决上述问题,通过提供选择运行在同一集群中的一个热备用的“主/备”两个冗余NameNodes。这允许在机器宕机或系统维护的时候,快速的转移到另一个NameNode.
 
 
一个典型的HA集群,两个单独的机器配置为NameNodes,在任何时候,一个NameNode处于活动状态,另一个处于待机状态,活动的NameNode负责处理集群中所有客户端的操作,待机时仅仅作为一个slave,保持足够的状态,如果有必要提供一个快速的故障转移.
为了保持备用节点与活动节点状态的同步,目前的实现需要两个节点同时访问一个共享存储设备(例如从NASNFS挂载)到一个目录。将有可能在未来的版本中放宽此限制。
当活动节点对命名空间进行任何修改,它将把修改记录写到共享目录下的一个日志文件,备用节点会监听这个目录,当发现更改时,它会把修改内容同步到自己的命名空间。备用节点在故障转移时,它将保证已经读取了所有共享目录内的更改记录,保证在发生故障前的状态与活动节点保持完全一致。
为了提供快速的故障转移,必须保证备用节点有最新的集群中块的位置信息,为了达到这一点,Datanode节点需要配置两个nameNode的位置,同时发送块的位置信息和心跳信息到两个nameNode。
任何时候只有一个namenode处于活动状态,对于HA集群的操作是至关重要的,否则两个节点之间的状态就会产生冲突,数据丢失或其它不正确的结果,为了达到这个目的或者所谓的“裂脑场景”出现,管理员必须为共享存储配置至少一个(fencing)方法。在宕机期间,如果不能确定之间的活动节点已经放弃活动状态,fencing进程负责中断以前的活动节点编辑存储的共享访问。这可以防止任何进一步的修改命名空间,允许新的活动节点安全地进行故障转移。
注:目前,只有手动故障转移支持。这就意味着HA nameNode不能自动检测活动nameNode的失败,而是通过手动启动故障转移。自动故障检测和故障转移将在未来的版本中实现。
 
硬件资源
为了部署一个HA集群环境,您需要准备以下资源:
NameNode 机器:运行活动节点和备用节点的机器和非HA环境的机器需要有同相的硬件配置。
共享存储:您需要有一个主备namenode节点都是可读写的共享目录,通常情况,这是一个远程的文件管理器,它支持使用NFS挂载到每个namenode节点。目前只支持一个可编辑目录。因此,系统的是否可用将受限于共享目录是否可用,因此,为了消除所有单点故障,需要对共享目录再加冗余,具体来说,多个网络路径的存储需要实现存储系统自身的冗余。因为这个原因,建议共享存储服务器是一个高品质的专用NAS设备,而不是一个简单的Linux服务器。
注:在HA集群环境里,备用的namenode还要执行检测命名空间的状态,因此,没有必要再运行Secondary NameNode,CheckpointNode,BackupNode。事实上,这样做将会报错,这也允许在从非集群环境到集群环境的重新配置时,重新利用之前的Secondary NameNode的硬件资源。
 
部署
配置简介
类似联邦配置,HA配置向后兼容,允许在不改变当前单节点的情况下配置成集群环境,新的配置方案确保了在集群环境中的所有节点的配置文件都是相同的,没有必要因为节点的不同而配置不同的文件。
和联邦配置一样,HA集群环境重复使用名称服务ID来确定一个单一的HDFS实例,实际上可能包括多个HA namenodes.此外,一个新的namenode增加到HA,集群中的每一个nameNode都有一个不同的ID来标识它,为了支持所有namenode有同一个配置文件,所有的配置参数都以命名服务ID和nameNodeID为后缀。
 
详细配置
 
配置HA nameNodes,您需要增加一些配置选项到 hdfs-site.xml 配置文件。
 
这些配置选项的顺序不重要,但dfs.federation.nameservices和dfs.ha.namenodes.[nameservice ID]的值将决定下面配置的Key值。因此,在配置其它选项前,需要确定这两个选项的值。
 
dfs.federation.nameservices一个新的名称服务的逻辑名称。为名称服务选择一个逻辑名称,如“mycluster”,使用这个逻辑名称作为这个配置项的值。这个名称可以是随意的,它将用于配置和集群环境中HDFS绝对路径的认证组件。
注:如果您还使用HDFS联邦,这个配置项应该包括其它的名称服务列表,HA或者其它,用逗号进行分隔。
<property>
 <name>dfs.federation.nameservices</name>
  <value>mycluster</value>
</property>
dfs.ha.namenodes.[nameservice ID]在名称服务中每一个nameNode的唯一标识符
配置一个逗号分隔的NameNode的ID的列表,DataNode会用它来确定在集群中的所有namenode.如我们前面使用"mycluster"作为我们名称服务的ID,你如果使用nn1和nn2作为namenode的ID,你应该这样配置:
<property>
 <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
注:当前一个名称服务最多只允许配置两个namenode。
dfs.namenode.rpc-address.[nameservice ID].[name node ID]每一个namenode监听的标准RPC地址
对于前面配置的两个namenode的ID,设置namenode节点详细的地址和端口,注意,这个配置项将在两个单独的配置项里配置,如:
<property>
 <name>dfs.namenode.rpc-address.mycluster.nn1</name>
 <value>machine1.example.com:8020</value>
</property>
<property>
 <name>dfs.namenode.rpc-address.mycluster.nn2</name>
 <value>machine2.example.com:8020</value>
</property>
注:如果你愿意,你可以配置相同的RPC地址。
dfs.namenode.http-address.[nameservice ID].[namenode ID]每一个namenode监听的标准HTTP地址
和RPC地址一样,设置两个namenode监听的http地址,如:
<property>
 <name>dfs.namenode.http-address.mycluster.nn1</name>
 <value>machine1.example.com:50070</value>
</property>
<property>
 <name>dfs.namenode.http-address.mycluster.nn2</name>
 <value>machine2.example.com:50070</value>
</property>
注:如果你启用了hadoop的安全功能,你也可以同样设置成https地址。
dfs.namenode.shared.edits.dir共享存储目录的位置
这是配置备份节点需要随时保持同步活动节点所作更改的远程共享目录,你只能配置一个目录,之个目录挂载到两个namenode上都必须是可读写的,且必须是绝对路径。如:
<property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>file:///mnt/filer1/dfs/ha-name-dir-shared</value>
</property>
dfs.client.failover.proxy.provider.[nameserviceID]HDFS客户端用来和活动的namenode节目联系的java类
配置的java类是用来给HDFS客户端判断哪个namenode节点是活动的,当前是哪个namenode处理客户端的请求,当前hadoop唯一的实现类是ConfiguredFailoverProxyProvider,除非你自己定义了一个类,否则都将使用这个类。如:
<property>
 <name>dfs.client.failover.proxy.provider.mycluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
dfs.ha.fencing.methods将用于停止活动NameNode节点的故障转移期间的脚本或Java类的列表
任何时候只有一个namenode处于活动状态,对于HA集群的操作是至关重要的,因此,在故障转移期间,在启动备份节点前,我们首先要确保活动节点处于等待状态,或者进程被中止,为了达到这个目的,您至少要配置一个强行中止的方法,或者回车分隔的列表,这是为了一个一个的尝试中止,直到其中一个返回成功,表明活动节点已停止。hadoop提供了两个方法:shell和sshfence,要实现您自己的方法,请看org.apache.hadoop.ha.NodeFencer类。
sshfence 通过ssh连接活动namenode节点,杀掉进程
为了实现SSH登录杀掉进程,还需要配置免密码登录的SSH密匙信息,如下所示:
<property>
 <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
 
<property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <value>/home/exampleuser/.ssh/id_rsa</value>
</property>
另外,也可以配置一个用户名和SSH端口。也可以为SSH设定一个超时,以毫秒为单位,它可以像这样配置:
<property>
 <name>dfs.ha.fencing.methods
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,