(12)Hadoop 2.6.1 集群部署---自动切换HA

1. 引言

      在上篇博客中介绍了Haddop的手动切换NameNode,这在生产环境中还是不尽人意,因为工作人员可能并不会及时的知道NameNode什么时候宕机?因此在生产环境中实现NameNode的动态切换是十分有必要的,在本篇博客中就主要介绍一下NameNode的动态切换,NameNode的动态切换需要借助于调度框架zookeeper。在本篇博客中博主使用五台干净的机器从零开始搭建Hadoop集群环境,下面就是我使用的环境:

  • 操作系统为:Centos6.7
  • jdk的版本为:1.7
  • jdk的安装路径为:/usr/local/jdk
  • hadoop的版本为:2.6.1
  • hadoop的安装路径为:/usr/local/hadoop
  • zookeeper的版本为:3.4.9
  • zookeeper的安装路径为:/usr/local/zookeeper
  • 使用root用户进行集群搭建

      接下来我将按照下表进行搭建Hadoop集群:

HOST名称ip地址运行的进程
hadoop1192.168.159.130NameNode,ResourceManger,JournalNode,QuorumPeerMain,DFSZKFailoverController
hadoop2192.168.159.131NameNode,JournalNode,QuorumPeerMain,DFSZKFailoverController
hadoop3192.168.159.132DataNode,NodeManger,JournalNode,QuorumPeerMain
hadoop4192.168.159.133DataNode,NodeManger
hadoop5192.168.159.134DataNode,NodeManger

注:JournalNode进程主要用于NameNode的数据同步。zookeeper的作用主要为:当NameNode宕机时,自动切换NameNode,保证NameNode的高可用。DFSZKFailoverController进程的作用时zookeeper的一个代理,实际上是DFSZKFailoverController实现切换NameNode的功能。搭建好的集群架构图如下图所示:

这里写图片描述

2.配置集群的hostnameIP映射

2.1 修改hostname

  • hadoop1机器上修改hostname
//编辑文件
vim /etc/sysconfig/network
//修改主机名是hadoop1,(注意hostname的大小写)
hostname hadoop1
//命令行下修改hostname
hostname hadoop1

这里写图片描述

  • 同理在hadoop2,hadoop3,hadoop4,hadoop5执行相同的命令,如下图所示

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

2.2 配置hostnameip的映射关系以及防火墙

      为了部署集群方便,因此我们建立了ip和主机名称的映射,过程如下:

  • 修改/etc/hosts文件
//编辑hosts文件
vim /etc/hosts
//建立ip和host的映射关系
192.168.159.130 hadoop1
192.168.159.131 hadoop2
192.168.159.132 hadoop3
192.168.159.133 hadoop4
192.168.159.134 hadoop5

这里写图片描述

  • 同理在hadoop2,hadoop3,hadoop4,hadoop5也要建立ip和host的映射关系,过程和hadoop1完全相同。

2.3 关闭防火墙

      在hadoop集群中会经常发生 机器和机器之间的交互,为了避免因为防火墙产生的意外故障,因此我们需要将防火墙关闭,过程如下:

//关闭防火墙
service iptables stop
//查看防火墙状态
service iptables status
//关闭防火墙的自动运行
chkconfig iptables off

3 .配置集群免密码登录

      ssh免密码登陆,由于要配置自动切换的HA,在SSH免密码登录的时候需要注意三点,第一:NameNode之间要相互可以免密码登录,第二NameNodeDataNode的免密码登录,第三:zookeeper实例之间要相互可以免密码登录,因此在设置之前,我们需要明白几点,如下:

  • hadoop1hadoop2之间互为NameNode,因此hadoop1hadoop2之间需要相互免密码登录
  • hadoop1hadoop2都是NameNode,因此需要设置hadoop1hadoop3,hadoop4,hadoop5的免密码登录,同理hadoop2也应该设置
  • hadoop1,hadoop2,hadoop3zookeeper集群实例,因此也需要设置相互之间的免密码登录。

  • 综上所述,需要执行的命令如下:

//hadoop1上需要执行的命令为:
ssh-keygen -t rsa
ssh-copy-id -i hadoop2
ssh-copy-id -i hadoop3
ssh-copy-id -i hadoop4
ssh-copy-id -i hadoop5

//hadoop2上需要执行的命令为:
ssh-keygen -t rsa
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop3
ssh-copy-id -i hadoop4
ssh-copy-id -i hadoop5

//hadoop3上需要执行的命令为:
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2

4.安装JDK

  • 解压jdk,并修改名称
//将jdk解压到/usr/local
tar -zxvf jdk-7u45-linux-x64.tar.gz -C /usr/local/
//进入到/usr/local
cd /usr/local
//修改文件夹的名称
mv jdk1.7.0_45 jdk
  • 修改环境变量
