hadoop ha 高可用搭建

该ha搭建是在hadoop全分布式基础上搭建,关于hadoop全分布式搭建可以参考另一篇hadoop3分布式环境基础搭建

目录

一、高可用简介

二、配置hadoop

三、zookeeper安装及配置

四、namenode节点信息同步

五、zookeeper格式化、ha启动及测试


一、高可用简介

多个namenode,增加namenode增加可用性。

ha角色分配如下

NN:namenode;                         DN:datanode;

ZK:zookeeper;                         ZKFC:ZookeeperFailoverController;

JNN:journalnode;

二、配置hadoop

说明:使用时请将#开头的注释删除,因为有的配置文件的注释不为#!

注意:ha高可用搭建是在全分布式基础上搭建的,基本相似,本节只列举了配置中不同的地方。关于全分布式搭建请看这里hadoop3分布式环境基础搭建

配置hadoop环境变量

vi /myapp/hadoop-3.1.2/etc/hadoop/hadoop-env.sh 

在最后一行添加如下内容(JAVA_HOME根据实际JAVA安装路径决定):

export JAVA_HOME=/export/servers/jdk             # JAVA_HOME路径,可用echo $JAVA_HOME获得
export HDFS_NAMENODE_USER=root                   # 为hadoop配置三个角色的用户
export HDFS_DATENODE_USER=root
# export HDFS_SECONDARYNAMEDODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root

配置副本放置策略

vi /myapp/hadoop-3.1.2/etc/hadoop/hdfs-site.xml 

hdfs-site.xml中configuration标签内容修改如下:

<configuration>
<!-- 配置放置的副本数(存于datanode中,且不会在同一机器上) -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>               
    </property>

<!-- 配置本机的逻辑名称,指向实际namenode节点(因为有多个namenode) -->
    <property>
        <name>dfs.nameservices</name>   
        <value>mycluster</value>
    </property>
<!-- 配置‘mycluster’的namenode,nn1,nn2,nn3为namenode名 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name> 
        <value>nn1,nn2,nn3</value>
    </property>
<!-- 对应上面两个namenode(nn1,nn2)配置 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>  
  <value>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>

<!-- nn1,nn2的http协议配置(上面两个) -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name> 
  <value>node01:9870</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:9870</value>
</property>

<!-- journalnode配置,有三个分别是node01,node02,node03(由第一节架构图可知) -->
<property>      
  <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>

<!-- 配置故障转移代理,直接复制官网上的,不需要改变 -->
<property>    
  <name>dfs.client.failover.proxy.provider.mycluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 由于namenode之间的切换需要操纵远程电脑,所以配置私有免秘钥访问 -->
    <property>   
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
<!--  秘钥所在的路径 -->
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value> 
    </property>

<!--  配置journalnode的日志所在路径,在此配置与hadoop配置目录(/myapp/hadoop-3.1.2/ha_temp/)下 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/myapp/hadoop-3.1.2/ha_temp/journalnode</value>
</property>

<!--  配置故障转移 -->
 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

</configuration>

配置主节点

vi /myapp/hadoop-3.1.2/etc/hadoop/core-site.xml 

 core-site.xml中configuration标签内容修改如下:

<configuration>

<!-- 配置的主节点namenode,由于有多个,所以为namenode服务的名称 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>       
    </property>

<!-- 自定义hadoop的临时目录,不修改为系统临时目录,容易丢失,比较危险 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/myapp/hadoop-3.1.2/ha_temp</value>   
    </property>

<!-- 配置zookeeper集群,由第一节架构图可知有三个node02,node03,node04 -->
 <property>
   <name>ha.zookeeper.quorum</name>
   <value>node02:2181,node03:2181,node04:2181</value>
 </property>

</configuration>

将配置分发到其他节点

scp core-site.xml hdfs-site.xml hadoop-env.sh root@node02:/myapp/hadoop-3.1.2/etc/hadoop/
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node03:/myapp/hadoop-3.1.2/etc/hadoop/
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node04:/myapp/hadoop-3.1.2/etc/hadoop/

