Hadoop搭建高可用的服务环境

前提:

  1. 该环境是在上一节全分布式hadoop安装的方式基础上进行安装的。 Hadoop3 全分布式安装
  2. 还需在node02,node03,node04上面安装好zookeeper 集群安装ZooKeeper

搭建环境的角色分配

节点服务器NameNode01NameNode02DataNodeZooKeeperZKFSJournalNode
node01
node02
node03
node04
  • Zookeeper :作分布式协调系统,独立于其他集群之外,单独部署,搭建的分布式架构。
  • ZKFC :必须与NameNode放在一起,避免网络传输波动,造成渐冲检查的不及时,切换的不及时,每一个主节点都有一个ZKFC物理进程来监控。
  • JournalNode :共享两台服务器之间NameNode数据进行透穿,存储编辑日志信息,以集群的方式存在。node01节点作为active节点,把信息写入JNN集群中,node02下载同步相同的信息,从而达到两个节点namenode信息同步的目的。
一. 备份配置文件

将之前搭建的全分布式安装的配置文件复制一份,以为了以后有需要直接修改配置文件的名称,重新启动。

cp -r /opt/hadoop-3.1.2/etc/hadoop /opt/hadoop-3.1.2/etc/hadoop-full
二. 修改hadoop.env文件
  1. HDFS_SECONDARYNAMENODE_USER用户注释掉。
    # export HDFS_SECONDARYNAMENODE_USER=root
    
  2. 增加角色配置
    export HDFS_ZKFC_USER=root
    export HDFS_JOURNALNODE_USER=root
    
  3. 最终的效果展示
三. 修改core-site.xml文件
  1. 修改文件目录
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop/ha</value>
    </property>
    
  2. 增加staticuser
       hadoop.http.staticuser.user——在网页界面访问数据使用的用户名。 默认值是一个不真实存在的用户,此用户权限很小,不能访问不同用户的数据。这保证了数据安全。也可以设置为hdfs和hadoop等具有较高权限的用户,但会导致能够登陆网页界面的人能看到其它用户数据。实际设置请综合考虑。如无特殊需求。使用默认值就好
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
    
四. 修改hdfs-site.xml文件
  1. 删除SecondAryNamenNode节点
    将全分布式Hadoop集群中的SecondAryNamenNode节点删除掉。

  2. 添加fds.nameservices -- the logical name for this new nameservice

    主节点的服务名称

    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    
  3. 添加dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice

    包含一个NN列表。nameservice ID 是指具体的nameservice名称,通常就是dfs.nameservices中配置的。值是预备配置的NNID
    ID是自己取的,不重复就可以,例如nn1,nn2

    <property>
    	<name>dfs.ha.namenodes.mycluster</name>
    	<value>nn1,nn2</value>
    </property>
    
  4. 添加dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on

    NNRPC地址和端口,远程服务调用

    <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>
    
  5. 添加dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on

    NNHTTP地址和端口。0表示任意空闲端口。
    浏览器与NameNode进行通信的HTTP地址

    <property>
    	<name>dfsi.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>
    
  6. 添加dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits

    在多个NN中共享存储目录,用于存放edits文件。这个目录,由active写,由standby读,以保持命名空间数据一致。此目录不需要是dfs.namenode.edits.dir中列出的。在非HA集群中,它不会使用。建议使用qj方式,可以不关注这个选项
    NameNode的共享路径,JournalNode配置集群的地址

    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
    </property>
    
  7. 添加dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode

    HDFS客户端找到active NameNode 类名的代理类,如果不配置客户端返回activeNameNode报错,显示无连接地址

    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    
  8. 添加dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover

    HDFSHA功能的防脑裂方法。可以是内建的方法(例如shellsshfence)或者用户定义的方法。建议使用sshfence(hadoop:9922),括号内的是用户名和端口,注意,这需要NN的2台机器之间能够免密码登陆。
    fences是防止脑裂的方法,保证NN中仅一个是Active的,如果2者都是Active的,新的会把旧的强制Kill
    使用sshfence时,SSH的私钥文件。 使用了sshfence,dfs.ha.fencing.ssh.private-key-files这个必须指定

    <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>
    
  9. 添加dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state

    journalnode集群放置存储同步日志的路径

    <property>
    	<name>dfs.journalnode.edits.dir</name>
    	<value>/var/hadoop/ha/journalnode</value>
    </property>
    
  10. 添加The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml file

    是否开启自动故障转移。建议开启,true

    <property>
    	<name>dfs.ha.automatic-failover.enabled</name>
    	<value>true</value>
    </property>
    
  11. 效果展示

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!--
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License. See accompanying LICENSE file.
    -->
    
    <!-- Put site-specific property overrides in this file. -->
    
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        
        <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>node01:8020</value>
       </property>
       <property>
    		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
    		<value>node02:8020</value>
       </property>
    
       <property>
    		<name>dfsi.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>
    
       <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>
    
        <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>
    
       <property>
    		<name>dfs.journalnode.edits.dir</name>
    		<value>/var/hadoop/ha/journalnode</value>
       </property>
    
       <property>
    		<name>dfs.ha.automatic-failover.enabled</name>
    		<value>true</value>
       </property>
    
    </configuration>
    
