赞
踩
写在文前,可能我说的有不对的地方,希望各位老鸟批评指正,本着虚心接受的态度分享这篇文章!
关于hadoop-ha大家配置的时候可能会遇到这样或者那样的报错,实在很让人头疼,因为操作有点多,也很多人不知道到底要执行的步骤顺序,今天给大家分享一下自己的愚见,我的hadoop是2.5.0的版本。
我们来看看,HA的原理图:
如图:
这里会有两种状态
1、故障了要手动切换
2、自动故障转移
但是在下面的配置中,是完整的配置(就是包括自动故障转移的配置,但是其实操作的步骤并没有一开始就配置好自动故障转移,所以配置文件中我会标出,然后大家有几个属性先别配置)
三台虚拟机(最少)
hosts文件要配置好,三台都可以相互通过主机名ping通(以下是我的,三台都要一样)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.163.103 bigdata-03
192.168.163.101 bigdata-01
192.168.163.102 bigdata-02
防火墙都关了
server iptables stop(关闭防火墙)
chkconfig iptables off(开机不自启动)
免密钥登录(这个一定要,不然你启动的时候,老是要让你输入各种密码)
其实就两条命令,但是注意,三台机器都要用相同的用户去执行,不然会出问题!!!出问题了就去把.ssh这个目录下的文件删除,重新生成
在三台机器上都执行ssh-keygen -t rsa 然后三次回车,运行结束会在~/.ssh下生成两个新文件:id_rsa.pub和id_rsa就是公钥和私钥
然后也是在三台机器上都执行:ssh-copy-id bigdata-01;ssh-copy-id bigdata-02;ssh-copy-id bigdata-03(你的公钥和私钥要发给别人,也要发给自己,切记!!)
同步时间
这个方法挺多的,大概思路就是第一台机器去访问外网同步时间,然后另外几台通过脚本去同步第一台(时间会有几秒甚至几分钟误差,这个没关系),但是其实时间不一样,我发现也没什么影响,所以。。。这里就不给出具体的方法了,大家自行百度脑补下。
最首先需要依赖zookeeper把,所以zookeeper配置如下(我有三台zookeeper):
dataDir=/opt/modules/App/zookeeper-3.4.5/zkData
server.1=bigdata-01:2888:3888
server.2=bigdata-02:2888:3888
server.3=bigdata-03:2888:3888
然后在dataDir目录下(其实就是我这里写的zkData下面)写上一个文件叫myid,里面的值就是第一台机器写1,第二台写2,第三台写3,就可以了,要跟你的server.1这里的1,对应上就好,然后开启zookeeper,看到是一台leader,两台follower,这里zookeeper开启要给他点时间,因为他要三台相互感知到,所以别急。。一般5分钟内就没问题了,如果5分钟过了,还没好的话,可以去看日志了,因为应该是报错了。
现在可以开始配置我们的hadoop集群了,第一步在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径(有可能这条属性被注释掉了,记得解开,把前面的#去掉就可以了)export JAVA_HOME=/opt/modules/jdk1.7.0_67
然后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>
- <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>
- <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>
其实就跟上面一样,只是我在第三台机器上也启动一个resourcemanager的备用节点
修改yarn-site.xml文件
- <!--启用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>
后话:
其实正常情况下,主节点是不会直接坏掉的(除非机器坏掉,那我无话可说),往往是比如某个进程占用cpu或者内存极大,有可能被linux直接kill掉
这种时候,ha并没有那么灵敏,就是说,不一定能马上切换过去,可能有几分钟延迟,所以我们应该做的是避免一些主节点挂掉的情况。
所以可以使用spark或者storm做预警系统,当hadoop的日志文件里面出现warning的时候,能够实时报警(比如向维护人员发短信,发邮件之类的功能)
在事故发生之前,处理可能发生的故障!
再次声明,如果本文有什么说的不对之处,希望大神们可以指出!!谢谢各位~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。