Hadoop完全分布式 -- HA配置
以3台机器配置 hadoop HA 为例hadoop CDH版本:hadoop-2.6.0-cdh5.15.0.tar.gzzookeeper CDH版本:zookeeper-3.4.5-cdh5.15.0.tar.gz【前提工作】一、配置好3台虚拟机 hosts$ vi /etc/hosts127.0.0.1 localhost localhost.localdomain localhost
·
以3台机器配置 hadoop HA 为例
hadoop CDH版本:hadoop-2.6.0-cdh5.15.0.tar.gz
zookeeper CDH版本:zookeeper-3.4.5-cdh5.15.0.tar.gz
一、配置好3台虚拟机 hosts
$ vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.211.212 bigdata01
192.168.211.213 bigdata02
192.168.211.214 bigdata03
二、关闭防火墙(root用户下)
# service iptables status(查看防火墙状态)
iptables: Firewall is not running. (防火墙已关闭)
# service iptables stop(关闭防火墙)
#chkconfig iptables off(开机不自启动)
三、配置所有节点的ssh免密码登录设置
ssh-keygen -t rsa
然后发送给每一台,也要发送自己
ssh-copy-id bigdata01
ssh-copy-id bigdata02
ssh-copy-id bigdata03
或者 ssh-copy-id bigdata01;ssh-copy-id bigdata02;ssh-copy-id bigdata03
四、3台机器时间同步
1、模拟内网环境
在集群中找一台服务器作为:时间服务器
bigdata01 时间服务器
bigdata02和bigdata03同步01这台机器
2、查看Linux中的ntpd时间服务(这里只要开启第一台机器的ntpd服务,其他的不用开)
$ sudo service ntpd status
$ sudo service ntpd start
3、开机设置(在第一台设置,其他不要设置)
$ sudo chkconfig ntpd on
4、修改系统文件
# vi /etc/ntp.conf
【第一处】修改为自己的网段,注意将前面的#去掉,生效
# Hosts on local network are less restricted.
restrict 192.168.163.0 mask 255.255.255.0 nomodify notrap
【第二处】由于是内网环境不用添加服务,前面加上注释
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
【第三处】开启本地服务,注意将前面的#去掉,生效
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
保存文件(:wq)
5、修改完配置文件,建议重启ntpd服务,重新读取配置
$ sudo service ntpd restart
6、查看时间服务相关的命令
rpm -qa | grep ntp
ntpdate-4.2.4p8-3.el6.centos.x86_64 同步
ntp-4.2.4p8-3.el6.centos.x86_64 将某台选为时间服务器
7、可以先执行同步操作测试下
sudo /usr/sbin/ntpdate bigdata-01
误差在两三分钟内,是可以接受的
8、编写crontab定时任务,在需要同步的节点上编写(第二台和第三台)
$ sudo crobtab -e
#同步 bigdata01 时间
0-59/10 * * * * /usr/sbin/ntpdate bigdata-01
9、报错整理:
1)报错:11 Sep 09:04:55 ntpdate[2022]: the NTP socket is in use, exiting
原因:这个是你在使用2或者3的机器同步1的时候,2和3的机器的ntpd服务没关,关了就好了,
解决:service ntpd stop(先关闭服务)chkconfig ntpd off
2)报错:11 Sep 09:05:46 ntpdate[2039]: no server suitable for synchronization found
原因:1、理论上同步是要时间的,有可能它还在同步,然后你执行了这句话,所以会报异常
2、也有可能你的防火墙和子安全系统把他的端口挡住了,所以他同步不了
解决:第一种情况,只能等,一般5分钟左右
第二种情况,把防火墙和子安全系统关了(或者开放123端口)
或者可以试试 ntpdate -u bigdata-01 -u的意思是避过防火墙
vi /etc/selinux 改成disable service iptables off
博客:http://blog.csdn.net/qq_19175749/article/details/50792048
3)报错:这个就是我上课时候出的问题,明明2,3台同步成功了,时间也是正确的(跟现实的时间是一样的)
但是1的机器实际上本地时间是错的,那就很恶心了
原因:应该是我之前在那台机器上操作了什么不可言喻的东西!
解决:先查看下你的时区(+0800是正确的,就是东八区) date -R
rm -rf /etc/localtime ---如果时区不是+0800
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
这样子你的时间应该就是正常的了
【Hadoop集群模式环境部署 HA】
一、服务节点的部署规划
HA 有两种状态:
1、故障,需要手动切换
2、故障,自动故障转移
ps:在下面的配置中,是完整的配置(就是包括自动故障转移的配置,但是其实操作的步骤并没有一开始就配置好自动故障转移,所以配置文件中我会标出,然后有几个属性先别配置)
二、ZooKeeper 配置--分布式模式
1、把 zookeeper-3.4.5-cdh5.15.0.tar.gz 解压到一个目录中
$ tar -zxvf zookeeper-3.4.5-cdh5.15.0.tar.gz -C /opt/modules/
2、修改conf/zoo_sample.cfg 重命名 zoo.cfg文件
3、指定ZK本地存储的数据存放目录
dataDir=/opt/modules/distribute/zookeeper-3.4.5-cdh5.15.0/data/zkData
4、指定所有ZK的节点以及端口号(内部相互通信端口号:选举端口号)
server.1=bigdata01:2888:3888
server.2=bigdata02:2888:3888
server.3=bigdata03:2888:3888
ps:
2181表示客户端端口号
2888表示ZK节点内部通信端口号
3888表示ZK内部选举端口号
5、在dataDir=/opt/modules/distribute/zookeeper-3.4.5-cdh5.15.0/data/zkData路径下创建文件
创建名为myid的文件,注意一定要这个文件名
写对应的编号,比如:1
6、将配置分发到其他节点上
scp -r zookeeper-3.4.5-cdh5.15.0/ bigdata02:/opt/modules/distribute/
scp -r zookeeper-3.4.5-cdh5.15.0/ bigdata03:/opt/modules/distribute/
7、分发完成之后需要更改其他节点上的myid对应编号
里面的值就是第一台机器写1,第二台写2,第三台写3,就可以了,要跟你的server.1这里的1
8、启动所有ZK的节点
bin/zkServer.sh start
9、查看状态
bin/zkServer.sh status
当看到 2个: follower 和 1个: leader 说明配置成功
三、配置 Hadoop 集群
1、在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径(有可能这条属性被注释掉了,记得解开,把前面的#去掉就可以了)
export JAVA_HOME=/opt/modules/jdk1.8.0_171
2、配置 /opt/modules/distribute/hadoop-2.6.0-cdh5.15.0/etc/hadoop 下的5个文件
core-site.xml
hdfs-site.xml
mapred-site.xml(重命名:mapred-site.xml.template)
yarn-site.xml
slaves
-------------------------------------------------------------
1)、core-site.xml
-------------------------------------------------------------
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/distribute/hadoop-2.6.0-cdh5.15.0/data/tmp</value>
</property>
<!-- Resource Manager UI的默认用户dr.who权限不正确 ,这里写上你的机器用户名-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>用户名</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
</property>
</configuration>
-------------------------------------------------------------
2)、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>bigdata01:8020</value>
</property>
<!-- nn1的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>bigdata01:50070</value>
</property>
<!-- nn2的RPC通信地址,nn2所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>bigdata02:8020</value>
</property>
<!-- nn2的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>bigdata02:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/distribute/hadoop-2.6.0-cdh5.15.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>
<!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法,这个参数的值可以有多种,你也可以换成shell(/bin/true)试试,也是可以的,这个脚本do nothing 返回0 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</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>
-------------------------------------------------------------
3)、mapred-site.xml
-------------------------------------------------------------
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MapReduce JobHistory Server地址 -->
<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>
-------------------------------------------------------------
4)、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>
-------------------------------------------------------------
5)、slaves
-------------------------------------------------------------
bigdata-01
bigdata-02
bigdata-03
-------------------------------------------------------------
3、分发文件
注:只要配置一台,配置完了,把配置分发给其他机器,使用如下命令(scp命令):
提醒下,你发送前可以把hadoop中的share/doc这个目录下的东西删掉,因为是些帮助文档,太大了,影响传输速度所以。。。
$ rm -rf share/doc
$ scp -r hadoop-2.6.0-cdh5.15.0/ bigdata02:/opt/modules/distribute/
$ scp -r hadoop-2.6.0-cdh5.15.0/ bigdata03:/opt/modules/distribute/
四、启动 Hadoop 集群
【启动过程】
1、首先zookeeper已经启动好了吧(三台都要启动)
开启命令 bin/zkServer.sh start
2、启动三台journalnode(这个是用来同步两台namenode的数据的)
$ sbin/hadoop-deamon.sh start journalnode
3、操作namenode(只要格式化一台,另一台同步,两台都格式化,你就做错了!!)
1)、格式化第一台:
$ bin/hdfs namenode -format
2)、启动刚格式化好的namenode:
$ sbin/hadoop-deamon.sh start namenode
3)、在第二台机器上同步namenode的数据:
$ bin/hdfs namenode -bootstrapStandby
4)、启动第二台的namenode:
$ sbin/hadoop-deamon.sh start namenode
4、查看web(这里应该两台都是stanby)
注意:如果用主机名登陆,必须在 C:\Windows\System32\drivers\etc 下的 hosts配置映射
http://bigdata01:50070
http://bigdata02:50070
5、然后手动切换namenode状态
手动切换namenode状态(也可以在第一台切换第二台为active,毕竟一个集群)
$ bin/hdfs haadmin -transitionToActive nn1 ##切换成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切换成standby
注: 如果不让你切换的时候,bin/hdfs haadmin -transitionToActive nn2 --forceactive
也可以直接通过命令行查看namenode状态, bin/hdfs haadmin -getServiceState nn1
--------------------------以上手动故障转移已经配置成功了-----------------------------------------
6、配置自动故障转移
1)、首先你要把你的hadoop集群完整的关闭,一定要全关了!!
zookeeper 的(QuorumPeerMain)不用关闭
2)、把 hadoop文件下 hdfs-site.xml 之前注释的打开(3台都打开)
3)、自动故障转移的配置其实要在zookeeper上生成一个节点 hadoop-ha,这个是自动生成的,通过下面的命令生成:
$ bin/hdfs zkfc -formatZK
3)、你登录zookeeper的客户端,就是bin/zkCli.sh里面通过 “ls /” 可以看到多了个节点
这时候讲道理集群应该是没问题了!
你可以直接通过sbin/start-dfs.sh去启动hdfs,默认会启动zkfc的,其实就是一个自动故障转移的进程,会在你的namenode存在的两台机器上有这么一个节点。
其中:历史服务(obHistoryServer)和yarn 的ResourceManager 在那台机器上手动开启
$ sbin/yarn-daemon.sh start resourcemanager
$ sbin/mr-jobhistory-daemon.sh start historyserver
三台机器:jps(说明配置没问题了)
等到完全启动了之后,就可以kill掉active的namenode,你就会发现stanby的机器变成active,然后再去启动那台被你kill掉的namenode(启动起来是stanby的状态),然后你再去kill掉active,stanby的机器又会变成active,到此你的HA自动故障转移已经完成了。
这是官网的帮助文档:http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
后话:其实也可以做resourcemanager的HA,但是其实你能搭出namenode的HA,对于你来说,resourcemanager的HA就很简单了。
===========================以上是自动故障转移配置完成============================
【配置 resourcemanager的HA】
官网文档:http://hadoop.apache.org/docs/r2.5.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
一、集群规划
其实就跟上面一样,只是我在第三台机器上也启动一个resourcemanager的备用节点
二、配置文件
只修改yarn-site.xml文件
-------------------------------------------------------------
yarn-site.xml
-------------------------------------------------------------
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用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>bigdata02</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>bigdata03</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>bigdata01:2181,bigdata02:2181,bigdata03: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>
</configuration>
-------------------------------------------------------------
发送yarn-site.xml 到其他机器
scp etc/hadoop/yarn-site.xml bigdata02:/opt/modules/distribute/hadoop-2.6.0-cdh5.15.0/etc/hadoop/
scp etc/hadoop/yarn-site.xml bigdata03:/opt/modules/distribute/hadoop-2.6.0-cdh5.15.0/etc/hadoop/
三、启动 ResourceManager
在bigdata02上:
sbin/start-yarn.sh
在bigdata03上:
sbin/yarn-daemon.sh start resourcemanager
三台机器:jps(说明配置没问题了)
观察web 8088端口
当bigdata02的ResourceManager是Active状态的时候,访问bigdata03的ResourceManager会自动跳转到PC02的web页面
测试HA的可用性
查看的状态:
bin/yarn rmadmin -getServiceState rm1 ##查看rm1的状态
bin/yarn rmadmin -getServiceState rm2 ##查看rm2的状态
然后你可以提交一个job到yarn上面,当job执行一半(比如map执行了100%),然后kill -9 掉active的rm
这时候如果job还能够正常执行完,结果也是正确的,证明你rm自动切换成功了,并且不影响你的job运行!!!
结束。。。。。。。。
后话:
其实正常情况下,主节点是不会直接坏掉的(除非机器坏掉,那我无话可说),往往是比如某个进程占用cpu或者内存极大,有可能被linux直接kill掉
这种时候,ha并没有那么灵敏,就是说,不一定能马上切换过去,可能有几分钟延迟,所以我们应该做的是避免一些主节点挂掉的情况。
所以可以使用spark或者storm做预警系统,当hadoop的日志文件里面出现warning的时候,能够实时报警(比如向维护人员发短信,发邮件之类的功能)
在事故发生之前,处理可能发生的故障!
更多推荐
已为社区贡献1条内容
所有评论(0)