Hadoop+Zookeeper HA集群搭建

一、服务器

三个节点的虚拟机(master1、master2、slave)

  • IP地址:
    192.168.199.121
    192.168.199.122
    192.168.199.123

  • 配置第一台(192.168.199.121)虚拟机网卡:

    [root@master1 ~] vi /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=192.168.199.121
    NETMASK=255.255.255.0
    GATEWAY=192.168.199.2
    DNS1=114.114.114.114
    DNS2=192.168.199.2
    
  • 修改主机名
    以192.168.199.121服务器为例:
    在master1上分别执行如下命令:
    [root@master1 ~]# vi /etc/sysconfig/network

    NETWORKING=yes
    HOSTNAME=hadoop01
    
  • 关闭防火墙

    [root@master1 ~]#  service iptables stop
    [root@master1 ~]#  chkconfig iptables off
    
  • 安装ssh与时间同步客户端
    [root@master1 ~]# yum install -y openssh-clients
    [root@master1 ~]# yum install ntp
    配置自动时钟同步
    该项同时需要在所有节点配置
    使用Linux命令配置
    [root@master1~]# crontab -e
    该命令是vi编辑命令,按i进入插入模式,按Esc,然后键入:wq保存退出
    键入下面的一行代码,输入i,进入插入模式(星号之间和前后都有空格)
    0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org
    每小时(第0分钟)同步一次时间
    手动同步时间
    直接在Terminal运行下面的命令:
    [root@master1~]# /usr/sbin/ntpdate cn.pool.ntp.org

  • jdk安装
    把文件上传到linux
    解压文件到安装目录:
    [root@master1 ~]# tar -zxvf /root/jdk-8u102-linux-x64.tar.gz -C /usr/local/
    配置环境变量
    [root@master1 ~]# vi /etc/profile

    export JAVA_HOME=/usr/local/jdk1.8.0_102
    export PATH=$PATH:$JAVA_HOME/bin
    

    配置文件生效:
    [root@master1 ~]# source /etc/profile

  • 克隆(得到另外两部虚拟机)

  • 配置第二台虚拟机(master2)
    网络配置:
    [root@master1 ~]# vi /etc/udev/rules.d/70-persistent-net.rules

    # PCI device 0x8086:0x100f (e1000)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ab:a6:61", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    
    PCI device 0x8086:0x100f (e1000)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ab:a6:61", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
    

    删除eth0,将eth1修改为eth0
    配置网卡:
    [root@master1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=192.168.199.121*************修改wei192.168.199.122
    NETMASK=255.255.255.0
    GATEWAY=192.168.199.2
    DNS1=114.114.114.114
    DNS2=192.168.199.2
    

    修改主机名
    [root@master1 ~]# vi /etc/sysconfig/network

    NETWORKING=yes
    HOSTNAME=master2
    

    修改网卡,使网卡生效:
    [root@master2 ~]# reboot

  • 第三台(slave)按照上面重新操作一遍(操作8)

  • hosts映射:(三台都需要修改)
    修改host文件
    windows路径:C:\Windows\System32\drivers\etc
    linux:
    [root@hadoop01 hadoop]# vi /etc/hosts
    增加

    192.168.199.121 master1
    192.168.199.122 master2
    192.168.199.123 slave
    

二、 免密登陆

1.登陆master1 输入命令:
[root@master1 ~]# cd .ssh
进入rsa公钥私钥文件存放的目录,删除目录下的id_rsa,id_rsa.pub文件(删除现有的公钥私钥,新搭建的虚拟机忽略)

  • 在每台机上产生新的rsa公钥私钥文件,并统一拷贝到一个authorized_keys文件中
    1)登录master1,在.ssh目录下输入命令:
    [root@master1 ~]# ssh-keygen -t rsa
    三次回车后,/root/.ssh目录下将会产生id_rsa,id_rsa.pub文件。其他主机也使用该方式产生密钥文件
    [root@master2 ~]# ssh-keygen -t rsa
    [root@slave ~]# ssh-keygen -t rsa
    2)再次登录master1,输入命令:
    [root@master1 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    将id_rsa.pub公钥内容拷贝到authorized_keys文件中
    3)登录其他主机,将其他主机的公钥文件内容都拷贝到master1主机上的authorized_keys文件中,命令如下:
    登录master2,将公钥拷贝到master1中
    [root@master2 ~]# ssh-keygen -t rsa
    [root@master2 ~]# scp /root/.ssh/id_rsa.pub master2:/root/.ssh/id_rsa.pub02
    登录slave,将公钥拷贝到master1中
    [root@slave ~]# ssh-keygen -t rsa
    [root@slave ~]# scp /root/.ssh/id_rsa.pub master1:/root/.ssh/id_rsa.pub03
    3.登录master1节点,组合所有公钥
    [root@master1 ~]# cat ~/.ssh/id_rsa.pub02 >> ~/.ssh/authorized_keys
    [root@master1 ~]# cat ~/.ssh/id_rsa.pub03 >> ~/.ssh/authorized_keys

  • 授权authorized_keys文件
    登录master1,在.ssh目录下输入命令:
    [root@master1 ~]# chmod 600 authorized_keys
    [root@master1 ~]# chmod 700 ~/.ssh

  • 将授权文件分配到其他主机上
    登录master1,将授权文件拷贝到master、slave…,命令如下:
    [root@master1 ~]# scp /root/.ssh/authorized_keys hadoop02:/root/.ssh/
    …拷贝到hadoop02上
    [root@master1 ~]# scp /root/.ssh/authorized_keys hadoop03:/root/.ssh/
    …拷贝到hadoop03上

  • 删除发到hadoop01上的公钥
    [root@master1 ~]# rm -rf /root/.ssh/id_rsa.pub0*

  • 测试

    [root@master1 ~]# ssh master1
    [root@master1 ~]# ssh master2
    [root@master1 ~]# ssh slave
    其他两台同理

