HDFS使用QJM搭建HA环境

2018-07-27  本文已影响23人  让随着风飘

简介

    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名字】

虽然我自觉都写到了,看官可能会觉得有些地方可能不太详尽,若有问题,请参考官方文档,在简介连接里面。

上一篇 下一篇

猜你喜欢

热点阅读