我的大数据之路 --配置HA高可用Hadoop+ zookeeper

CentOS下载地址

  • 选择CentOS-7-x86_64-Minimal-1708.iso版本

  • 安装教程参考

  • 一个镜像安装三个CentOS虚拟机、三个账号都为root、密码***

  • 一个主机名为Master、一个为Slave1、一个为Slave2

  • 之后可以根据文件 /etc/hostname 更改

  • 完成登录之后如图:

  • 在这里插入图片描述

  • 在这里插入图片描述在这里插入图片描述

  • 登录成功后,设置静态IP
    |Master|IP |192.168.23.200
    |Slave1|IP |192.168.23.201
    |Slave2|IP |192.168.23.202
    1)使用root用户登录虚拟机,使用“ip addr”查看虚拟机网络,可以发现虚拟机还没有配置网络
    在这里插入图片描述
    2)开始配置虚拟机网络,点击VMbox顶部菜单栏“设备”——>“网络”——>“网络”,进入网络配置项。配置网络连接方式为“桥接网卡

在这里插入图片描述
3)使用命令“vim /etc/sysconfig/network-scripts/ifcfg-enp0s3”修改IP,不同虚拟机网络配置文件可以稍有不同,不一定都是ifcfg-enp0s3,具体看实际情况。具体配置如下图,其中红色方框部分为修改与添加部分。
在这里插入图片描述
4)完成配置后,使用“service network restart”命令重启网络,使用“ip addr”命令查看IP,使用“ping www.baidu.com”测试网络是否可用。如下图,完成网络配置。
在这里插入图片描述

5)使用“hostname”命令查看虚拟机当前主机名,使用“vi /etc/hostname”编辑修改虚拟机主机名。修改后使用命令“reboot”重启生效
在这里插入图片描述
6) 赋予普通用户hadoop、为其增加sudo权限
root用户下完成添加普通用户sudo权限的操作,为所有机器普通用户配置sudo
1、添加sudo文件写权限:chmod u+w /etc/sudoers
2、编辑sudoers文件:vi /etc/sudoers
找到行“root ALL=(ALL) ALL”,在下面添加“hadoop ALL=(ALL) ALL”,其中xxx为需要添加sudo权限的普通用户。
3、撤销sudoers文件写权限:chmod u-w /etc/sudoers
以上完成为普通用户添加sudo权限操作
4、在vi下,使用 ?.root 快速查找位置
5、为hadoop用户创建一个专门的目录供其使用
mkdir /user
将hadoop组件需要的都在/user目录下,将组变掉。
chown -R hadoop:hadoop /user
在这里插入图片描述

在这里插入图片描述

  • 为之后容易操作,建议继续安装Xshell6来完成操作
  • 百度网盘Xshell6 密码j7si
  • 这里要注意的是,你的电脑本地IP需要和虚拟机ping通,由于我这里是192.168.23.*开头的,所以我设置的静态IP也是以这个开头。自己可以在本机 ipconfig 查看 IP
  • 新建三个会话,名字分别为master,slave1.slave2
  • 在这里插入图片描述
  • 最终结果如图

在这里插入图片描述
7)配置SSH免密登录
注意:以下操作每台虚拟机都需完成
0)配置hosts文件
vi /etc/hosts
在这里插入图片描述
1)使用root用户修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。检查下面几行前面”#”注释是否取消掉,若以下项没有则自行增加:
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile %h/.ssh/authorized_keys # 公钥文件路径
在这里插入图片描述
3)取消注释后,继续使用root重启sshd服务
[root@master]# service sshd restart
4)退出使用普通用户,在~目录下完成以下免密操作:
(1)执行完命令,生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
ssh-keygen -t rsa (一直回车)
[hadoop@master ~]$ cd .ssh
(2)将公钥拷贝到要免密登陆的目标机器master上
使用以下命令将自身公钥放到authorized_keys文件中,以master为例
[hadoop@master ~ .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[hadoop@master ~ .ssh]$ chmod 600 authorized_keys
其他几台将自身公钥拷贝到master机器上
[hadoop@slave1 ~ .ssh]$ ssh-copy-id hadoop@master
[hadoop@salve2 ~ .ssh]$ ssh-copy-id hadoop@master
master的authorized文件得到全部机器公钥后,修改authorized_keys文件权限为600,分发给其他机器,以其中一台为例
[hadoop@master ~ .ssh]$ scp authorized_keys

3)在机器上测试是否能够互相登录,以下为例
[hadoop@master ~]$ ssh slave1
[hadoop@master ~]$ ssh slave2