配置从节点

参考全分布式。

三、zookeeper安装及配置

zookeeper要安装到node02、node03、node04上。

采取策略:现在node02上安装配置好,然后分发到node03、node04上去。

解压

tar -xzvf zookeeper-3.4.6.tar.gz -C /myapp/

配置zookeeper环境变量(node02、node03、node04都要做这步)

vi /etc/profile,在末尾添加:

#set zookeeper env
export ZOOKEEPER_HOME=/myapp/zookeeper-3.4.6
export PATH=${ZOOKEEPER_HOME}/bin:$PATH

重新加载环境变量

source /etc/profile

配置zookeeper

1)修改zoo.cfg

将conf目录中zoo_sample.cfg重命名为zoo.cfg,不做这一步可能无法正常启动,命令如下:

mv /myapp/zookeeper-3.4.6/conf/zoo_sample.cfg /myapp/zookeeper-3.4.6/conf/zoo_.cfg 

用 vi zoo.cfg 命令修改zoo.cfg文件

将dataDir改为如下,dataDir为zookeeper的临时目录,默认放在系统临时目录/tmp下,容易丢失

dataDir=/myapp/zookeeper-3.4.6/temp

添加如下内容到zoo.cfg末尾,即将zookeeper集群中的所有节点配置,对应关系很重要,配置后不要修改

server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888

2)将zoo.cfg分发到node03、node04

在hadoop安装目录的上级目录执行下面命令

scp -r zookeeper-3.4.6 root@node03:/myapp/
scp -r zookeeper-3.4.6 root@node04:/myapp/

3)对zookeeper的每台机器配置编号(node02、node03、node04)

创建zookeeper的临时目录,即zoo.cfg中dataDir指定的那个目录

mkdir -p /myapp/zookeeper-3.4.6/temp

在临时目录中创建编号文件,并对应zoo.cfg中配置的编号写入文件

echo 1 > /myapp/zookeeper-3.4.6/temp/myid   # node02中
echo 2 > /myapp/zookeeper-3.4.6/temp/myid   # node03中
echo 3 > /myapp/zookeeper-3.4.6/temp/myid   # node04中

运行zookeeper(node02、node03、node04)

用下面命令启动

zkServer.sh start

查看状态

zkServer.sh status

显示中若为Mode: leader则该节点为主节点,若为Mode: follower则该节点为从节点。

启动zookeeper客户端

zkCli.sh

停止zookeeper

zkServer.sh stop

注意:zookeeper集群只有启动过半节点状态才为启动成功,例如3台集群启动2台以上,5台集群启动3台以上。

四、namenode节点信息同步

node01和node02为namenode,所以这两个节点的信息应该一致。

启动journalnode(node01、node02、node03,由第一节架构图可知)

hdfs --daemon start journalnode

格式化namenode(node01)

hdfs namenode -format

启动namenode(node01上的)

hdfs --daemon start namenode

在node02上输入以下命令将node01的信息同步到node02

hdfs namenode -bootstrapStandby

同步成功后会在/myapp/hadoop-3.1.2/etc/ha_temp/dfs/name/current中有文件。

五、zookeeper格式化、ha启动及测试

格式化zookeeper(node01中)

hdfs zkfc -formatZK

格式化成功后使用“zkCli.sh”进入zookeeper,再使用“ls /”可以看到生成了/hadoop-ha/mycluster目录,里面存放有namenode。

启动ha(node01中)

注意:启动ha之前要先启动zookeeper。

start-dfs.sh

启动后,用jps查看每台机器运行的进程,与第一节图中的一致。

测试

在windows浏览器中输入“192.168.182.140:9870”可以看到node01为activate状态,在浏览器中输入“192.168.182.141:9870”可以看到node02为standby状态。

在node01上用以下命令关闭namenode

hdfs --daemon stop namenode

在浏览器中刷新node02,可以看到状态从standby变为activate,实现了namenode自动切换。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值