我就按照自己的思路写,可能步骤不一定正确

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能不能切换过来呢?






Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