zoukankan      html  css  js  c++  java
  • Hadoop HA- hadoop集群部署

    前期部署,至少准备3台服务器(可以是虚拟机)

    1、linux系统环境准备

        ip地址配置

        hostname配置

        hosts映射配置

        关闭防火墙 service iptables stop ,也可以设置防火墙不开机自启动 chkconfig iptables off 

     init启动级别修改

    2.java环境的配置

        上传jdk,解压,修改/etc/profile

    3.zookeeper集群的部署,安装zookeeper,环境变量,发送zookeeper文件,profile文件给其他服务器并刷新他,都创建myid文件,开启3台zookeeper: zkServer.sh start ,出现错误可以检查日志文件

    4.解压hadoop安装包,配置PATH环境

    5.做免密钥登录SSH

    node1到node1-3
    node2到node1-3
    注意:namenode之间一定要做免密钥SSH

    6.修改hadoop配置文件

    hadoop-env.sh中添加java的环境变量JAVA_HOME
    core-site.xml
    <configuration>
      <!-- 指定hdfs的nameservice为ns1 -->
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns1/</value>
      </property>
      <!-- 指定hadoop临时目录 -->
      <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/hadoop/hdpt</value>
      </property>
                        
      <!-- 指定zookeeper地址 -->
      <property>
        <name>ha.zookeeper.quorum</name>
        <value>server01-hosetname:2181,server02-hostname:2181,server03-hostname:2181</value>   //server-hostname这里写你实际的服务器主机名
      </property>
    </configuration>

    hdfs-site.xml

    configuration>
      <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
      <property>
          <name>dfs.nameservices</name>
          <value>ns1</value>
      </property>
      <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
      <property>
          <name>dfs.ha.namenodes.ns1</name>
          <value>nn1,nn2</value>
      </property>
      <!-- nn1的RPC通信地址 -->
      <property>
          <name>dfs.namenode.rpc-address.ns1.nn1</name>
          <value>server01-hostname:9000</value>
      </property>
      <!-- nn1的http通信地址 -->
      <property>
          <name>dfs.namenode.http-address.ns1.nn1</name>
          <value>server01-hostname:50070</value>
      </property>
      <!-- nn2的RPC通信地址 -->
      <property>
          <name>dfs.namenode.rpc-address.ns1.nn2</name>
          <value>server02-hostname:9000</value>
      </property>
      <!-- nn2的http通信地址 -->
      <property>
          <name>dfs.namenode.http-address.ns1.nn2</name>
          <value>server02-hostname:50070</value>
      </property>
      <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
      <property>
          <name>dfs.namenode.shared.edits.dir</name>
          <value>qjournal://hostname05:8485;hostname06:8485;hostname07:8485/ns1</value> //hostname为3台journalnode服务器的主机名
      </property>
      <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
      <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/home/hadoop/app/hadoop-2.4.1/journaldata</value>
      </property>
      <!-- 开启NameNode失败自动切换 -->
      <property>
          <name>dfs.ha.automatic-failover.enabled</name>
          <value>true</value>
      </property>
      <!-- 配置失败自动切换实现方式 -->
      <property>
          <name>dfs.client.failover.proxy.provider.ns1</name>
          <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
      <property>
          <name>dfs.ha.fencing.methods</name>
          <value>
              sshfence
              shell(/bin/true)
          </value>
      </property>
      <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
      <property>
          <name>dfs.ha.fencing.ssh.private-key-files</name>
          <value>/home/hadoop/.ssh/id_rsa</value>   //里面放的值为SSH放密钥地址在你所在的用户家目录下的.ssh文件夹内,root用户在/root/.ssh/ ,加密方式不同可能不是id_rsa,自己选择即可类似的文件即可
      </property>
      <!-- 配置sshfence隔离机制超时时间 -->
      <property>
          <name>dfs.ha.fencing.ssh.connect-timeout</name>
          <value>30000</value>
      </property>
    /configuration>

    7.同步配置文件

    8.启动3台journalnode服务器: hadoop-daemon.sh start journalnode (也可以先不启动)

    9.格式化NN(namenode01): hdfs namenode -format ,并启动hdfs: start-dfs.sh 。

    10.同步其他没有格式化的NN(namenode)上执行node2 hdfs namenode -bootstrapStandby

       如果格式化后的NN没有开启,第二台NN上执行 hdfs namenode -format会失败,出现

    11.开启3台zookeeper,如果开启了忽略。

    12.格式化zk, 在一台NN上执行 hdfs zkfc -formatZK 

    13启动集群  start-dfs.sh 

    搭建完成后重启集群 stop-dfs.sh 
     
    再启动:
    1.启动ZK集群 三台zk node1,2,3执行 zkServer.sh start 
    2.启动 hadoop  start-dfs.sh 

    3启动yarn  start-yarn.sh 或者 start-all.sh //同时把集群和yarn开启 

    jps检查namenode是否正常开启,没有的话需要手动单点启动: hadoop-daemon.sh start namenode 

    报错解决:这样一个情况,在设置了Hadoop的HA模式。每次开启zookeeper之后再输入 start-all.sh 将hdfs 和yarn都开启来。一切启动正常,但是namenode的进程却在很短的时间内就消失了,必须通过hadoop-daemon.sh start namenode 手动才能重新上线namenode。

    进检查namenode的日志文件,出现下面的警告:

    WARN org.apache.hadoop.hdfs.server.namenode.FSEditLog: Unable to determine input streams from QJM to

    jps查看进程,namenode进程已经消失。

    肯定NameNode不能正常运行,不是配置错了,而是不能连接上JournalNode、
    查看JournalNode的日志没有问题,那么问题就在JournalNode的客户端NameNode。

    来分析上句的日志:
    NameNode作为JournalNode的客户端发起连接请求,但是失败了,然后NameNode又向其他节点依次发起了请求都失败了,直至到了最大重试次数。

    通过实验知道,先启动JournalNode或者再次启动NameNode就可以了,说明JournalNode并没有准备好,而NameNode已经用完了所有重试次数。

    三、解决办法
    修改core-site.xml中的ipc参数
     <property>
      <name>ipc.client.connect.max.retries</name>
      <value>100</value>
      <description>Indicates the number of retries a client will make to establish
          a server connection.
      </description>
     </property>
     <property>
      <name>ipc.client.connect.retry.interval</name>
      <value>10000</value>
      <description>Indicates the number of milliseconds a client will wait for
      before retrying to establish a server connection.
      </description>
     </property>

    Namenode向JournalNode发起的ipc连接请求的重试间隔时间和重试次数,我的虚拟机集群实验大约需要2分钟,NameNode即可连接上JournalNode。连接后很稳定。

    注意:仅对于这种由于服务没有启动完成造成连接超时的问题,都可以调整core-site.xml中的ipc参数来解决。如果目标服务本身没有启动成功,这边调整ipc参数是无效的。

  • 相关阅读:
    Ubuntu 14.04 LTS Server 无法挂载光盘 启动initramfs等问题
    Linux的交叉编译 及configure配置
    大话设计模式读书笔记(五) 代理模式
    大话设计模式读书笔记(三) 单一职责原则和开放-封闭原则和依赖倒转原则
    大话设计模式读书笔记(二) 策略模式
    Java NIO(一) 初步理解NIO
    大话设计模式读书笔记(一) 简单工厂模式
    多线程设计模式(一) Single Threaded Execution
    多线程详细解析(二) 线程的共享互斥与线程的协调
    多线程详细解析(一) 创建线程
  • 原文地址:https://www.cnblogs.com/RzCong/p/7324425.html
Copyright © 2011-2022 走看看