//修改配置文件
vim /etc/profile
//需要添加的内容
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

这里写图片描述

  • hadoop1jdk复制到其他节点
//将jdk复制到hadoop2,hadoop3,hadoop4,hadoop5
scp -r /usr/local/jdk hadoop2:/usr/local/
scp -r /usr/local/jdk hadoop3:/usr/local/
scp -r /usr/local/jdk hadoop4:/usr/local/
scp -r /usr/local/jdk hadoop5:/usr/local/
//将环境变量复制到hadoop2,hadoop3,hadoop4,hadoop5
scp /etc/profile hadoop2:/etc/profile
scp /etc/profile hadoop3:/etc/profile
scp /etc/profile hadoop4:/etc/profile
scp /etc/profile hadoop5:/etc/profile
  • 重新加载各个节点的环境变量
//分别在hadoop1,hadoop2,hadoop3,hadoop4,hadoop5执行下面命令(在五台机器上都执行)
source /etc/profile
  • 分别在五台机器上验证Java是否安装成功
//判断Java版本
java -version

这里写图片描述

5.搭建zookeeper集群

  • 解压zookeeper,并改名
//解压zookeeper安装包
tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/local/
//进入到/usr/local目录
cd /usr/local
//修改文件夹名称
mv zookeeper-3.4.9 zookeeper
  • 修改配置文件zoo.cfg
//将模板文件修改为配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
//zoo.cfg的内容修改为:
dataDir=/usr/local/zookeeper/data
clientPort=2181  
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888

这里写图片描述

  • 创建数据存储目录并标记
//创建数据存储目录
mkdir -p /usr/local/zookeeper/data
//将hadoop1标记为server.1
echo '1'>/usr/local/zookeeper/data/myid
  • 将zookeeper分发到hadoop2和hadoop3
//将zookeeper分发到hadoop2
scp -r /usr/local/zookeeper hadoop2:/usr/local  
//将zookeeper分发到hadoop3 
scp -r /usr/local/zookeeper hadoop3:/usr/local
  • 在hadoop2和hadoop3上打标记
//在hadoop2上执行,将hadoop2标记为server.2
echo '2'>/usr/local/zookeeper/data/myid
//在hadoop3上执行,将hadoop3标记为server.3
echo '3'>/usr/local/zookeeper/data/myid
  • 在三个节点分别启动zookeeper
bin/zkServer.sh start
  • 查看zookeeper是否启动成功
//进入zookeeper的命令行模式
zookeeper/bin/zkCli.sh
//查看刚刚安装成功的zookeeper的目录结构,此时可以看到只有一个目录为[zookeeper]
ls /

6 hadoop2.6.1的集群部署

6.1 安装hadoop集群

  • 将hadoop解压并且改名
//解压hadoop
tar -zxvf hadoop-2.6.1.tar.gz -C /usr/local/
//进入/usr/local目录
cd /usr/local
//将hadoop-2.6.1改名为hadoop
mv hadoop-2.6.1 hadoop
  • 修改配置文件hadoop-env.sh
//修改hadoop-env.sh配置文件
vim etc/hadoop/hadoop-env.sh
//修改jdk的环境变量
export JAVA_HOME=/usr/local/jdk

这里写图片描述

  • 修改配置文件core-site.xml
<!--
    fs.defaultFS
        因为要配置NameNode的HA,所以使用别名配置HDFS
        value:设置集群的别名,在这里我设置为hdfs://cluster1
    hadoop.tmp.dir
        代表hadoop的数据目录
        value:这个值最好和自己hadoop的安装目录对应,此处为/usr/local/hadoop/tmp
    ha.zookeeper.quorum
        代表zookeeper实例的地址
        value:此处要和我们配置的zookeeper集群对应,所以设置为hadoop1:2181,hadoop2:2181,hadoop3:2181
-->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>

这里写图片描述

  • 修改配置文件hdfs-site.xml
