阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Hadoop HA(高可用)环境的搭建

199次阅读
没有评论

共计 8794 个字符,预计需要花费 22 分钟才能阅读完成。

集群布局:

Hadoop HA(高可用)环境的搭建

集群描述:

集群中有两个 NameNode, 两个 ResourceManager。实现了 NameNode 的 HA 方案以及 ResourceManager 单点故障的解决。

Hadoop 的 HA 介绍:

hadoop2 中的 NameNode 有两个。每一个都有相同的职能。一个是 active 状态的,一个是 standby 状态的。当集群运行时,只有 active 状态的 NameNode 是正常工作的,standby 状态的 NameNode 是处于待命状态的,时刻同步 active 状态 NameNode 的数据。一旦 active 状态的 NameNode 不能工作,通过手工或者自动切换,standby 状态的 NameNode 就可以转变为 active 状态的,就可以继续工作了。这就是高可靠。

Linux 环境准备:

VMware Workstation 12 PRO 上 CentOS 7 Minimal 版安装配置  http://www.linuxidc.com/Linux/2017-03/141646.htm

网络配置:使用桥接方式

1. 设置固定 IP 地址和关闭防火墙

虚拟机中必须添加如下配置:(必须和宿主机在同一网段)

 在 vmware 的【编辑】-->【虚拟网络编辑器】设置:将网络连接方式设置为“桥接”, 并桥接到宿主机器的网卡(可以是有线或者无线网络 )。

设置静态 IP 地址:

vi /etc/sysconfig/network-scripts/ifcfg-eno16777736  
("eno16777736" 这部分名字在不同版本中可能不一样)

修改(添加)如下内容:

BOOTPROTO="static"#dhcp 改为 static   
ONBOOT="yes"# 开机启用本配置  
IPADDR=192.168.1.181# 静态 IP  
GATEWAY=192.168.1.1   #默认网关  
NETMASK=255.255.255.0  #子网掩码  
DNS1=192.168.1.1#DNS 配置  

总体示例:

cat /etc/sysconfig/network-scripts/ifcfg-eno16777736 
HWADDR="00:15:5D:07:F1:02"  
TYPE="Ethernet"  
BOOTPROTO="static" #dhcp 改为 static   
DEFROUTE="yes"  
PEERDNS="yes"  
PEERROUTES="yes"  
IPV4_FAILURE_FATAL="no"  
IPV6INIT="yes"  
IPV6_AUTOCONF="yes"  
IPV6_DEFROUTE="yes"  
IPV6_PEERDNS="yes"  
IPV6_PEERROUTES="yes"  
IPV6_FAILURE_FATAL="no"  
NAME="eth0"  
UUID="bb3a302d-dc46-461a-881e-d46cafd0eb71"  
ONBOOT="yes"  #开机启用本配置  
IPADDR=192.168.1.181    #静态 IP  
GATEWAY=192.168.1.1     #默认网关  
NETMASK=255.255.255.0   #子网掩码  
DNS1=192.168.1.1        #DNS 配置  

修改每台主机的主机名:

vi /etc/sysconfig/network

添加如下内容:

HOSTNAME=master01   //master02,master03........

设置 IP 绑定:

vi  /etc/hosts
master01  192.168.1.181 
master02  192.168.1.182 
master03  192.168.1.186 
master04  192.168.1.187 
slave01   192.168.1.183 
slave02   192.168.1.184  
slave03   192.168.1.185

重启网卡:

service network restart 

centos7 中 mini 安装的防火墙默认为 firewalld:

systemctl stop firewalld
systemctl mask firewalld

安装 iptables-services 并关闭防火墙:

yum install iptables-services
service iptables stop
chkconfig iptables off   #关闭防火墙开机启动
service ip6tables stop
chkconfig ip6tables off

关闭 selinux:

vi /etc/sysconfig/selinux
SELINUX=enforcing -> SELINUX=disabled
setenforce 0
getenforce

2. 添加 hadoop 用户

添加用户组:

root 登录条件下:groupadd hadoop

添加用户并分配用户组:

useradd -g hadoop hadoop

修改密码:

passwd hadoop

3. SSH 开机免密码登录:

安装 ssh:

yum intsall openssh-server

首先是 root 用户免密码登录:

root 用户登陆后在每台主机上面使用命令:

 ssh-keygen -t rsa
 cd /root/.ssh/ 

里面有两个文件:

id_rsa.pub    id_rsa

在 master01 主机上面:

mv id_rsa.pub authorized_keys

然后把所有主机里面的 id_rsa.pub 内容全部保存到这个 authorized_keys 后把 authorized_keys 复制到各个节点上。

