分享

Hadoop 双机热备-AvatarNode部署

nettman 2014-5-18 20:30:48 发表于 实操演练 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 8219
问题导读:
1.AvatarNode与NameNode、SecondaryNamenode之间的关系是什么?
2.是否支持从Primary状态切换到Standby状态?
3.hdfs-site.xml需要做哪些配置?
4.core-site.xml与单namenode做了哪些改变?
5.由Standby上升为Primary是否可以降级为Standby?





部署环境
虚拟机5台(1G内存,40G硬盘,ubuntu操作系统,Hadoop-0.20.2)
hadoop1-virtual-machine  10.10.11.250 AvatarNode(primary)
hadoop2-virtual-machine  10.10.11.152 AvataDataNode
hadoop3-virtual-machine  10.10.11.160 AvataDataNode
hadoop4-virtual-machine  10.10.11.184 AvataDataNode
hadoop5-virtual-machine  10.10.12.25  AvatarNode(standby)

相关资源及描述
以下是Avatar方案部署相关的简单介绍。
1.首先关于Avatar方案对于Hadoop的备份是对Dfs的的单点备份,并不包括Mapred,因为Hadoop本身就不存在处理jobtracker单点故障的机制。
2.AvatarNode继承自Namenode,而并非对Namenode的修改,AvatarDataNode同样亦如此。故Avatar的启动机制是独立于Hadoop本身的启动机制。
3.在Avatar方案中,SecondaryNamenode的职责已包括在Standby节点中,故不需要再独立启动一个SecondaryNamenode。
4.AvatarNode必须有NFS的支持,用以实现两个节点间事务日志(editlog)的共享。
5.FB提供的Avatar源码中暂时并不能实现Primary和Standby之间的自动切换,可以借助于Zookeeper的lease机制来实现自动切换。
6.Primary和Standby之间的切换只包括从Standby切换到Primary,并不支持从Primary状态切换到Standby状态。
7.AvatarDataNode并不使用VIP和AvatarNode通信,而是直接与Primary及Standby通信,故需要使用VIP漂移方案来屏蔽两个节点间切换过程中的IP变换问题。有关与Zookeeper的整合,官方称将在之后的版本发布。
关于AvatarNode更详细的介绍,请参考http://blog.csdn.net/rzhzhz/article/details/7235789
部署
一、下载补丁包
         下载地址[HDFS-976
         在主页面下载AvatarNode.20.patch这个补丁包(基于Hadoop-0.20.2),其他补丁包请参考官方介绍。

二、安装补丁包
1.     把下载好的AvatarNode.20.patch补丁包,放到hadoop的根目录下
2.     在hadoop根路径下输入命令patch –p0< AvatarNode.20.patch, 会把相关源码的修改写入java文件中。
3.  因为该补丁包中的Standby类(341行)中有一行代码调用了0.20.2中没有的方法fsImage.saveNamespace(true);把该行注释掉并改成0.20.2中方法fsImage.saveFSImage();
4.     修改org.apache.hadoop.hdfs.server.namenode.FSNamesystem类(4310行),注释掉checkSuperuserPrivilege();因为后面在启动standby的时候会因为ugi=null的错误导致standby无法正常启动。
三、编译
1.  首先修改hadoop根目录下build.xml,注释掉904行和908行。如下:
<targetname="forrest.check" unless="forrest.home"depends="java5.check">
<!--fail message="'forrest.home' is not defined. Please pass-Dforrest.home=&lt;base of Apache Forrest installation&gt; to Ant onthe command-line." /-->
</target>
<target name="java5.check" unless="java5.home">
<!--fail message="'java5.home' is not defined.  Forrest requires Java 5.  Please pass -Djava5.home=&lt;base of Java5 distribution&gt; to Ant on the command-line." /-->
</target>
2.     在根目录下输入ant jar(对于编译package可以参考build.xml的代码)编译hadoop,编译后的jar包会在build目录下(hadoop-0.20.3-dev-core.jar), 拷贝该jar包到hadoop根目录下替换到原有的jar (啰嗦一句,hadoop启动时会先加载build目录下的class,所以当通过替换class修改jar包时请先把build目录暂时移除掉) 。
3.  进入src/contrib/highavailability目录下编译Avatar,编译后的jar包会在build/contrib/highavailability目录下(hadoop-${version}-highavailability.jar),拷贝该jar包到lib目录下。
4.     把2,3步中编译好的jar包分发到集群中所有机器的相应目录。
四、配置
1.     配置hdfs-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>

<!-- Put site-specificproperty overrides in this file. -->

<configuration>
       <property>
               <name>dfs.name.dir</name>
               <value>/home/hadoop/name</value>
               <description>Determineswhere on the local filesystem the                       DFS name node shouldstore the name table. If this is a                 comma-delimited list ofdirectories then the name table is                      replicated in all of thedirectories, for redundancy.
               </description>
       </property>
       <property>
               <name>dfs.data.dir</name>
               <value>/home/hadoop/data</value>
               <description>
               </description>
       </property>
       <property>
               <name>dfs.http.address0</name>
                <value>hadoop1-virtual-machine:50070</value>
       </property>
       <property>
               <name>dfs.http.address1</name>
               <value>hadoop5-virtual-machine:50070</value>
       </property>
       <property>
               <name>dfs.name.dir.shared0</name>
               <value>/home/hadoop/share/shared0</value>
       </property>
       <property>
               <name>dfs.name.dir.shared1</name>
               <value>/home/hadoop/share/shared1</value>
       </property>
       <property>
               <name>dfs.name.edits.dir.shared0</name>
               <value>/home/hadoop/share/shared0</value>
       </property>
       <property>
               <name>dfs.name.edits.dir.shared1</name>
               <value>/home/hadoop/share/shared1</value>
       </property>
       <property>
           <name>dfs.replication</name>
               <value>3</value>
               <description>Defaultblock replication. The actual number of                    replications can bespecified when the file is created. The                     default isused ifreplication is not specified in create                        time.
               </description>
       </property>
</configuration>
参数说明:
1)  dfs.name.dir.shared0
AvatarNode(Primary)元数据存储目录,注意不能和dfs.name.dir目录相同
2)  dfs.name.dir.shared1
AvatarNode(Standby)元数据存储目录,注意不能和dfs.name.dir目录相同
3)  dfs.name.edits.dir.shared0
AvatarNode(Primary) edits文件存储目录,默认与               dfs.name.dir.shared0一致
4)  dfs.name.edits.dir.shared1
AvatarNode(Standby) edits文件存储目录,默认与          dfs.name.dir.shared1一致
5)  dfs.http.address0
AvatarNode(Primary) HTTP的监控地址
6)  dfs.http.address1
AvatarNode(Standby) HTTP的监控地址
7)  dfs.namenode.dn-address0/dfs.namenode.dn-address1
虽然在Avatar源码中有所涉及,但暂时并未用到
2.  配置core-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>