<!--
    dfs.replication
        代表数据副本的个数
        value:副本的个数不要多余datanode的个数,此处我设为3
    dfs.nameservices
        设置集群的命名空间,此处应和core-site的fs.defaultFS对应
        value:因为和fs.defaultFS对应,所以设置为cluster1
    dfs.ha.namenodes.cluster1:
        设置集群中有多少个NameNode,是设置NameNode的逻辑名,可以随便取,注意cluster1和nameservices的value对应
        value:在这里我设置为hadoopOne,hadoopTwo
    dfs.namenode.rpc-address.cluster1.hadoopOne
        设置逻辑名hadoopOne的NameNode的实际rpc部署位置
        value:hadoop1:9000
    dfs.namenode.http-address.cluster1.hadoopOne
        设置逻辑名hadoopOne的实例http端口位置
        value:hadoop1:50070
    dfs.namenode.rpc-address.cluster1.hadoopTwo
        设置逻辑名hadoopTwo的实例rpc端口位置
        value:hadoop2:9000
    dfs.namenode.http-address.cluster1.hadoopTwo
        设置逻辑名hadoopTwo的实例http端口位置
        value:hadoop2:50070
    dfs.ha.automatic-failover.enabled.cluster1
        设置Hadoop的切换是否为自动的?
        value:因为我们是手工切换,所以设置为true
    dfs.namenode.shared.edits.dir
        指定cluster1的两个NameNode共享edits文件目录时,使用的JournalNode集群信息,配置JournalNode信息
        value:我将JournalNode配置在hadoop1,hadoop2,hadoop3上面
    dfs.journalnode.edits.dir:
        指定JournalNode集群在对NameNode的目录进行共享时,自己存储数据的磁盘路径
        value:最好和自己hadoop的目录对应,此处我设置为/usr/local/hadoop/tmp/journal
    dfs.ha.fencing.methods
        NameNode切换的方式
        value:使用ssh进行切换,所以设置为sshfence
    dfs.ha.fencing.ssh.private-key-files
        使用ssh通信时用的密钥存储的位置
        value:这里需要设置自己当前用户的ssh密钥地址,因为我时root用户,所以使用/root/.ssh/id_rsa
    dfs.client.failover.proxy.provider.cluster1
        cluster1出故障时,哪个实现类负责执行故障切换
        value:默认使用org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

-->
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>hadoopOne,hadoopTwo</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoopOne</name>
<value>hadoop1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.hadoopOne</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoopTwo</name>
<value>hadoop2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.hadoopTwo</name>
<value>hadoop2:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.cluster1</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/cluster1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/journal</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>

这里写图片描述

  • 修改配置文件yarn-site.xml
<!--
    yarn.resourcemanager.hostname
        代表ResourceManger的安装地址
        value:我们将ResourceManger部署到hadoop1上面
    yarn.nodemanager.aux-services
        reducer取数据的方式
        value:方式是mapreduce_shuffle
-->
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

这里写图片描述

  • 修改配置文件mapred-site.xml
//首先修改模板文件为配置文件
mv mapred-site.xml.template mapred-site.xml
<!-- 通知框架MR使用YARN -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

这里写图片描述

  • 设置从节点的位置
//编辑slaves文件
vim slaves
//slaves的内容为:
hadoop3
hadoop4
hadoop5

这里写图片描述

  • 将hadoop分发到hadoop2,hadoop3,hadoop4,hadoop5
scp -rq /usr/local/hadoop hadoop2:/usr/local
scp -rq /usr/local/hadoop hadoop3:/usr/local
scp -rq /usr/local/hadoop hadoop4:/usr/local
scp -rq /usr/local/hadoop hadoop5:/usr/local
  • 格式化zookeeper集群
//在hadoop1上执行
hadoop/bin/hdfs zkfc -formatZK
//进入zookeeper实例
zookeeper/bin/zkCli.sh
//查看格式化后的zookeeper的目录
ls /

这里写图片描述

  • 启动journalnode集群
//分别在hadoop1,hadoop2,hadoop3上启动journalnode
hadoop/sbin/hadoop-daemon.sh start journalnode
  • 格式化NameNode并启动集群
//在Hadoop1上格式化集群
hadoop/bin/hdfs namenode -format
//在Hadoop1上启动NameNode
hadoop/sbin/hadoop-daemon.sh start namenode
//在hadoop2上格式化集群
hadoop/bin/hdfs namenode -bootstrapStandby
//在hadoop2上启动NameNode
hadoop/sbin/hadoop-daemon.sh start namenode
//启动DataNode(在hadoop1上执行)
hadoop/sbin/hadoop-daemons.sh start datanode
//启动ZKFC,ZKFC是zookeeper的一个代理,主要用于切换NameNode(在hadoop1和hadoop2上执行)
hadoop/sbin/hadoop-daemon.sh start zkfc
//启动resourcemanager和nodemanager(在hadoop1上执行)
hadoop/sbin/start-yarn.sh start resourcemanager

6.2 验证hadoop是否安装成功

  • 使用命令验证
//查看java进程
jps

这里写图片描述

这里写图片描述

  • 当我们在NameNode上杀死进程时,NameNode自动切换到hadoop2

这里写图片描述

6.2 总结

自动切换比手工切换多出来的步骤:

  • 配置上core-site.xml增加了配置项ha.zookeeper.quorumhdfs-site.xml中把dfs.ha.automatic-failover.enabled.cluster1改为true
  • 操作上格式化zk,执行命令bin/hdfs zkfc -formatZK,启动zkfc,执行命令sbin/hadoop-daemon.sh start zkfc
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值