Hadoop 用户 ssh 免密码登录同 root 用户:

 注意:这时 id_rsa.pub id_rsa 的目录为你 hadoop 用户下的.ssh 目录

4. 安装所需的软件

所用的软件环境配置示例:

export JAVA_HOME=/usr/local/software/jdk1.8.0_66
export HADOOP_HOME=/usr/local/software/hadoop-2.7.0
export ZOOKEEPER_HOME=/usr/local/software/zookeeper-3.4.6/bin
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

然后使环境配置生效:

source /etc/profile

5. Hadoop HA 实现

Hadoop HA 配置文件:// 总共 5 个:

hadoop-env.sh 
core-site.xml 
hdfs-site.xml 
mapred-site.xml 
yarn-site.xml

hadoop-env.sh:

export JAVA_HOME=/usr/local/software/jdk1.8.0_66

core-site.xml:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://cluster</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/usr/local/software/hadoop-2.7.0/tmp</value>
</property>
<property>
  <name>ha.zookeeper.quorum</name  <value>slave01:2181,slave02:2181,slave03:2181</value>
</property>

hdfs-site.xml

    <property>
            <name>dfs.nameservices</name>
            <value>cluster</value>
    </property>
    <property>
            <name>dfs.ha.namenodes.cluster</name>
            <value>nn1,nn2</value>
    </property>
    <property>
            <name>dfs.namenode.rpc-address.cluster.nn1</name>
            <value>master01:9000</value>
    </property>
    <property>
            <name>dfs.namenode.http-address.cluster.nn1</name>
            <value>master01:50070</value>
    </property>
    <property>
            <name>dfs.namenode.rpc-address.cluster.nn2</name>
            <value>master02:9000</value>
    </property>
    <property>
            <name>dfs.namenode.http-address.cluster.nn2</name>
            <value>master02:50070</value>
    </property>
    <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://slave01:8485;slave02:8485;slave03:8485/cluster</value>
    </property>
    <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/usr/local/software/hadoop-2.7.0/journal</value>
    </property>
    <property>
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
    </property>
    <property>
            <name>dfs.client.failover.proxy.provider.cluster</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>
    <property>
            <name>dfs.ha.fencing.ssh.connect-timeout</name>
            <value>30000</value>
    </property>
    <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    <property>
            <name>dfs.replication</name>
            <value>2</value>
    </property>

mapred-site.xml

    <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
    </property

yarn-site.xml

    <property>
           <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
    </property>
    <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>rm-cluster</value>
    </property>
    <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>rm1,rm2</value>
    </property>
    <property>
            <name>yarn.resourcemanager.hostname.rm1</name>
            <value>master01</value>
    </property>
    <property>
            <name>yarn.resourcemanager.hostname.rm2</name>
            <value>master02</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>
            <name>yarn.resourcemanager.zk-address</name>
            <value>slave01:2181,slave02:2181,slave03:2181</value>
    </property>
    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
    </property>

6. Zookeeper 集群配置 // slave01 slave02 slave0

vi /usr/local/software/zookeeper-3.4.6/conf/zoo.cfg

修改 dataDir=/usr/local/zk/data
在文件最后新增:

server.1=slave01:2888:3888
server.2=slave02:2888:3888
server.3=slave03:2888:3888

创建文件夹

mkdir /usr/local/software/zookeeper-3.4.6/zk/data

在 data 目录下,创建文件 myid,值为 1; 相应的在 slave02 和 slave03 上面创建文件 myid, 值为 2、3

7. 开始启动

启动 zookeeper

   bin/zkServer.sh start
   bin/zkServer.sh status   查看状态 (至少两个 zookeeper 实例开启后才可以查看状态)

首次启动顺序 (zookeeper 集群先启动)
启动 journalnode:

hadoop-daemon.sh start journalnode //slave01,slave02,slave03

格式化 NameNode:

hdfs namenode -format

拷贝格式化后的 namenode 状态:

scp -r tmp/   hadoop@master02:/usr/local/hadoop-2.6.0/  // 从 master01 拷贝 tmp 到 master02 

格式化 zookeeper:

hdfs zkfc -formatZK

启动 HDFS:

sbin/start-dfs.sh

启动 Yarn:

sbin/start-yarn.sh   //master01

启动 master02 主机上的 ResourceManager:

yarn-daemon.sh start resourcemanager//master02
sbin/start-dfs.sh
sbin/start-yarn.sh   //master01
yarn-daemon.sh start resourcemanager//master02

8. 启动后效果:

启动后 master02 是 active 状态

Hadoop HA(高可用)环境的搭建