三、安装Zookeeper

注:以下所有安装默认是在hadoop001上执行!

  • 解压并移动软件包(在所有节点执行)
    将zookeeper-3.4.6.tar.gz 上传到root目录下并解压缩
    [root@master1 ~]# tar -zxvf /root/zookeeper-3.4.6.tar.gz -C /usr/local/
  • 修改配置文件
    修改Zookeeper配置文件/usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg重名为zoo.cfg,进入到conf目录下,执行:
    [root@master1 conf]# cp zoo_sample.cfg zoo.cfg
    执行[root@master1 conf]# vi zoo.cfg修改zoo.cfg,修改或添加如下内容
    dataDir=/tmp/zk/data
    dataLogDir=/tmp/zk/dataLog
    server.1=master1:2888:3888
    server.2=master2:2888:3888
    server.3=slave:2888:3888
    
  • 创建相关目录
    创建/tmp/zk/data目录,并在此目录下创建myid文件
    [root@master1 conf]# mkdir /tmp/zk/dataLog
    [root@master1 conf]# mkdir /tmp/zk/data
    [root@master1 conf]# cd /tmp/zk/data
    [root@master1 conf]# vi myid
    
    在文件中写入数字 1
  • 修改环境变量
    [root@master1 ~]# vi /etc/profile
    export JAVA_HOME=/usr/local/jdk1.8.0_102
    export PATH=$PATH:$JAVA_HOME/bin
    export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
    export HADOOP_HOME=/usr/local/hadoop-2.7.3
    export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
    
  • 分发zookeeper软件包、tmp文件与环境变量
    [root@master1 ~]# scp -r /root/usr/zookeeper-3.4.6 master2:/usr/local/
    [root@master1 ~]# scp -r /root/usr/zookeeper-3.4.6 slave:/usr/local/
    [root@master1 ~]# scp -r /tmp/zk master2:/tmp
    [root@master1 ~]# scp -r /tmp/zk slave:/tmp
    [root@master1 ~]# scp -r /etc/profile master2:/etc
    [root@master1 ~]# scp -r /etc/profile slave:/etc
  • 修改master2与slave的myid文件
    [root@master1 ~]# ssh master2
    [root@master2 ~]# vi /tmp/zk/data/myid
    在文件中写入数字 2
    [root@master2 ~]# ssh slave
    [root@slave ~]# vi /tmp/zk/data/myid
    在文件中写入数字 3
    注:重新登录终端环境变量生效
  • 启动Zookeeper
    三台上都执行
    [root@master1 ~]# bin/zkServer.sh start
    [root@master2 ~]# bin/zkServer.sh start
    [root@slave ~]# bin/zkServer.sh start
    查看进程QuorumPeerMain是否启动:jps
    检查状态
    [root@master1 ~]# bin/zkServer.sh status
    [root@master2 ~]# bin/zkServer.sh status
    [root@slave ~]# bin/zkServer.sh status