五. 配置core-site.xml文件
  1. 修改fs.defaultFS

    默认文件系统的名称。URI形式。uri’s的scheme需要由(fs.SCHEME.impl)指定文件系统实现类。 uri’s的authority部分用来指定host, port等。默认是本地文件系统。

    HA方式,这里设置服务名,例如:hdfs://mycluster1
    HDFS的客户端访问HDFS需要此参数。

     <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    
  2. 添加ZooKeeper集群

    Ha功能,需要一组zk地址,用逗号分隔。被ZKFailoverController使用于自动失效备援failover。

    <property>
    	<name>ha.zookeeper.quorum</name>
    	<value>node02:2181,node03:2181,node04:2181</value>
    </property>
    
  3. core-site.xml 配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!--
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License. See accompanying LICENSE file.
    -->
    
    <!-- Put site-specific property overrides in this file. -->
    
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://mycluster</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/var/hadoop/ha</value>
        </property>
        <property>
            <name>hadoop.http.staticuser.user</name>
            <value>root</value>
        </property>
    
        <property>
    		<name>ha.zookeeper.quorum</name>
    		<value>node02:2181,node03:2181,node04:2181</value>
        </property>
    </configuration>
    
六. 将hadoop配置文件的文件夹分发到其他节点上
scp core-site.xml hdfs-site.xml hadoop-env.sh node02:`pwd`
scp core-site.xml hdfs-site.xml hadoop-env.sh node03:`pwd`
scp core-site.xml hdfs-site.xml hadoop-env.sh node04:`pwd`
七. 实现两个NameNode信息同步透穿

在此之前必须现在(node02,node03,node04)节点上安装好zookeeperZookeeper安装配置文章

  1. 启动JournalNode

    分别在node01,node02,node03上执行启动命令

    # 启动
    hdfs --daemon start journalnode
    # 停止
    hdfs --daemon stop journalnode
    
  2. node01上格式化主节点

    hdfs namenode -format
    

    成功的标志:

    查看此时的集群ID:

  3. 观察Zookeeper客户端是否挂在主节点
    Zookeeper作用:负责记录两个Namenode做故障转移,会在其中做注册行为
    登录到zkServer.sh,使用ls /命令,观察到仅有

    [zk: localhost:2181(CONNECTED) 0] ls /
    [zookeeper]
    
  4. node02主节点数据信息同步

    a. 启动node01上面的主节点

    # 老命令但还支持
    hadoop-daemon.sh start namenode
    # hadoop3.x 建议命令
    hdfs --daemon start namenode
    

    b. 在node02上面执行数据信息同步命令

    hdfs namenode -bootstrapStandby
    

    成功标志:

    观察集群ID,与node01namenode集群ID相同

    观察ZooKeeper节点:

八.ZooKeeper的格式化

前提:ZooKeeper集群已经启动起来
本节的命令在node01上面执行

hdfs zkfc -formatZK

成功标志:

九. 启动Hadoop集群

node01上执行以下命令:

start-dfs.sh


在各个节点使用jps命令查看正在运行的Java进程:




ZooKeeper客户端中:

多了两个节点,两个节点下面全部为空,使用get命令,获取注册节点下面的注册信息get /hadoop-ha/mycluster/ActiveBreadCrumb,发现第一行显示当前哪个主节点处于活跃状态。


通过Web界面显示,一个节点active,另一个节点显示standby

十. 测试Hadoop集群准备主节点之间的切换
  1. 测试1:将node01中的NameNode干掉,观察node02节点服务器中的NameNode是否变为活跃状态
    a. 执行命令,停止NameNode

    hdfs --daemon stop namenode
    


    可以观察到,在Web界面中,node01:9870无法访问,而node02:9870standby转为active

    再观察ZooKeeper中的节点,活跃节点已经变成了node02

    再重新启动起来node01上面的NameNode,通过Web界面显示Node01上面的NameNode已经变成了Standby状态


    b. 将DKFC停止,将node02中的DKFC停止,(前提:node02NameNodeactive

    hdfs --daemon stop zkfc
    

    此时,Web界面显示,node01NameNodeactivenode02变为standby



      通过这些测试证明,当某一个节点宕机,就会被ZooKeeper发现,它通过事件监控之后,来通知另一个节点作为Standby提升自己为主节点。
      另外一种情况,NameNode并没有宕机,但是由于网络原因,与ZooKeeper通信中断,比如ZKFC进程断了,此时也造成异常,知识ZooKeeper让然会通知另一个节点,另一个节点会把当前处于异常的节点,强制降级为standby(使用sshfance方法),而把自己提升为active

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值