hadoop HA高可用搭建
hadoop HA高可用搭建
接上回hadoop概述二,我们了解到了hdfs有弊端,需要搭建HA,通过官网查看有2中方式进行高可用。一种基于QJM方式的,另一种基于联邦的,
我们今天先来使用QJM方案来做hadoop的高可用,使用4台服务器来做集群,还会用到zookeeper来做主备切换的调控
先说一下我们的IP分配和服务的规划信息
-
节点和IP
节点 IP ha01 192.168.56.20 ha02 192.168.56.21 ha03 192.168.56.22 ha04 192.168.56.23 -
服务规划
节点 namenode namenode datanode zookeeper zkFC Journalnode ha01 * * * ha02 * * * * * ha03 * * * ha04 * *
修改4台服务器的/etc/hosts文件,追加IP和节点信息,HA集群需要用到ssh免密登录,这里免密登录有2中场景
- ha01控制执行hadoop脚本会用到免密登录到其他机器
- 两个namenode进行主备切换时需要登录到对方机器,杀死对方的相应进程,然后提升自己节点的为激活状态
vi /etc/hosts
192.168.56.20 ha01
192.168.56.21 ha02
192.168.56.22 ha03
192.168.56.23 ha04
保存退出后执行/etc/init.d/network restart ,生效hosts文件内容
安装zk
以前已写了安装zk教程,请查看之前的zookeeper集群安装的教程,本次需要安装的是ha02,ha03,ha04,切换成对应的机器信息即可
免密登录
我们使用的hadoop用户,所以我们就在hadoop用户的家目录下进行创建免密登录的信息,其他3台相同操作
[hadoop@ha01 ~]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[hadoop@ha01 ~]$ ssh-copy-id ha01 ##复制公钥信息到authorized_keys中
配置hadoop信息
- hadoop.env.sh
cd /bigdata/install/hadoop-3.1.4/etc/hadoop/
vi hadoop.env.sh
找到JAVA_HOME和HADOOP_HOME,对该配置项进行编辑,并去掉注释符
JAVA_HOME=/bigdata/install/jdk1.8.0_141
HADOOP_HOME=/bigdata/install/hadoop-3.1.4
- core-site.xml
vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/bigdata/install/hadoop-3.1.4/hadoopDatas/tempDatas</value>
</property>
<!-- zk 集群信息 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>ha02:2181,ha03:2181,ha04:2181</value>
</property>
<!-- 缓冲区大小,实际工作中根据服务器性能动态调整;默认值4096 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>
- hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>ha01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>ha02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>ha01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>ha02:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ha01:8485;ha02:8485;ha03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/bigdata/install/hadoop-3.1.4/hadoopDatas/journal</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
</configuration>
- yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>ha01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>ha02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>ha01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>ha02:8088</value>
</property>
<property>
<name>hadoop.zk.address</name>
<value>ha02:2181,ha03:2181,ha04:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 如果vmem、pmem资源不够,会报错,此处将资源监察置为false -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
- works
vi works,works里面表示的datanode节点的名称,我们这里是ha02-ha04
ha02
ha03
ha04
注意
由于我们在安装centos7的时候选择了最小化安装,默认是不安装psmics。但在ZKFC中会使用到里面的命令来进行主从切换,否则切换失败,所以需安装psmisc
yum -y install psmisc
简短说明,包含fuser,killall,pstree三个程序
fuser 显示使用指定文件或者文件系统的进程的PID。
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。
pstree 树型显示当前运行的进程。
集群启动验证
- 启动zookeeper集群
由于我们在ha02/ha03/ha04安装zookeeper,启动是在这3台进行
zkServer.sh start
2.启动journalnode
JN我们规划是在ha01/ha02/ha03,在这3台分别执行
hadoop-daemon.sh start journalnode
3.格式化namenode,启动主从namenode
格式化是hdfs中namenode第一次启动时要进行的操作,这里做了集群后是2个namenode,挑选一台,比如我们选的是ha01
ha01执行 hdfs namenode -format
启动主从namenode,
在ha01执行 hadoop-daemon.sh start namenode
在ha02执行 hdfs namenode -bootstrapStandby
4.格式化zk
在启动ZKFC时需要依赖zookeeper集群,上边已启动集群,对zookeeper集群格式化
在ha01执行 hdfs zkfc -formatZK
5.启动其他服务
现在就可以启动其他服务了,我们在ha01执行 start-dfs.sh
然后在4台机器上输入jps查看是否是我们规划的服务信息