第二十天-- zookeeper -- hadoop高可用搭建 -- hadoop高可用恢复原数据

第二十天 – zookeeper – hadoop高可用搭建 – hadoop高可用恢复原数据

一、ZooKeeper

简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户,ZooKeeper提供了文件系统和通知机制。ZooKeeper的文件系统类似于Linux的树形结构,但有它独特的地方,如一个节点既是一个目录,又是一个文件,即节点可以存储数据,也可以在其中存储子节点。ZooKeeper的作用有:配置信息管理、命名空间管理、集群的管理、组服务管理等。

下载

点击下载(3.4.13)

安装

将下载的安装包上传至Linux,解压即可

配置ZooKeeper

ZooKeeper集群也分为单机、伪分布、全分布安装,这里直接配置全分布安装。

  1. 进入ZooKeeper安装目录的conf文件夹,将zoo_sample.cfg重命名为zoo.cfg或者直接新建文件zoo.cfg。zoo.cfg配置如下

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/home/bigdata/zkdata #此为ZooKeeper的数据存放目录
    clientPort=2181 #此为ZooKeeper的访问端口
    dataLogDir=/home/bigdata/zkdata/log #此为ZooKeeper的日志存放目录
    #以下三项配置集群的主机信息,2888是从follower连接到leader机器的端口,3888用来进行leader选举时所用的端口
    server.1=sz01:2888:3888 
    server.2=sz02:2888:3888
    server.3=sz03:2888:3888
    
  2. 在第一台/home/bigdata/zkdata中创建文件myid,文件内容为1,在第二台/home/bigdata/zkdata中创建文件myid,文件内容为2,在第一台/home/bigdata/zkdata中创建文件myid,文件内容为3。文件内容要与zoo.cfg中server.后面的数字相对应

配置环境变量

vi .bash_profile 文件中添加一下信息

ZK_HOME=/home/bigdata/zookeeper-3.4.13/

PATH=$PATH:$ZK_HOME/bin

export ZK_HOME

保存退出后source .bash_profile

分发ZooKeeper至另外两台

使用scp命令将ZooKeeper安装目录、环境变量文件分发至另外两台机器对应的用户目录中

scp -r /home/bigdata/zookeeper-3.4.13 SZ02:/home/bigdata/zookeeper-3.4.13

scp -r /home/bigdata/zookeeper-3.4.13 SZ03:/home/bigdata/zookeeper-3.4.13

启动ZooKeeper

启动ZooKeeper服务

zkServer.sh start 启动

zkServer.sh stop 停止

zkServer.sh status 查看状态

查看状态时,有一台是leader,另外两台是follower

可以使用zkCli.sh进入ZooKeeper的命令行进行操作ZooKeeper的文件系统

zkCli的基本命令

创建节点

create [-s][-e] path data acl

如create /node1 123:在根目录创建了node1节点,并携带数据 123

参数-e代表创建临时节点,仅在当前session有效,退出后创建的节点就消失了

参数-s代表创建序列化节点,如create -s /node2 111,实际创建的节点名为node2_10000000001,如果重复创建,则后面的数字会递增。

删除操作

delete path :删除节点数据,无法删除包含子节点的节点

rmr path :删除整个节点

修改操作

set path data

查看节点数据

get path

ZooKeeper注意事项

zookeeper集群需要奇数台server,集群中有半数以上的节点存活即可正常使用。

zookeeper快速选举机制:当集群中leader挂掉,所有follower会投票选举出新的leader。

快速同步数据:zookeeper将会存储小量用于服务做协调的数据,并且同步数据属于强一致性,即快速同步数据。

二、Hadoop高可用

高可用的目的是解决单点故障,如hdfs中的namenode节点宕机,需要立即启用另外的namenode接管集群。更具体的含义、介绍可以查看官网介绍,本文只讲解如何搭建。HDFS、YARN可以搭建高可用环境

高可用节点规划
SZ01 NameNode DataNode ResourceManager NodeManager JournalNode zkfc QuorumPeerMain
SZ02 NameNode DataNode ResourceManager NodeManager JournalNode zkfc QuorumPeerMain
SZ03 DataNode NodeManager JournalNode QuorumPeerMain
配置ssh免密登录

详见ssh免密登录

修改配置文件