安装jdk1.8

  • 下载

  • 压缩在/user目录下

  • 配置环境变量vi /etc/profile

    • export JAVA_HOME=/user/jdk1.8
    • export PATH=$ JAVA_HOME/bin:$PATH
    • source /etc/profile
    • java -version
      在这里插入图片描述
  • SCP到Slave1和Slave2

安装Zookeeper3.4.5

1)上传zookeeper3.4.5安装包到/user目录
2)解压安装包
[hadoop@master ~]$ tar -zxvf zookeeper-3.4.5.tar.gz
3)进入zookeeper解压后的conf目录,复制一份zookeeper配置文件zoo_sample.cfg并命名为zoo.cfg
[hadoop@conf ~]$ cp zoo_sample.cfg zoo.cfg

4)zookeeper安装目录下创建data与logs目录,分别用于存放zookeeper产生的数据与日志,之后修改zookeeper配置文件zoo.cfg,修改内容如下:
在这里插入图片描述
[hadoop@zookeeper-3.4.5 ~]$ mkdir data
[hadoop@zookeeper-3.4.5 ~]$ mkdir logs

5)在第一个zookeeper节点master机器的zookeeper/data目录下创建myid文件,并写入值0
[hadoop@zookeeper-3.4.5 ~]$ echo 0 > data/myid
[hadoop@zookeeper-3.4.5 ~]$ cat data/myid
6)配置环境变量
[hadoop@master ~]$ sudo vi /etc/profile
在文件相应位置加入以下内容:

export ZOOKEEPER_HOME=/user/zookeeper-3.4.5
export PATH=$PATH:$ZOOKEEPER_HOME/bin

7)刷新配置
[hadoop@master ~]$ sudo source /etc/profile
8)传输zookeeper目录与配置文件给其他节点机器,以Slave1为例
[hadoop@master ~]$ scp zookeeper-3.4.5 Slave1:/user
之后为每个myid文件写入自己定义的server
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9)将配置分发到其他节点上
scp -r /user/zookeeper-3.4.5/ Slave1:/user/
scp -r /user/zookeeper-3.4.5/ Slave2:/user/

  1. 启动所有ZK的节点
    bin/zkServer.sh start

11)查看状态
bin/zkServer.sh status
在这里插入图片描述在这里插入图片描述在这里插入图片描述
当看到 2个: follower 和 1个: leader 说明配置成功

现在开始安装Hadoop

  • Hadoop下载链接
  • 在本机电脑下载好后,通过Xftp上传
  • 在这里插入图片描述
    -1)配置环境变量
    在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径(有可能这条属性被注释掉了,记得解开,把前面的#去掉就可以了)
    export JAVA_HOME=/opt/modules/jdk1.8.0_171

2)配置 /user/hadoop-2.6.0/etc/hadoop 下的5个文件
core-site.xml
hdfs-site.xml
mapred-site.xml(重命名:mapred-site.xml.template)
yarn-site.xml

core-site.xml
---------------------------------------------------------------------------
<configuration>  
<property>  
    <name>fs.defaultFS</name>  
    <!-- ns -->
    <value>hdfs://ns</value>  
</property> 
 <property>
	<name>hadoop.tmp.dir</name>
	<value>/user/hadoop-2.6.5/data/tmp</value>
</property>
<!-- Resource Manager UI的默认用户dr.who权限不正确 ,这里写上你的机器用户名-->
<property>  
    <name>hadoop.http.staticuser.user</name>  
    <value>Master</value>  
</property>
<property>  
    <name>ha.zookeeper.quorum</name>  
    <value>Master:2181,Slave1:2181,Slave2:2181</value>  
