zoukankan      html  css  js  c++  java
  • Hadoop-HA(高可用)集群搭建

    Hadoop-HA集群搭建

    一、基础准备工作

    1、准备好5台Linux系统虚拟服务器或物理服务器

      我这里演示采用虚拟服务器搭建Hadoop-HA集群,各自功能分配如下:

      NameNode节点:vt-serv、vt-serv4 

      DataNode节点:vt-serv1、vt-serv2、vt-serv3 

      Journalnode节点:vt-serv1、vt-serv2、vt-serv3 

      Zookeeper服务器:vt-serv1、vt-serv2、vt-serv3

      mysql数据库:vt-serv  

      Hive数据仓库:vt-serv4

       注:这5台服务器已经配置好了JDK1.8、Zookeeper、mysql-5.6等必备工具及基本环境,这些基础配置以及Hive在这里不作介绍!

    2、在每台服务器上创建共同的账号:hadoop ;以及工作组:bigdata

    #添加工作组
    $ groupadd bigdata
    #添加用户到指定工作组
    $ useradd -g bigdata hadoop 
    

    3、配置hadoop账户在服务器之间进行免密登录

    ① 在各服务器上生成密钥

    #在hadoop用户下生成密钥
    $ ssh-keygen -t rsa
    

    ② 将每一台服务器生成的密钥整合到同一台服务器(每一台服务器上执行)

    #整合密钥
    $ ssh-copy-id vt-serv
    

    ③ 将整合成功的密钥分发到其它几台服务器

    #分发密钥
    scp ~/.ssh/authorized_keys vt-serv1:~/.ssh/
    scp ~/.ssh/authorized_keys vt-serv2:~/.ssh/
    scp ~/.ssh/authorized_keys vt-serv3:~/.ssh/
    scp ~/.ssh/authorized_keys vt-serv4:~/.ssh/
    

    ④ 修改authorized_keys权限(只允许自己可以读写,权限过大系统会拒绝远程登录;同样每一台服务器都执行)

    #修改权限
    $ chmod 500 ~/.ssh/authorized_keys
    

    ⑤ 测试远程登录(任意服务器之间进行登录操作验证,如果能直接登录到对方服务器就表示配置OK!)

    #vt-serv上验证免密登录 
    $ ssh vt-serv4
    

    二、HA高可用集群搭建

    1、准备好hadoop安装包

    我这是用的是hadoop-2.7.6.tar.gz 官网提供

    2、创建hadoop工作目录

    #创建目录
    $ mkdir -p /opt/bigdata/HA
    $ mkdir -p /opt/data/HA/
    

    3、解压安装包

    #解压包到工作目录
    $ tar -zxf hadoop-2.7.6.tar.gz /opt/bigdata/
    

    4、配置core-site.xml文件

    ####core-site.xml begin#####
    <configuration>
        <!-- 指定hadoop运行时临时目录位置 -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/bigdata/HA/tmp</value>
        </property>
        <!-- 把两个NameNode)的地址组装成一个集群mycluster,需要和hdfs-site.xml一致 -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://mycluster</value>
        </property>
        <!-- Zookeeper集群 -->
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>vt-serv1:2181,vt-serv2:2181,vt-serv3:2181</value>
        </property>
    </configuration>
    ####core-site.xml end#####
    

    5、配置hdfs-site.xml文件

    ####hdfs-site.xml begin#####
    <configuration>
        <!-- 完全分布式集群名称 -->
        <property>
            <name>dfs.nameservices</name>
            <value>mycluster</value>
        </property>
        <!-- 集群中NameNode节点都有哪些 -->
        <property>
            <name>dfs.ha.namenodes.mycluster</name>
            <value>nn1,nn2</value>
        </property>
        <!-- nn1的RPC通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.mycluster.nn1</name>
            <value>vt-serv:9000</value>
        </property>
        <!-- nn2的RPC通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.mycluster.nn2</name>
            <value>vt-serv4:9000</value>
        </property>
        <!-- nn1的http通信地址 -->
        <property>
            <name>dfs.namenode.http-address.mycluster.nn1</name>
            <value>vt-serv:50070</value>
        </property>
        <!-- nn2的http通信地址 -->
        <property>
            <name>dfs.namenode.http-address.mycluster.nn2</name>
            <value>vt-serv4:50070</value>
        </property>
        <!-- 指定NameNode元数据在JournalNode上的存放位置(单数) -->
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://vt-serv1:8485;vt-serv2:8485;vt-serv3:8485/mycluster</value>
        </property>	
        <!-- 声明journalnode服务器存储目录-->
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/opt/data/HA/journal</value>
        </property>
        <!-- namenode文件路径 -->
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>/opt/data/HA/name</value>
        </property>
        <!-- datanode文件路径 -->
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>/opt/data/HA/data</value>
        </property>
        <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>
                sshfence
                shell(/bin/true)
            </value>
        </property>
        <!-- 使用隔离机制时需要ssh无秘钥登录-->
        <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/home/hadoop/.ssh/id_rsa</value>
        </property>
    <!-- 关闭权限检查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 开启故障自动转移 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
    <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> </configuration> ####hdfs-site.xml end#####

    6、编辑slaves 加入数据节点服务器名

    #编辑slaves文件
    $ vi /opt/bigdata/HA/hadoop-2.7.6/etc/hadoop/slaves
    #加入我的数据节点服务器名称
       vt-serv1
       vt-serv2
       vt-serv3
    

    7、将配置好的hadoop分发到各台服务器相同目录

    #文件分发
    $ scp -r /opt/bigdata/HA/hadoop-2.7.6/  vm-serv2:/opt/bigdata/HA/
    

    8、启动JournalNode(我的JournalNode配置的分别是vt-serv1 、vt-serv2、vt-serv3三台服务器,分别去启动)

    $ hadoop-daemon.sh start journalnode
    

    9、在nn1格式化namenode

    #格式化namenode这是关键的一步
    $ hdfs namenode -format
    

    10、在nn1启动namenode

    $ hadoop-daemon.sh start namenode
    

    11、在nn2同步namenode

    $ hdfs namenode -bootstrapStandby
    

    12、格式zookeeper zkfc数据(需要先保证Zookeeper是正常启动)

    $ hdfs zkfc -formatZK
    

    13、启动HDFS HA集群(在哪台namenode启动,则作为active)

    $ start-dfs.sh
    

    14、验证(停止 actived 那台服务器的 namenode)

    $ hadoop-daemon.sh stop namenode
    

     正常情况下集群会把另一台namenode的standby状态自动切换为active状态 至此Hadoop-HA高可用集群配置完毕!

    15、配置本地虚拟域名(路径:C:WindowsSystem32driversetchosts)加入自己的虚拟域名

    #加入我的namenode服务器的虚拟域名
    192.168.56.10  vt-serv
    192.168.56.14  vt-serv4
    

     

    16、访问http://vt-serv:50070

      Datanodes页面可以看到我的三台数据节点服务器已经加入服务

    17、在Hadoop上创建目录 

    #创建目录
    $ hdfs  dfs  -mkdir  /tmp
    

      

     18、附上我的Hadoop-HA集群启动脚本代码

     1 #!/bin/sh
     2 
     3 # 1.声明需要操作的服务器
     4 zkservs=("vt-serv1" "vt-serv2" "vt-serv3")
     5 hadoopServs=("vt-serv" "vt-serv1" "vt-serv2" "vt-serv3" "vt-serv4")
     6 namenode="vt-serv"
     7 
     8 # 2.循环执行启动Zookeeper命令
     9 echo -e "33[34m ===============启动Zookeeper===============33[0m"
    10 for zkserv in ${zkservs[@]}
    11 do
    12   ssh $zkserv 'zkServer.sh start'
    13 done
    14 
    15 # 3.检查Zookeeper状态
    16 echo -e "33[34m =============== 检查Zookeeper状态 ===============33[0m"
    17 for zkserv in ${zkservs[@]}
    18 do
    19   echo -e "33[34m =============== ZK-$zkserv 状态 ===============33[0m"
    20   ssh $zkserv 'zkServer.sh status'
    21 done
    22 
    23 # 4.启动start-dfs.sh
    24 echo -e "33[34m =============== 启动Hadoop-HA ===============33[0m"
    25 ssh $namenode 'start-dfs.sh'
    26 
    27 # 5.检查HDFS是否启动成功
    28 echo -e "33[34m =============== 检查Hadoop状态 ===============33[0m"
    29 for hdserv in ${hadoopServs[@]}
    30 do
    31   echo -e "===============Hadoop-$hdserv 进程 ==============="
    32   ssh $hdserv 'jps'
    33 done
    34 # 6.Hadoop-HA集群启动完成
    35 echo -e "33[34m =============== Hadoop-HA集群启动完成 ===============33[0m"
  • 相关阅读:
    SpringBoot:Web开发
    java @Value注解 和 @Data注解
    携程 Apollo 配置中心传统 .NET 项目集成实践
    Spring Boot 整合 JPA 使用多个数据源
    ibatis 核心原理解析!
    Spring Boot 面试,一个问题就干趴下了!
    在Docker中部署Spring Boot项目
    REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    超全详解Java开发环境搭建
    SpringBoot入门(一):从HelloWorld开始
  • 原文地址:https://www.cnblogs.com/mrfo/p/10277210.html
Copyright © 2011-2022 走看看