利用hadoop-2.5.0-cdh5.3.6版本,搭建完全分布式HA详细记录(怕忘)
我就按照自己的思路写,可能步骤不一定正确1、在搭建完全 分布式集群时,首先要保证我们的三台机子的时间同步,所以我们需要同步一台时间服务器,我的三台虚拟机分别为如下hostname-->make.hadoop.com 第一台-->make.hadoop2.com 第二台-->make.hadoop3.com 第三台1、首先我
我就按照自己的思路写,可能步骤不一定正确
1、在搭建完全 分布式集群时,首先要保证我们的三台机子的时间同步,所以我们需要同步一台时间服务器,我的三台虚拟机分别为如下hostname
-->make.hadoop.com 第一台
-->make.hadoop2.com 第二台
-->make.hadoop3.com 第三台
1、首先我们把第一台机器当做我们的同步时间的服务器,按步骤操作,即Hadoop2跟Hadoop3同步hadoop机器上的时间
打开我们第一台机器的ntpd时间服务,其他的两台机器不用开
1.1-->sudo service ntpd status
1.2-->sudo service ntpd start
1.3-->开机自动启动设置(在第一台设置,其他不要设置)
-->sudo chkconfig ntpd on
1.4修改配置文件 vi /etc/ntp.conf,其中只有三处需要做修改,如下图

箭头1处,将前面的注释去掉,并把网段修改为自己的网段,2处,因为这里为内网环境不用开启服务,这里的三个server直接 注释掉,3处,开启本地服务,直接将前面的#号去掉,到此处 第一台机器的配置就写好了,我们重启服务,sudo service ntpd restart,
1.5我们试着去其他两台机器,同步一下时间,并设置自动同步的任务 ,
-->在其他两台机器上执行同步命令 sudo /usr/sbin/ntpdate make.hadoop.com 误差基本能保持在1s之内
-->设置定时任务crontab -e 进入任务编辑界面,这里直接将我的贴出来 0-59/10 * * * * /usr/sbin/ntpdate make.hadoop.com 这里不知道脚本的位置 ,可以用which查看一下位置,到这三台机器的时间同步就设置好了。
2、下面的图为我的服务器节点的集群规划,我的集群是按照这个节点进行搭建的

2.1、HA的完全搭建,我们首先要安装Zookeeper,下载Zookeeper的tar.gz压缩包,并对其解压,解压后我们来看看它的目录结构,并对配置文件做一定的修改。(单节点)

我们先对conf下的zooxxx.cfg重命名为coo.cfg,对coo.cfg文件进行修改配置(此处为单节点的配置,为了初始化datadir)

dataDir=/opt/module/distribute/HA/zookeeper-3.4.5-cdh5.3.6/data/zkdata这个是zk的本地数据存放目录,自己随意指定,能记住就是OK的。然后我们启动zk节点,因为我已经配置了分布式,这里就不演示了。
-->bin/zkServer.sh start 节点的名称为 QuorumPeerMain 现在可以启动zk的客户端看一下他的目录,可以看到只有一个文件,因为这个时候我们hadoop节点还没有配置上去,不过我们在启动的时候已经生成了我们刚刚自己配置好的路径。
2.2、接下来我们配置分布式的zookeeper,还是对coo.cfg文件进行修改,只不过这里会添加一点东西

2181表示客户端端口号、2888表示ZK节点内部通信端口号、3888表示ZK内部选举端口号,这里的server.1、server.2、server.3对应的是每台机器,现在我们需要在刚刚配置的路径下面,新建一个名叫myid的文件,,里面的内容就是对应机器的server后面的id,我这里就是1、2、3,你们也可以是a、b、c。现在我们将配置好的zookeeper分发到其他机器
-->scp -r zookeeper-3.4.5-cdh5.3.6/ make.hadoop2.com:/opt/moudle/distribute/HA
-->scp -r zookeeper-3.4.5-cdh5.3.6/ make.hadoop3.com:/opt/moudle/distribute/HA
分发完成之后,将对应的myid文件改成自己机器对应 的id.
2.3、启动所有的zk节点,每台机器都要启动,三台全部启动后,查看每台机器的状态
-->bin/zkServer.sh start
-->bin/zkServer.sh status 这里应该有一个leader,两个follower,如图,我的第二台机器就是leader,关于zk的内部选举机制,可以自己去了解,我也要去了解的,到这里zookeeper的部分就配置完了