四、安装Hadoop

  • 解压并移动软件包(在所有节点执行)
    将zookeeper-3.4.6.tar.gz 上传到root目录下并解压缩
    [root@master1 ~]# tar -zxvf /root/hadoop-2.7.3.tar.gz -C /usr/local

  • 修改配置文件
    进入到Hadoop目录下 /etc/hadoop/(进入到路径)
    [root@master1 ~]# cd /usr/local/hadoop-2.7.3/etc/hadoop/
    1.修改hadoop-env.sh文件
    [root@master1 hadoop]# vi hadoop-env.sh
    修改为:

    #The java implementation to use.
    export JAVA_HOME=/usr/local/jdk1.8.0_102
    

    [root@master1 hadoop]# vi yarn-env.sh
    修改为:

    # some Java parameters 
    export JAVA_HOME=/usr/local/jdk1.8.0_102
    

    2.修改 core-site.xml文件
    [root@master1 hadoop]# vi core-site.xml

    <configuration>
     <property>
    <!--连接hdfs的通讯地址#beh别名-->
          <name>fs.defaultFS</name>
         	 <value>hdfs://beh</value>
              	<final>false</final>
                	</property>
    <property>
    <!--存放namenode与datanode临时文件目录(手动创建/root/cxy)-->
      	<name>hadoop.tmp.dir</name>
         	 <value>/home/cxy/hadoopdata</value>
         	     <final>false</final>
           	     </property>
      <property>
      <!--zookeeper集群-->
       <name>ha.zookeeper.quorum</name>
        	  <value>master1:2181,master2:2181,slave:2181</value>
           	   <final>false</final>
            	    </property>
    </configuration>
    
    1. 修改hdfs-site.xml文件
      [root@master1 hadoop]# vi hdfs-site.xml
    <configuration>
     <property>
      <!--HDFS NN的逻辑名称,可以随便设置 -->
       <name>dfs.nameservices</name>
     	   <value>beh</value>
         	   <final>false</final>
           	   </property>
     <property>
      <!-- 给定服务逻辑名称beh的节点列表 -->
       <name>dfs.ha.namenodes.beh</name>
    	    <value>nn1,nn2</value>
    	        <final>false</final>
    	          </property>
      <property>
        <!--beh中nn1节点对外服务的RPC地址-->
        <name>dfs.namenode.rpc-address.beh.nn1</name>
          <value>master1:9000</value>
    	        <final>false</final>
    	          </property>
     <property>
     <!--beh中nn1节点对外服务的http地址-->
      <name>dfs.namenode.http-address.beh.nn1</name>
        <value>master1:50070</value>
            <final>false</final>
              </property>
      <property>
          <name>dfs.namenode.rpc-address.beh.nn2</name>
     	     <value>master2:9000</value>
                  <final>false</final>
         	       </property>
    
      <property>
     	 <name>dfs.namenode.http-address.beh.nn2</name>
        	  <value>master2:50070</value>
          	    <final>false</final>
          	      </property>
      <property>
      <!-- 设置一组 journalNode 的 URI 地址,active NN 将 edit log 写入这些JournalNode,而 standby NameNode 读取这些 editlog,并作用在内存中的目录树中。如果journalNode有多>个节点则使用分号分割。该属性值应符合以下格式qjournal://host1:port1;host2:port2;host3:port3/journalId-->
     <name>dfs.namenode.shared.edits.dir</name>
        	<value>qjournal://master1:8485;master2:8485;slave:8485/beh</value>
       	     <final>false</final>
           	   </property>
     <property>
        <!--启动自动failover(故障切换)-->
      <name>dfs.ha.automatic-failover.enabled.beh</name>
           <value>true</value>
     	       <final>false</final>
                  </property>
    
      <property>
    <!--配置失败自动切换方式-->
      <!--客户端与 active NameNode 进行交互的 Java 实现类,DFS 客户端通过该类寻找当前的active NN ,确定active 节点是否活跃-->
        <name>dfs.client.failover.proxy.provider.beh</name>        	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      	      <final>false</final>
         	     </property>
     <property>
      <!--JournalNode 所在节点上的一个目录(手动创建目录/root/cxy),用于存放 editlog 和其他状态信息-->
    	<name>dfs.journalnode.edits.dir</name>
      	  <value>/home/cxy/metadata/journal</value>
                <final>false</final>
        	      </property>
      <property>
        <!--配置隔离机制-->
        <name>dfs.ha.fencing.methods</name>
           <value>sshfence</value>
    	        <final>false</final>
    	          </property>
      <property>
       <!--指定ssh通讯使用的密钥-->
      <name>dfs.ha.fencing.ssh.private-key-files</name>
     	   <value>/root/.ssh/id_rsa</value>
      	      <final>true</final>
     	         </property>
      <property>
      <!--副本数,从节点个数-->
    	  <name>dfs.replication</name>
    	      <value>1</value>
    	          <final>false</final>
     	           </property>
    </configuration>
    
    1. 修改mapred-site.xml文件
      [root@master1 hadoop]# vi mapred-site.xml
    <configuration>
    <property>
     <name>mapreduce.framework.name</name>
    	    <value>yarn</value>
    		</property>
    <property>
         <!--设置可查看历史任务-->
        <name>mapreduce.jobhistory.address</name>
    	    <value>slave:10020</value>
         </property>
    <property>
     	   <!--设置可查看历史任务-->
       <name>mapreduce.jobhistory.webapp.address</name>
    	    <value>slave:19888</value>
    	    </property>
    <property>
    <!--正在运行的Hadoop作业记录-->
      <name>yarn.app.mapreduce.am.staging-dir</name>
            <value>/home/cxy/metadata/hadoop-yarn/staging</value>
           </property>
    </configuration>
    
    
    1. 修改yarn-site.xml文件
      [root@master1 hadoop]# vi yarn-site.xml
    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        </property>
        <property>
            <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
            	    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
           	     </property>
           	     <property>
            	    <!--中间结果存放位置-->
     <name>yarn.nodemanager.local-dirs</name>
         <value>/home/cxy/metadata/yarn</value>
    	    </property>
      	  <property>
        	    <name>yarn.nodemanager.log-dirs</name>
                    <value>/home/cxy/logs/yarn/userlogs</value>
           	     </property>
           	     <property>
         	       <!--是否启用日志聚合功能,日志聚合开启后保存到HDFS上-->
     <name>yarn.log-aggregation-enable</name>
    	    <value>true</value>
            </property>
            <property>
                <description>Where to aggregate logs</description>
                <!--当应用程序运行结束后,日志被转移到的HDFS目录-->
        <name>yarn.nodemanager.remote-app-log-dir</name>
            <value>hdfs://beh/var/log/hadoop-yarn/apps</value>
            </property>
    <!-- Resource Manager Configs -->
    <property>
    <!--rm失联后重新链接的时间-->
        <name>yarn.resourcemanager.connect.retry-interval.ms</name>
            <value>2000</value>
            </property>
            <property>
            <!--开启resourcemanagerHA,默认为false-->
        <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
            </property>
            <property>
            <!--开启故障自动切换-->
        <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
            <value>true</value>
            </property>
            <property>
                <name>yarn.resourcemanager.cluster-id</name>
                    <value>beh</value>
                    </property>
                    <property>
                        <name>yarn.resourcemanager.ha.rm-ids</name>
                            <value>rm1,rm2</value>
                            </property>
    
      <!--RM1 RM2 is different-->
    <property>
        <name>yarn.resourcemanager.ha.id</name>
            <value>rm1</value>
            </property>
            <property>
                <name>yarn.resourcemanager.scheduler.class</name>
                    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
                    </property>
                    <property>
                    <!--开启自动恢复功能-->
        <name>yarn.resourcemanager.recovery.enabled</name>
            <value>true</value>
            </property>
    	<property>
                <name>yarn.resourcemanager.store.class</name>
                    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
                    </property>
                    <property>
                    <!--配置与zookeeper的连接地址-->
        <name>yarn.resourcemanager.zk.state-store.address</name>
            <value>master1:2181,master2:2181,slave:2181</value>
            </property>
            <property>
            <!--schelduler失联等待连接时间-->
        <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
            <value>5000</value>
            </property>
    <!-- 配置 RM1 configs -->
    <property>
        <name>yarn.resourcemanager.address.rm1</name>
            <value>master1:23140</value>
            </property>
            <property>
                <name>yarn.resourcemanager.scheduler.address.rm1</name>
                    <value>master1:23130</value>
                    </property>
                    <property>
                        <name>yarn.resourcemanager.webapp.https.address.rm1</name>
                            <value>master1:23189</value>
                            </property>
                            <property>
                                <name>yarn.resourcemanager.webapp.address.rm1</name>
                                    <value>master1:23188</value>
                                    </property>
                                    <property>
                                        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
                                            <value>master1:23125</value>
                                            </property>
                                            <property>
                                                <name>yarn.resourcemanager.admin.address.rm1</name>
                                                    <value>master1:23141</value>
                                                    </property>
    	<!-- 配置 RM2 configs -->
    <property>
        <name>yarn.resourcemanager.address.rm2</name>
            <value>master2:23140</value>
            </property>
            <property>
                <name>yarn.resourcemanager.scheduler.address.rm2</name>
                    <value>master2:23130</value>
                    </property>
                    <property>
                    <name>yarn.resourcemanager.webapp.https.address.rm2</name>
                       <value>master2:23189</value>
                       </property>
                       <property>
                           <name>yarn.resourcemanager.webapp.address.rm2</name>
                               <value>master2:23188</value>
                               </property>
                               <property>
                                   <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
                                       <value>master2:23125</value>
                                       </property>
                                       <property>
                                           <name>yarn.resourcemanager.admin.address.rm2</name>
                                               <value>master2:23141</value>
                                               </property>
                                               <!-- Node Manager Configs -->
    <property>
        <name>mapreduce.shuffle.port</name>
            <value>23080</value>
            </property>
            <property>
                <name>yarn.resourcemanager.zk-address</name>
                    <value>master1:2181,master2:2181,slave:2181</value>
                    </property>
    </configuration>
    

    以上四个配置文件也可以配置好后上传到linux然后再cp到/usr/local/hadoop-2.7.3/etc/hadoop/
    [root@master1 ~]# cp /root/haconfigs/*.xml /usr/local/hadoop-2.7.3/etc/hadoop/
    y+回车,y+回车,y+回车,y+回车;

  • 修改slaves(从节点主机名文件)
    [root@slave ~]# vi slaves
    更改为slave

  • 复制Hadoop环境到其他主机 在命令行分别输入如下命令
    创建文件目录:mkdir /root/cxy
    [root@master1 ~]# scp -r /usr/local/hadoop-2.7.3 master2:/usr/local
    [root@master1 ~]# scp -r /usr/local/hadoop-2.7.3 slave:/usr/local
    [root@master1 ~]# scp -r /root/cxy master2:/root/
    [root@master1 ~]# scp -r /root/cxy slave:/root/

  • 修改master2主机下的yarn-site.xml
    修改为:

    <property>
    	<name>yarn.resourcemanager.ha.id</name>
    	<value>rm2</value>
    </property>
    

