配置Hadoop的高可用

版权声明:欢迎转载,注明出处 https://blog.csdn.net/jklcl/article/details/82778854

配置Hadoop的高可用

一、准备

  • 1、配置好Hadoop、JDK,两台namenode机器可以ssh免密登陆其他机器等

  • 2、规划三台虚拟机(hadoop01,hadoop02, hadoop03)

    active/standby namenode 与zkfc :hadoop01和hadoop02

    JN集群:三台虚拟机都参与

    zk集群:三台虚拟机都参与

    datanode与nodemanager:三台虚拟机都参与

    resourcemanager:hadoop03

二、配置

  • 1、修改core-site.xml文件

    vi core-site.xml
    #添加
    <!-- 指定在Hadoop中要使用的文件系统 -->
    	<property>
    		<name>fs.defaultFS</name>
    		<value>hdfs://mycluster</value>
    	</property>
    	<!-- zookeeper集群地址信息 -->
    	<property>
    		<name>ha.zookeeper.quorum</name>
    		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
    	</property>
    	<!-- HDFS中sequenceFiles中使用的读/写缓冲区的大小 -->
    	<property>
    	  <name>io.file.buffer.size</name>
    	  <value>131072</value>
    	</property>
    
  • 2、修改hdfs-site.xml文件

#新建目录 用来储存namenode信息(路径自定义)
mkdir -p /opt/data/hadoop/hdfs/namenode
#新建目录 用来储存datanode信息(路径自定义)
mkdir -p /opt/data/hadoop/hdfs/datanode
#新建目录 用来储存journalnode信息(路径自定义)
mkdir -p /opt/data/hadoop/jn/data
  vi hdfs-site.xml
   #添加
   <!-- ~~~~~~~~~~~~~~~~~~~ HDFS常规配置 ~~~~~~~~~~~~~~~~~~~ -->
    <!-- HDFS中Namenode元数据存储在本地文件系统的位置 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/data/hadoop/hdfs/namenode</value>
    </property>
    <!-- HDFS中Datanode数据块存储在本地文件系统的位置 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/data/hadoop/hdfs/datanode</value>
    </property>
    <!-- HDFS中数据块的副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
  
    <!-- ~~~~~~~~~~~~~~~~~~~ HDFS HA配置 ~~~~~~~~~~~~~~~~~~~ -->
      <!-- 此新名称服务的逻辑名称
      HDFS的名称服务的逻辑名称 -->
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    <!-- dfs.ha.namenodes.[nameservice ID] - nameservice中每个NameNode的唯一标识符
      配置逗号分隔的NameNode ID列表。DataNodes将使用它来确定集群中的所有NameNode -->
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 要监听的每个NameNode的完全限定RPC地址
      对于两个先前配置的NameNode ID,请设置NameNode进程的完整地址和IPC端口 -->
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>hadoop01:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>hadoop02:8020</value>
    </property>
    <!-- dfs.namenode.http-address.[nameservice ID].[name node ID] - 要监听的每个NameNode的完全限定HTTP地址
      与上面的rpc-address类似,设置两个NameNodes的HTTP服务器的地址以进行监听 -->
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>hadoop01:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>hadoop02:50070</value>
    </property>
    <!-- dfs.namenode.shared.edits.dir - 标识NameNodes将写入/读取编辑的JN组的URI
      这是一个配置JournalNodes地址的地方,它提供共享编辑存储,由Active nameNode写入并由Standby NameNode读取,以保持Active NameNode所做的所有文件系统更改的最新状态。虽然您必须指定多个JournalNode地址,但您应该只配置其中一个URI。URI的格式应为:qjournal://host1:port1;host2:port2;host3:port3/journalId。JournalID是此nameservice的唯一标识符,它允许一组JournalNode为多个联合名称系统提供存储。 -->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
    </property>
    <!-- dfs.journalnode.edits.dir - JournalNode守护程序将存储其本地状态的路径
    这是JournalNode计算机上的绝对路径,其中将存储JN使用的编辑和其他本地状态。 -->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/data/hadoop/jn/data</value>
    </property>
    <!-- 启用自动失败转移机制 -->
    <property>
     <name>dfs.ha.automatic-failover.enabled</name>
     <value>true</value>
    </property>
    <!-- dfs.client.failover.proxy.provider.[nameservice ID] - HDFS客户端用于联系Active NameNode的Java类
    配置Java类的名称,DFS客户端将使用该名称来确定哪个NameNode是当前的Active,以及哪个NameNode当前正在为客户端请求提供服务。目前Hadoop附带的两个实现是ConfiguredFailoverProxyProvider和RequestHedgingProxyProvider(对于第一次调用,它同时调用所有名称节点以确定活动的名称,并在后续请求中调用活动的名称节点,直到发生故障转移) -->
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!--  脚本或Java类的列表,用于在故障转移期间屏蔽 Active NameNode
    对于系统的正确性,期望在任何给定时间只有一个NameNode处于活动状态。重要的是,在使用Quorum Journal Manager时,只允许一个NameNode写入JournalNodes,因此不存在从裂脑情况中破坏文件系统元数据的可能性。但是,当发生故障转移时,以前的Active NameNode仍可能向客户端提供读取请求,这可能已过期,直到NameNode在尝试写入JournalNode时关闭。因此,即使使用Quorum Journal Manager,仍然需要配置一些防护方法。但是,为了在防护机制失败的情况下提高系统的可用性,建议配置防护方法,该方法可保证作为列表中的最后一个防护方法返回成功。请注意,如果您选择不使用实际的防护方法,则仍必须为此设置配置某些内容,例如“ shell(/ bin / true) ”。
    故障转移期间使用的防护方法配置为回车分隔列表,将按顺序尝试,直到指示防护成功为止 -->
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>
        sshfence
        shell(/bin/true)
      </value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
    </property>
    <!-- fs.defaultFS - Hadoop FS客户端在没有给出时使用的默认路径前缀
    可选)您现在可以配置Hadoop客户端的默认路径以使用新的启用HA的逻辑URI。 -->
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
    </property>
  • 3、修改slave文件

    为什么要修改呢?这里更改了要求,要求有三台datanode,用来投票,满足奇数台

    扫描二维码关注公众号,回复: 3884616 查看本文章
    vi /etc/slave
    #可以都改为
    localhost
    
    #或者是改为
    hadoop01
    hadoop02
    hadoop03
    

