天天看点

Hadoop-HA高可用搭建

这里就直接搭建了,原理请参照上一篇。

1

1、三台虚拟机(最少)。克隆三台,请见:克隆虚拟机

2、hosts文件要配置好,三台都可以相互通过主机名ping通,三台虚拟机都要配置!如下:

[songjian@songjian-02 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6


192.168.6.129 songjian-01.com
192.168.6.130 songjian-02.com
192.168.6.131 songjian-03.com
           

复制

3、关闭防火墙!

[songjian@songjian-02 ~]$server iptables stop

[songjian@songjian-02 ~]$chkconfig iptables off
           

复制

4、免密钥登录,详情请看前面SSH免密钥:配置SSH免密登入

5、同步时间,不然mapreduce会有问题。

2

1、zookeeper。配置很简单,就两步。

首先打开conf下的zoo.cfg文件,如图:

Hadoop-HA高可用搭建

然后,在dataDir目录下创建一个文本myid,写好对应的server和机器号,这里注意要一一对应,顺序不能错!

Hadoop-HA高可用搭建

2、接着就可以配置集群了。

首先在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径(有可能这条属性被注释掉了,记得解开。

查看java_home:

[songjian@songjian-02 ~]$ echo $JAVA_HOME
/opt/modules/jdk1.8.0_151
           

复制

接下来是配置文件。

core-site.xml

<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/App/hadoop-2.5.0/data/tmp</value>
</property>
<property>
    <name>hadoop.http.staticuser.user</name>
    <value>beifeng</value>
</property>
<property>
    <name>ha.zookeeper.quorum</name>
    <value>bigdata-01:2181,bigdata-02:2181,bigdata-03: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>bigdata-01:8020</value>
</property>
<!-- nn1的http通信地址,外部访问地址 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>bigdata-01:50070</value>
</property>
<!-- nn2的RPC通信地址,nn2所在地址 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>bigdata-02:8020</value>
</property>
<!-- nn2的http通信地址,外部访问地址 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>bigdata-02:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://bigdata-01:8485;bigdata-02:8485;bigdata-03:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/modules/App/hadoop-2.5.0/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/beifeng/.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>
           

复制

mapred-site.xml

<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
</property>
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>bigdata-01:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>bigdata-01: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>bigdata-03</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>
           

复制

然后在slave里面写下自己的datanode的节点名字。

[songjian@songjian-02 ~]$ hadoop-2.5.0-cdh5.3.6]$ cat etc/hadoop/slaves 
songjian-01.com
songjian-02.com
songjian-03.com
           

复制

只要配置一台,配置完了,把配置分发给其他机器。提醒下,你发送前可以把hadoop中的share/doc这个目录下的东西删掉,因为是些帮助文档,太大了。代码如下。

[songjian@songjian-02 ~]$ rm -rf share/doc

[songjian@songjian-02 ~]$scp -r hadoop2.5.0/ bigdata-02:/opt/modules/

[songjian@songjian-02 ~]$scp -r hadoop2.5.0/ bigdata-03:/opt/modules/
           

复制

3

1、启动zookeeper。

[songjian@songjian-02 ~]$ bin/zkServer.sh start
           

复制

2、启动三台journalnode。

[songjian@songjian-02 ~]$ sbin/hadoop-deamon.sh start journalnode
           

复制

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
           

复制

4、查看web(这里应该两台都是stanby)

http://192.168.6.129:50070/dfshealth.html#tab-overview
http://192.168.6.130:50070/dfshealth.html#tab-overview
           

复制

打开后可以看看如下图:

Hadoop-HA高可用搭建
Hadoop-HA高可用搭建

5、然后手动切换namenode状态

$ bin/hdfs haadmin -transitionToActive nn1 ##切换成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切换成standby
           

复制

手动切换namenode状态(也可以在第一台切换第二台为active,毕竟一个集群)。

以上,手动故障转移配置完成!

4

这时候就应该配置自动故障转移了。

首先你要把你的集群完整的关闭,一定要全关了!

自动故障转移的配置其实要在zookeeper上生成一个节点 hadoop-ha,这个是自动生成的,通过下面的命令生成:

bin/hdfs zkfc -formatZK
           

复制

然后你登录zookeeper的客户端,就是bin/zkCli.sh里面通过 “ls /” 可以看到多了个节点。如图:

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, yarn-leader-election, hadoop-ha, rmstore]
[zk: localhost:2181(CONNECTED) 1] 
           

复制

你可以直接通过sbin/start-dfs.sh去启动hdfs,默认会启动zkfc的,其实就是一个自动故障转移的进程,会在你的namenode存在的两台机器上有这么一个节点。

等到完全启动了之后,就可以kill掉active的namenode,你就会发现stanby的机器变成active,然后再去启动那台被你kill掉的namenode(启动起来是stanby的状态),然后你再去kill掉active,stanby的机器又会变成active,到此你的HA自动故障转移已经完成了。

5

我们再来看下resourcemanager的HA。

配置文件。在yarn-site.xml文件中添加。并且将下图那个配置删除。

Hadoop-HA高可用搭建

添加:

<!--启用resourcemanager ha-->
<!--是否开启RM ha,默认是开启的-->
<property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
</property>
<!--声明两台resourcemanager的地址-->
<property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>rmcluster</value>
</property>
<property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>rm1,rm2</value>
</property>
<property>
   <name>yarn.resourcemanager.hostname.rm1</name>
   <value>bigdata-02</value>
</property>
<property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>bigdata-03</value>
</property>

<!--指定zookeeper集群的地址--> 
<property>
   <name>yarn.resourcemanager.zk-address</name>
<value>bigdata-01:2181,bigdata-02:2181,bigdata-03:2181</value>
</property>
<!--启用自动恢复,当任务进行一半,rm坏掉,就要启动自动恢复,默认是false--> 
<property>
   <name>yarn.resourcemanager.recovery.enabled</name>
   <value>true</value>
</property>

<!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面。--> 
<property>
   <name>yarn.resourcemanager.store.class</name>
   <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
           

复制

然后把这个修改好的配置文件发到其他主机上,这里注意路径不要写错了。