五、启动

  • 启动journalnode(进程名:JournalNode 全部虚拟机都需运行
    [root@master1 ~]# hadoop-daemon.sh start journalnode
    [root@master2 ~]# hadoop-daemon.sh start journalnode
    [root@slave ~]# hadoop-daemon.sh start journalnode

  • 格式化zookeeper,在master1上执行
    [root@slave ~]# hdfs zkfc -formatZK

  • 对master1节点进行格式化和启动启动namenode(进程名:NameNode):
    [root@master1 ~]# hdfs namenode -format
    [root@master1 ~]# hadoop-daemon.sh start namenode

  • 对master2节点进行格式化和启动
    [root@master2 ~]# hdfs namenode -bootstrapStandby
    [root@master2 ~]# hadoop-daemon.sh start namenode

  • 在hadoop1和hadoop2上启动zkfc服务(zkfc服务进程名:DFSZKFailoverController):此时hadoop1和hadoop2就会有一个节点变为active状态
    [root@master1 ~]# hadoop-daemon.sh start zkfc
    [root@master2 ~]# hadoop-daemon.sh start zkfc

  • 启动datanode(进程名:DataNode):在master1上执行
    [root@master1 ~]# hadoop-daemons.sh start datanode

  • 验证是否成功
    打开浏览器,访问 master1:50070 以及 master2:50070,你将会看到两个namenode一个是active而另一个是standby。
    然后kill掉其中active的namenode进程,另一个standby的naemnode将会自动转换为active状态
    在这里插入图片描述
    在这里插入图片描述

  • 启动yarn
    在master1上启动(此脚本将会启动master1上的resourcemanager及所有的nodemanager)
    [root@master1 ~]# start-yarn.sh
    在master2上启动resourcemanager
    [root@master2 ~]# yarn-daemon.sh start resourcemanager

  • 验证是否配置成功
    打开浏览器,访问master1:23188或者master2:23188,只有active的会打开如下界面,standby的那个不会看到页面
    然后kill掉active的resourcemanager另一个将会变为active的,说明resourcemanager HA是成功的
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值