三、启动

  • 0.首先停止集群
stop-all.sh
  • 1.在ZooKeeper中初始化所需的状态。可以从任意一个NameNode主机运行以下命令来执行此操作。
hdfs zkfc -formatZK
#这将在zookeeper中创建一个znode,其中存储的是自动故障转移相关的数据
#不管过程中显示的信息如何,只要能看到如下信息即可:
#$Successful created /hadoop-ha/mycluster in ZK
  1. 启动journalnode,在每个配置了JN主机上启动JN
hadoop-daemon.sh  start journalnode
#启动完JN进程后稍等2分钟左右再进行下述操作

3.格式化HDFS 在第一个namenode上执行

hdfs namenode -format

4.在第一个namenode上启动hdfs集群

start-dfs.sh #注意:这时候第二个namenode进程可能会起不来

5.去第二个namenode上同步第一个namenode上的数据

hdfs namenode -bootstrapStandby

6.单独在第二个namenode上启动或在第一个namenode所在的机器上执行HDFS集群启动命令
建议第二种方式:

start-dfs.sh //注意在这里会有很多进程已经启动了,忽略之

四、测试

打开hadoop01:50070

主动杀死处于active状态的namenode进程,查看另一个namenode的状态是否变为active状态。

猜你喜欢

转载自blog.csdn.net/jklcl/article/details/82778854