在非高可用的基础上,修改hadoop安装目录下的./etc/hadoop/目录中的如下配置文件

  1. core-site.xml

    <configuration>
    <!--指定高可用集群命名空间-->
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://bigdata</value>
    </property>
    <!-- Hadoop文件系统依赖的基础配置 -->
    <property>
      <name>hadoop.tmp.dir</name>
     <value>/home/hahadoopdata/tmp</value>
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
    </property>
    <!--指定zk集群的地址-->
    <property>
     <name>ha.zookeeper.quorum</name>
     <value>SZ01:2181,SZ02:2181,SZ03:2181</value>
    </property>
    </configuration>
    
  2. hdfs-site.xml

    <configuration>
    <!--设置hdfs副本数-->
    <property>
     <name>dfs.replication</name>
     <value>3</value>
    </property>
    <!--指定文件块大小-->
    <property>
     <name>dfs.block.size</name>
     <value>134217728</value>
    </property>
    <!--指定namenode数据存放目录-->
    <property>
     <name>dfs.namenode.name.dir</name>
     <value>/home/bigdata/hahadoopdata/dfs/name</value>
    </property>
    <!--指定datanode数据存放目录-->
    <property>
     <name>dfs.datanode.data.dir</name>
     <value>/home/bigdata/hahadoopdata/dfs/data</value>
    </property>
    <!--指定hdfs命名服务的逻辑名称,需要与fs.defaultFS设置相同-->
    <property>
     <name>dfs.nameservices</name>
     <value>bigdata</value>
    </property>
    <!--指定namenode别名-->
    <property>
      <name>dfs.ha.namenodes.bigdata</name>
      <value>nn1,nn2</value>
    </property>
    <!--指定namenode主机及端口-->
    <property>
      <name>dfs.namenode.rpc-address.bigdata.nn1</name>
      <value>sz01:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.bigdata.nn2</name>
      <value>sz02:8020</value>
    </property>
    <!--指定namenodeWeb监控端口-->
    <property>
      <name>dfs.namenode.http-address.bigdata.nn1</name>
      <value>sz01:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.bigdata.nn2</name>
      <value>sz02:50070</value>
    </property>
    <!--指定namenode读写journalnode端口地址-->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://sz01:8485;sz02:8485;sz03:8485/bigdata</value>
    </property>
    <!--指定journalnode数据存放目录-->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/home/bigdata/hahadoopdata/journal/data</value>
    </property>
    <!--是否打开namenode宕机后自动切换-->
    <property>
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
    </property>
    <!--指定namenode宕机后自动切换主类-->
    <property>
     <name>dfs.client.failover.proxy.provider.bigdata</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!--指定namenode宕机后杀死该namenode的方式,防止脑裂-->
    <property>
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
    </property>
    <!--ssh的公钥存放位置-->
    <property>
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/home/bigdata/.ssh/id_rsa</value>
    </property>
    <!--指定ssh登录的延迟时间-->
    <property>
     <name>dfs.ha.fencing.ssh.connect-timeout</name>
     <value>30000</value>
    </property>
    </configuration>
    
  3. mapred-site.xml

    <configuration>
    <!--配置MapReduce任务的执行框架-->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <final>true</final>
    </property>
    </configuration>
    
    
  4. yarn-site.xml

    <configuration>
    <!--NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序-->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <!--是否开启yarn的高可用-->
    <property>
      <name>yarn.resourcemanager.ha.enabled</name>
      <value>true</value>
    </property>
    <!--指定yarn集群id-->
    <property>
      <name>yarn.resourcemanager.cluster-id</name>
      <value>bigdatayarn</value>
    </property>
    <!--指定高可用两台resourcemanager别名-->
    <property>
      <name>yarn.resourcemanager.ha.rm-ids</name>
      <value>rm1,rm2</value>
    </property>
    <!--指定两台resourcemanager主机名-->
    <property>
      <name>yarn.resourcemanager.hostname.rm1</name>
      <value>sz01</value>
    </property>
    <property>
      <name>yarn.resourcemanager.hostname.rm2</name>
      <value>sz02</value>
    </property>
    <!--指定resourcemanagerWeb监控端口-->
    <property>
      <name>yarn.resourcemanager.webapp.address.rm1</name>
      <value>sz01:8088</value>
    </property>
    <property>
      <name>yarn.resourcemanager.webapp.address.rm2</name>
      <value>sz02:8088</value>
    </property>
    <!--指定zk集群的地址-->
    <property>
      <name>yarn.resourcemanager.zk-address</name>
      <value>sz01:2181,sz02:2181,sz03:2181</value>
    </property>
    <property>
      <name>yarn.nodemanager.resource.memory-mb</name>
      <value>1024</value>
    </property>
    <property>
      <name>yarn.nodemanager.resource.cpu-vcores</name>
      <value>1</value>
    </property>
    </configuration>
    
  5. slaves

    sz01
    sz02
    sz03
    