</property> 
</configuration>
---------------------------------------------------------------------------
hdfs-site.xml
---------------------------------------------------------------------------
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>ns</value>
    </property>
    <!-- ns下面有两个NameNode,分别是nn1,nn2 -->
    <property>
       <name>dfs.ha.namenodes.ns</name>
       <value>nn1,nn2</value>
    </property>
    <!-- nn1的RPC通信地址 -->
    <property>
       <name>dfs.namenode.rpc-address.ns.nn1</name>
       <value>Master:9000</value>
    </property>
    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.ns.nn1</name>
        <value>Master:50070</value>
    </property>
    <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.ns.nn2</name>
        <value>Slave1:9000</value>
    </property>
    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.ns.nn2</name>
        <value> Slave1:50070</value>
    </property>
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
    <property>
         <name>dfs.namenode.shared.edits.dir</name>
         <value>qjournal://Master:8485;Slave1:8485;Slave2:8485/ns</value>
    </property>
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/user/hadoop-2.6.5/data/journal</value>
    </property>
    <!-- 开启NameNode故障时自动切换 -->
    <property>
          <name>dfs.ha.automatic-failover.enabled</name>
          <value>true</value>
    </property>
    <!-- 配置失败自动切换实现方式 -->
    <property>
            <name>dfs.client.failover.proxy.provider.ns</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- 配置隔离机制,由于centOS的sshfence命令没有安装,所以使用本机自带的shell(假如这个不成功,则试下使用sshfence) -->
    <property>
             <name>dfs.ha.fencing.methods</name>
             <value> 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.namenode.name.dir</name>
        <value>file:///user/hadoop-2.6.5/data/namenode</value>
    </property>

    <property>
        <name>dfs.datanode.data.dir</name>
		<!--这里注意了,file///,不然会疯的!-->
        <value>file:///user/hadoop-2.6.5/data/datanode</value>
    </property>

    <property>
       <name>dfs.replication</name>
       <value>2</value>
    </property>
    <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
    <property>
       <name>dfs.webhdfs.enabled</name>
       <value>true</value>
</property>

---------------------------------------------------------------------------
mapred-site.xml

---------------------------------------------------------------------------
<configuration>  
<property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>  
</property> 
<!-- MapReduce JobHistory Server地址 -->
<property>  
    <name>mapreduce.jobhistory.address</name>  
    <value>Master:10020</value>  
</property>  
<property>  
    <name>mapreduce.jobhistory.webapp.address</name>  
    <value>Master:19888</value>  
</property>  
</configuration> 

---------------------------------------------------------------------------

yarn-site.xml

---------------------------------------------------------------------------
<configuration>  
    <property>  
        <name>yarn.nodemanager.aux-services</name>  
        <value>mapreduce_shuffle</value>  
    </property>  
    <property>  
        <name>yarn.resourcemanager.hostname</name>  
        <value>Slave2</value>  
    </property>  
    <property>  
        <name>yarn.log-aggregation-enable</name>  
        <value>true</value>  
    </property>  
        <property>  
        <name>yarn.log-aggregation.retain-seconds</name>  
        <value>106800</value>  
    </property>  
</configuration> 

Slaves
---------------------------------------------------------------------------
Master
Slave1
Slave2

3)分发文件
注:只要配置一台,配置完了,把配置分发给其他机器,使用如下命令(scp命令):
scp -r /user/hadoop-2.6.5/ hadoop@192.168.23.201:/user
scp -r /user/hadoop-2.6.5/ hadoop@192.168.23.202:/user

启动 Hadoop 集群
【启动过程】
1、首先zookeeper已经启动好了吧(三台都要启动)
开启命令 bin/zkServer.sh start
2、启动三台journalnode(这个是用来同步两台namenode的数据的)
$ sbin/hadoop-deamon.sh start journalnode
3、操作namenode(只要格式化一台,另一台同步,两台都格式化,你就做错了!!)
1)、格式化第一台:
$ bin/hdfs namenode -format
2)、启动刚格式化好的namenode:
$ sbin/hadoop-deamon.sh start namenode
3)、在第二台机器上同步namenode的数据:
$ bin/hdfs namenode -bootstrapStandby
4)、启动第二台的namenode:
$ sbin/hadoop-deamon.sh start namenode
4、查看web
注意:如果用主机名登陆,必须在 C:\Windows\System32\drivers\etc 下的 hosts配置映射
http://Master:50070
http://Slave1:50070
在这里插入图片描述
在这里插入图片描述
5、这时可以查看在zookeeper上生成一个节点 hadoop-ha,这个是自动生成的,通过下面的命令生成:
$ bin/hdfs zkfc -formatZK
6、你登录zookeeper的客户端,就是bin/zkCli.sh里面通过 “ls /” 可以看到多了个节点