master01 是 standby 状态。

Hadoop HA(高可用)环境的搭建

当 kill 掉 master02 进程后,master01 会自动变成 active 状态,从而保证集群的高可用性。

Hadoop HA(高可用)环境的搭建

同时 master03 上面的 ResourceManager 为 active 状态:

Hadoop HA(高可用)环境的搭建

当浏览 master04 上面 ResourceManager 时显示信息为:

“This is standby RM,Redirecting to the current active RM:http://master03:8088/”

Hadoop HA(高可用)环境的搭建

9. 为了方便集群管理,编写脚本控制:

启动脚本:

for i in slave01 slave02 slave03
do
ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start"
done
start-dfs.sh
ssh master03 "/usr/local/software/hadoop-2.7.0/sbin/start-yarn.sh"
ssh master04 "/usr/local/software/hadoop-2.7.0/sbin/yarn-daemon.sh start resourcemanager"

启动时日志:

Hadoop HA(高可用)环境的搭建

查看集群是否正常启动的脚本:

for i in master01 master02 master03 master04 slave01 slave02 slave03
do
ssh $i "hostname;source /etc/profile;jps"
done

Hadoop HA(高可用)环境的搭建

停止脚本:
[hadoop@master01 ~]$ cat stop

ssh master03 "/usr/local/software/hadoop-2.7.0/sbin/stop-yarn.sh"
stop-dfs.sh
for i in slave01 slave02 slave03
do
ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh stop"
done

Hadoop HA(高可用)环境的搭建

10. 安装过程中一些其他的操作:

shell 操作:主机间文件传输示例

for i in master02 slave01 slave02 slave03
do
 scp -rq software hadoop@$i:/usr/local/software/
done

for i in master02 slave01 slave02 slave03
do
 ssh $i  "source /etc/profile"
done

11. 注意事项:

1. hadoop 用户生成的秘钥在 /home/hadoop/.ssh 目录中,其他用户以此类推。
2. 问题:zookeeper 在 linux 服务器上,通过 java 代码来控制启动与停止。发现能控制停止,不能控制启动。

解决:

JAVA_HOME=/usr/local/java/jdk1.7.0_76
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH

3:采用 shell 脚本启动 zookeeper,首先新建文件 start.sh
写入内容(rh1 rh2 rh3 分别是主机名。此处需要 ssh):

#!/bin/sh
echo“start zkServer…”for i in rh1 rh2 rh3
do
ssh $i“/usr/local/zookeeper3.4/bin/zkServer.sh start”done

写好后保存,加上执行权限:chmod u+x start.sh
运行:./start.sh 看见启动成功了,有输出。但是输入 jps 查看的时候,会发现没有 QuorumPeerMain 进程。说明没有启动成功。

原因:

首先知道交互式 shell 和非交互式 shell、登录 shell 和非登录 shell 是有区别的
在登录 shell 里,环境信息需要读取 /etc/profile 和~ /.bash_profile, ~/.bash_login, and ~/.profile 按顺序最先的一个,并执行其中的命令。除非被 —noprofile 选项禁止了;在非登录 shell 里,环境信息只读取 /etc/bash.bashrc 和~/.bashrc
手工执行是属于登陆 shell,脚本执行数据非登陆 shell,而我的 Linux 环境配置中只对 /etc/profile 进行了 jdk1.6 等环境的配
置,所以脚本执行 /usr/local/zookeeper3.4/bin/zkServer.sh start 启动 zookeeper 失败了

解决方法:

把 profile 的配置信息 echo 到.bashrc 中 echo‘source /etc/profile’>~/.bashrc
在 /zookeeper/bin/zkEnv.sh 的中开始位置添加 export JAVA_HOME=/usr/local/jdk1.6(就像 hadoop 中对 hadoop-env.sh 的配置一样)
采用 shell 脚本启动 zookeeper,首先新建文件 start.sh
写入内容(rh1 rh2 rh3 分别是主机名。此处需要 ssh):#!/bin/sh
echo“start zkServer 就可以了。

总结的解决方法(下面 3 个方法任选 1):

1、脚本代码中添加“source /etc/profile;”改为:ssh crxy$i“source /etc/profile;/usr/local/zookeeper/bin/zkServer.sh start”

2、把 profile 的配置信息 echo 到.bashrc 中 echo‘source /etc/profile’>~/.bashrc

3、在 /zookeeper/bin/zkEnv.sh 的中开始位置添加 export JAVA_HOME=/usr/local/jdk1.7.0_45(就像 hadoop 中对 hadoop-env.sh 的配置一样)

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-03/141650.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计8794字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中