分发配置文件

scp -r $HADOOP_HOME/etc/hadoop sz02:$HADOOP_HOME/etc/hadoop
scp -r $HADOOP_HOME/etc/hadoop sz03:$HADOOP_HOME/etc/hadoop

第一次启动高可用集群
  1. 三台机器启动zk集群

    zkServer.sh start

  2. 三台机器启动journalnode节点

    hadoop-daemons.sh start journalnode

注意:在进行第三步操作前,请先阅读下文第三大点高可用集群恢复原数据

  1. 选择第一台namenode进行格式化,然后单节点启动

    hdfs namenode -format

    hadoop-daemon.sh start namenode

  2. 另一台namenode进行拉取元数据

    hdfs namenode -bootstrapStandby

  3. 格式化zkfc

    hdsf zkfc -formatZK

格式化过程可能会不同的报错,通过查看日志可解决,一般都是防火墙未关闭、配置文件未配置正确等问题。

启动集群

start-all.sh

第二台的resourcemanager可能无法自动启动,需要通过单台启动命令启动

yarn-daemon.sh start resourcemanager

启动完成后,三台节点的进程如下图

1540000409061

三、高可用集群恢复原数据

搭建高可用集群后,由于配置文件中一些配置目录的改变,并且格式化了namenode,整个hdfs中的数据是空的,将会导致一些问题,比如hive无法正常操作,原表数据无法查询等。此时需要回复原集群中的数据。

恢复原数据

两种思路:1.如果在上文第一次启动高可用集群进行到第2步,还未进行namenode的格式化,可以尝试如下方法(本方法我未测试,但是思路理论上行得通):直接修改配置文件core-site.xml的hadoop.tmp.dir配置项和hdfs-site.xml中的namenode、datanode为原集群中的数据目录,然后直接跳过第3步的格式化namenode,直接单节点启动namenode后进行第4步

2.如果刚开始没有想过要回复元数据,已经走完了整个第一次启动高可用集群的流程,然后想回复原数据,此时就需要比较繁琐的步骤了,如下。

  • 修改hdfs-site.xml中的namenode、datanode为原集群中的数据目录,journalnode的数据目录可不修改。

  • 查看/home/bigdata/hadoop/dfs/name/current目录下(原集群中的namenode数据存放目录)的VERSION文件,记录clusterID后的值

  • 修改/home/bigdata/hahadoopdata/journal/data/bigdata/current目录下(新集群中的journalnode数据存放目录)下的VERSION文件,将clusterID后的字符串修改为上一步记录的值。注意:三台journalnode都需要进行这一步操作

  • 为了保险起见,检查三台datanode节点的VERSION文件的clusterID是否与namenode一致

  • 都修改完成后,进行第二台另namenode进行拉取元数据、格式化zkfc的操作

  • 注意,启动hdfs后如果无法启动namenode,查看日志文件如果出现类似There appears to be a gap in the edit log. We expected txid 1, but got txid 1622的报错,意为元数据损坏,此时使用命令恢复原数据即可

    hadoop namenode -recover

hive恢复表数据

回复完hdfs的数据后,文件数据虽然都已经回复了,但是hive依旧无法进行正常的增删改查操作,原因是集群的命名改变了,而hive的元数据信息没变,此时需要手动在mysql中修改hive的元数据信息。

需要修改两张表

DBS表和SDS表

原信息:hdfs://sz01:8020/user/hive/warehouse/xxxxx

修改后:hdfs://bigdata/user/hive/warehouse/xxxxx

修改后即可正常使用了。

猜你喜欢

转载自blog.csdn.net/cry970795248/article/details/83211271