在这里插入图片描述
等到完全启动了之后,就可以kill掉active的namenode,你就会发现stanby的机器变成active,然后再去启动那台被你kill掉的namenode(启动起来是stanby的状态),然后你再去kill掉active,stanby的机器又会变成active,到此你的HA自动故障转移已经完成了。
这是官网的帮助文档:http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
后话:其实也可以做resourcemanager的HA,但是其实你能搭出namenode的HA,对于你来说,resourcemanager的HA就很简单了。
7、配置文件
只修改yarn-site.xml文件


yarn-site.xml
-------------------------------------------------------------
<configuration>  
	<property>  
        <name>yarn.nodemanager.aux-services</name>  
        <value>mapreduce_shuffle</value>  
    </property> 
    <!--启用resourcemanager ha-->  
	<!--是否开启RM ha,默认是开启的-->  
	<property>  
		<name>yarn.resourcemanager.ha.enabled</name>  
		<value>true</value>  
	</property>  
	<!--声明两台resourcemanager的地址-->  
	<property>  
		<name>yarn.resourcemanager.cluster-id</name>  
		<value>rmcluster</value>  
	</property>  
	<property>  
		<name>yarn.resourcemanager.ha.rm-ids</name>  
		<value>rm1,rm2</value>  
	</property>  
	<property>  
		<name>yarn.resourcemanager.hostname.rm1</name>  
		<value>Slave1</value>  
	</property>  
	<property>  
		<name>yarn.resourcemanager.hostname.rm2</name>  
		<value>Slave2</value>  
	</property>  
	
	<!--指定zookeeper集群的地址-->   
	<property>  
		<name>yarn.resourcemanager.zk-address</name>  
		<value>Master:2181,Slave1:2181,Slave2:2181</value>  
	</property>  
	<!--启用自动恢复,当任务进行一半,rm坏掉,就要启动自动恢复,默认是false-->   
	<property>  
		<name>yarn.resourcemanager.recovery.enabled</name>  
		<value>true</value>  
	</property>
	<!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面。-->   
	<property>  
		<name>yarn.resourcemanager.store.class</name>  
		<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>  
	</property>  
</configuration> 

发送yarn-site.xml 到其他机器
scp etc/hadoop/yarn-site.xml hadoop@192.168.23.201:/user/hadoop-2.6.5/etc/hadoop/
scp etc/hadoop/yarn-site.xml hadoop@192.168.23.202:/user/hadoop-2.6.5/etc/hadoop/

三、启动 ResourceManager
在Slave1上:
sbin/start-yarn.sh

在Slave2上:
sbin/yarn-daemon.sh start resourcemanager

Master
在这里插入图片描述

Slave1
在这里插入图片描述

Slave2
在这里插入图片描述
观察web 8088端口

当Slave1的ResourceManager是Active状态的时候,访问Slave2的ResourceManager会自动跳转到PC02的web页面
测试HA的可用性

查看的状态:
bin/yarn rmadmin -getServiceState rm1 ##查看rm1的状态
bin/yarn rmadmin -getServiceState rm2 ##查看rm2的状态
然后你可以提交一个job到yarn上面,当job执行一半(比如map执行了100%),然后kill -9 掉active的rm
这时候如果job还能够正常执行完,结果也是正确的,证明你rm自动切换成功了,并且不影响你的job运行!!!

Hadoop HA搭建完成

参考博客:
https://blog.csdn.net/qq_33187206/article/details/80776839
http://www.cnblogs.com/ljy2013/p/4512550.html?utm_source=tuicool&utm_medium=referral

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值