简介
HA即为高可用,由于namenode有单节点故障风险所以引入HA功能。本文主要介绍如何让集群具备该功能,仅限HDFS。写下来以便可以快速参考。
本文内容主要来源于官网,若想详细了解可移步NameNode HA With QJM
环境
软件版本:hadoop3.0.3,zookeeper-3.4.9(hadoop3.0.3采用版本)
me1:namenode,datanode,JournalNode,zookeeper,DFSZKFailoverController
me2:namenode,datanode,JournalNode,zookeeper,DFSZKFailoverController
me3:namenode,datanode,JournalNode,zookeeper,DFSZKFailoverController
配置
core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<--配置了这个就不用配置本地存储namespace的fsimage,editlog的目录,和datanode存放数据的目录了,因为默认会存放在这个目录下面的dfs下面的name和data目录下面-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop</value>
</property>
hdfs-site.xml
<--配置nameservice服务,这个配置可以配置多个nameservice,每个nameservice都有单独的名字空间,这里只配置一个-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<--配置HA模式一个nameservice由多少namenode组成,namenode至少两个,建议不超过5个,建议3个-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2, nn3</value>
</property>
<--这里配置某个nameservice下面某个namenode的rpc端口-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>me1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value> me2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>me3:8020</value>
</property>
<--这里配置某个nameservice下面某个namenode的http端口-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>me1:9870</value>
</property>
<property>
<name> dfs.namenode.http-address.mycluster.nn2</name>
<value>me2:9870</value>
</property>
<property>
<name> dfs.namenode.http-address.mycluster.nn3</name>
<value>me3:9870</value>
</property>
<--journalnode节点存储editlog的本地目录,建议使用nameservice的名字,这个目录存在于配置【dfs.journalnode.edits.dir】下面,建议手动创建,测试貌似没有自动创建-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://me1:8485;me2:8485;me3:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<--这个是一种fence方式,就是检查传说死了的那个active节点到底死了没有,没死弄死,防止脑裂,会使用到fuser命令,建议提前检查是否安装了-->
<property>
<naem>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/wanger/.ssh/id_rsa</value>
</property>
<--journalnode存储editlog和一些状态信息的目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/hadoop/jn</value>
</property>
<--开启failover功能-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>me1:2181,me2:2181,me3:2181</value>
</property>.
hadoop-env.sh
自行修改为自己的目录
export hadoop.tmp.dir=/opt/data/hadoop
export JAVA_HOME=/opt/jdk1.8.0_144
export HADOOP_HOME=/opt/hadoop-3.0.3
配置启动datanode的节点
etc/hadoop/workers
me1
me2
me3
每台机子上需要有.ssh目录,里面需要有完整的公钥私钥等文件,参考命令ssh-keygen -t rsa
每台机子上需要有fuser工具,若未安装可执行 yum install -y psmisc,检查可用type fuser查看命令文件位置
步骤一:在me1,me2,me3安装并启动zookeeper
步骤二:将三个配置文件分别配置到每台机子上,hadoop-env.sh新增三条export即可。
步骤三:在每台namenode的节点上启动QJM,hdfs --daemon start journalnode
步骤四:新创建HA集群使用hdfs namenode -format,只需要在一个namenode节点执行即可。
步骤五:hdfs zkfc -formatZK将HA状态记录到zookeeper
步骤六:start-dfs.sh也可以一个一个地启动,这里会启动一个DFSZKFailoverController进程来监控namenode是否死亡,如果死亡发起failover操作。
步骤七:如果有namenode没有启动成功,执行hdfs namenode -bootstrapStandby,手动启动状态置为standby状态。
测试:打开me1:9870,me2:9870,me3:9870三个web页面,其中会有一个是active,另外两个是standby。
使用命令hdfs --daemon stop namenode杀死active的节点,如果正常会有一个standby转化为active。
注意事项:
正常情况下三个节点应有的进程
NameNode,DataNode,JournalNode,DFSZKFailoverController,QuorumPeerMain(zookeeper)
DFSZKFailoverController:可用hdfs --daemon start zkfc启动
hdfs --daemon start [namenode|datanode|journalnode]
需要手动创建的目录:
/opt/data/hadoop这个目录下面存放namespace,和datanode上的数据
/opt/data/hadoop/jn : QJM节点用来存放editlog文件和一些临时信息的目录,需要手动创建,包括里面的mycluster【这个是QJM所服务的nameservice名字】
虽然我自觉都写到了,看官可能会觉得有些地方可能不太详尽,若有问题,请参考官方文档,在简介连接里面。
网友评论