<!-- Put site-specificproperty overrides in this file. -->

<configuration>
       <property>
               <name>hadoop.tmp.dir</name>
               <value>/home/hadoop/tmp</value>
               <description>A base forother temporary directories.
               </description>
       </property>
       <property>
               <name>fs.default.name</name>
               <value>hdfs://hadoop1-virtual-machine:9000</value>
               <description>The name ofthe default file system. Either the                    literal string"local" or a host:port for DFS.
               </description>
       </property>
       <property>
               <name>fs.default.name0</name>
               <value>hdfs://hadoop1-virtual-machine:9000</value>
               <description>The name ofthe default file system. Either the                    literal string"local" or a host:port for DFS.
               </description>
       </property>
       <property>
               <name>fs.default.name1</name>
               <value>hdfs://hadoop5-virtual-machine:9000</value>
               <description>The name ofthe default file system. Either the                    literal string"local" or a host:port for DFS.
               </description>
       </property>
</configuration>
参数说明:
1)  fs.default.name
当前AvatarNode IP地址和端口号,即Primary和Standby的配置为各自的IP地址和端口号。
2)  fs.default.name0
AvatarNode(Primary) IP地址和端口号
3)  fs.default.name1
AvatarNode(Standby)  IP地址和端口号
3.     因为不涉及到mapred,故mapred-site.xml不用作修改,为原有集群配置即可。
4.     分发修改后的配置文件到集群节点并在Primary和Standby节点上建立好配置文件中相应目录。
5.     建立NFS,实现Primary与Standby shared0目录的数据共享。有关NFS的配置请参考http://blog.csdn.net/rzhzhz/article/details/7056732
6.     格式化Primary与Standby,这里可以采用hadoop本身的格式化命令,也可以采用AvatarNode的格式化命令(bin/hadoop org.apache.hadoop.hdfs.AvatarShell -format),但此时shared1目录不能为空,此处有点多余。建议采用hadoop本身的格式化命令在Primary上格式化后,并且把name目录下的文件复制到shared0目录下。然后再在Standby上复制shared0目录下的文件到shared1目录下。
五、启动
1.     由于不涉及jobtracker的单点,在这里我们只启动hdfs相关线程。Primary,Standby两个namenode(此处Standby包括SecondaryNamenode的职责)和3个AvatarDataNode数据节点。
2.     在Primary节点hadoop根目录下启动AvatarNode(Primary)
      bin/hadooporg.apache.hadoop.hdfs.server.namenode.AvatarNode –zero
3.     在Standby节点hadoop根目录下启动AvatarNode(Standby)
      bin/hadooporg.apache.hadoop.hdfs.server.namenode.AvatarNode -one –standby
4.     依次在数据节点hadoop根目录下启动AvatarDataNode
      bin/hadooporg.apache.hadoop.hdfs.server.datanode.AvatarDataNode
5.     其他相关命令
bin/hadoop   org.apache.hadoop.hdfs.server.namenode.AvatarNode,后面可    选参数有
[-standby] | [-sync] | [-zero] | [-one] | [-format] |  [-upgrade]   | [-rollback] | [-finalize] | [-importCheckpoint]

1)  bin/hadoop org.apache.hadoop.hdfs.AvatarShell –showAvatar 查看当前AvatarNode的状态

2)     bin/hadoop org.apache.hadoop.hdfs.AvatarShell  -setAvatar primary 把当前Standby节点升级Primary节点

3)  bin/hadoop org.apache.hadoop.hdfs.AvatarShell -setAvatar standby

集群测试
1.     访问集群的web页
(Primary)http://hadoop1-virtual-machine:50070
(Standby)http://hadoop5-virtual-machine:50070
可见所有的AvatarDataNode都已注册到两个namenode,Primary处于正常状态,而Standby处于Safemode状态,只可读不可写。可通过AvatarShell命令查看当前AvatarNode的状态(Primary或Standby)。
2.     存储相关数据到集群,集群正常工作。
3.     Kill掉Primary节点的AvatartNode线程,在Standby把当前升级为Prirmary,数据并未丢失,集群正常工作(此时web端不能正常访问文件系统,通过shell命令可查看集群数据)。但由于Avatar有转换限制,只能由Standby转换成Primary,故一次故障后,由Standby上升为Primary的节点并不能重新降级为Standby,所以不能实现像Master/Slave那种自由切换。


加微信w3aboutyun,可拉入技术爱好者群

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条