这里就直接搭建了,原理请参照上一篇。
1
1、三台虚拟机(最少)。克隆三台,请见:克隆虚拟机
2、hosts文件要配置好,三台都可以相互通过主机名ping通,三台虚拟机都要配置!如下:
代码语言:javascript复制[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、关闭防火墙!
代码语言:javascript复制[songjian@songjian-02 ~]$server iptables stop
[songjian@songjian-02 ~]$chkconfig iptables off
4、免密钥登录,详情请看前面SSH免密钥:配置SSH免密登入
5、同步时间,不然mapreduce会有问题。
2
1、zookeeper。配置很简单,就两步。
首先打开conf下的zoo.cfg文件,如图:
然后,在dataDir目录下创建一个文本myid,写好对应的server和机器号,这里注意要一一对应,顺序不能错!
2、接着就可以配置集群了。
首先在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径(有可能这条属性被注释掉了,记得解开。
查看java_home:
代码语言:javascript复制[songjian@songjian-02 ~]$ echo $JAVA_HOME
/opt/modules/jdk1.8.0_151
接下来是配置文件。
core-site.xml
代码语言:javascript复制<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
代码语言:javascript复制<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
代码语言:javascript复制<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
代码语言:javascript复制<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的节点名字。
代码语言:javascript复制[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这个目录下的东西删掉,因为是些帮助文档,太大了。代码如下。
代码语言:javascript复制[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。
代码语言:javascript复制[songjian@songjian-02 ~]$ bin/zkServer.sh start
2、启动三台journalnode。
代码语言:javascript复制[songjian@songjian-02 ~]$ sbin/hadoop-deamon.sh start journalnode
3、操作namenode。注意:只要格式化一台,另一台同步,两台都格式化,你就做错了!
代码语言:javascript复制格式化第一台: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)
代码语言:javascript复制http://192.168.6.129:50070/dfshealth.html#tab-overview
http://192.168.6.130:50070/dfshealth.html#tab-overview
打开后可以看看如下图:
5、然后手动切换namenode状态
代码语言:javascript复制$ bin/hdfs haadmin -transitionToActive nn1 ##切换成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切换成standby
手动切换namenode状态(也可以在第一台切换第二台为active,毕竟一个集群)。
以上,手动故障转移配置完成!
4
这时候就应该配置自动故障转移了。
首先你要把你的集群完整的关闭,一定要全关了!
自动故障转移的配置其实要在zookeeper上生成一个节点 hadoop-ha,这个是自动生成的,通过下面的命令生成:
代码语言:javascript复制bin/hdfs zkfc -formatZK
然后你登录zookeeper的客户端,就是bin/zkCli.sh里面通过 “ls /” 可以看到多了个节点。如图:
代码语言:javascript复制[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文件中添加。并且将下图那个配置删除。
添加:
代码语言:javascript复制<!--启用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>
然后把这个修改好的配置文件发到其他主机上,这里注意路径不要写错了。