3、对hadoop的文件配置,因为对hadoop配置文件的修改,我们在伪分布式的搭建下就已经说过,这里就简单说一下
3.1、对hadoop-env,mapred-env,yarn-env.sh文件,指定你自己的JAVA_HOME
-->修改slaves,添加你自己集群里的所有机器的hostname
make.hadoop.com
make.hadoop2.com
make.hadoop3.com
接下来把四个配置文件的内容贴出来
core-cite.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
<!--这里为集群的通用入口-->
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/distribute/HA/hadoop-2.5.0-cdh5.3.6/data/tmp</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>make</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>make.hadoop.com:2181,make.hadoop2.com:2181,make.hadoop3.com:2181</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址,nn1所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>make.hadoop.com:8020</value>
</property>
<!-- nn1的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>make.hadoop.com:50070</value>
</property>
<!-- nn2的RPC通信地址,nn2所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>make.hadoop2.com:8020</value>
</property>
<!-- nn2的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>make.hadoop2.com:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://make.hadoop.com:8485;make.hadoop2.com:8485;make.hadoop3.com:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/distribute/HA/hadoop-2.5.0-cdh5.3.6/data/journal</value>
</property>
<!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value> ----这个参数的值可以有多种,你也可以换成shell(/bin/true)试试,也是可以的,这个脚本do nothing 返回0
</property>
<!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/make/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 这个是开启自动故障转移,如果你没有自动故障转移,这个可以先不配,在切换时必须使用手动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration> mapered-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>make.hadoop.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>make.hadoop.com:19888</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>make.hadoop3.com</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>106800</value>
</property>
</configuration>
到这里我们的配置文件就都配置好了,然后一样的把这个分发出去,然后把 share/doc的文件删掉,因为太大,占资源
-->scp -r hadoop-2.5.0-cdh5.3.6/ make.hadoop2.com:/opt/moudle/distribute/HA
-->scp -r hadoop-2.5.0-cdh5.3.6/ make.hadoop3.com:/opt/moudle/distribute/HA
3.2、这里我们已经启动了zookeeper服务,然后启动三台journalnode(这个是用来同步两台namenode的数据的)
-->sbin/hadoop-daemon.sh start journalnode
3.3、操作namenode(只要格式化一台,另一台进行同步,不能两台都格式化,那样是错的!)
-->格式化第一台:bin/hdfs namenode -format
-->启动刚格式化好的namenode:sbin/hadoop-deamon.sh start namenode
-->在第二台机器上同步namenode的数据:bin/hdfs namenode -bootstrapStandby -->启动第二台的namenode:sbin/hadoop-deamon.sh start namenode
3.4、这里其实可以直接打开你的hdfs的web 端看一看,应该有一台是active,一台standby,如图


3.5、其实到这里,我们的namenode的一个HA就做完了,可以进行故障自动转移,可以做一个测试,把目前处于active的机器的namenode进程杀掉,那么另一个standby的机器会立刻切换过来active,负责对外提供服务,到此你的HA自动故障转移已经完成了。
4、留一个思考,如果我们的namenode、zk这台机器,发生一种很少见的情况,比如直接关机,直接断网(网卡坏掉),那么我们的自动故障转移,还能不能发挥作用,这个答案我们后面来补充(其实也是老师给我们讲的啦,买个关子,顺便自己也思考一下),我们另一个namenode能不能切换过来呢?
更多推荐


所有评论(0)