转载请注明出处:http://blog.csdn.net/l1028386804/article/details/52727710
今天是十一长假的第三天,节前,很多朋友发来私信说,网上基于HA的Hadoop集群,动不动就是7、8台服务器,甚至是10几台服务器,自己的电脑Hold不住这么多虚拟机啊!有什么办法可以将服务器缩减为3台吗?今天,我就为大家带来一篇如何在3台CentOS 虚拟机上搭建基于HA的hadoop集群,首先让我们先来准备下服务器的基础环境和了解下Hadoop相关的名词,这篇文章中的内容是要求我们必须掌握的,如果您已经掌握了本博文的内容,那您可以直接进入下一篇博文《Hadoop之——Hadoop2.5.2 HA高可靠性集群搭建(Hadoop+Zookeeper)》的阅读, 那么接下来,我们就直接进入主题吧。
我这里用的是3台CentOS虚拟机。
IP地址分别为:
192.168.0.145
192.168.0.146
192.168.0.147
以192.168.0.145服务器为例:
在192.168.0.145上分别执行如下命令:
hostname liuyazhuang145
vi /etc/sysconfig/network
HOSTNAME=liuyazhuang145
vi /etc/hosts
192.168.0.145 liuyazhuang145
其他2台服务器类似,只是192.168.0.146对应liuyazhuang146、192.168.0.147对应liuyazhuang147
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.145 liuyazhuang145
192.168.0.146 liuyazhuang146
192.168.0.147 liuyazhuang147
完成以上配置后,服务器的规划为:
192.168.0.145 ——> liuyazhuang145
192.168.0.146 ——> liuyazhuang146
192.168.0.147 ——> liuyazhuang147
centos 7:
systemctl stop firewalld.service #停止
systemctl disable firewalld.service #禁用
之前的版本:
service iptables stop #停止
chkconfig iptables off #禁用
在liuyazhuang145节点上执行
ssh-keygen -t rsa
命令,将会在~/.ssh目录下生成id_rsa和id_rsa.pub两个文件,其中id_rsa为密钥文件,rd_rsa.pub为公钥文件,然后我们输入命令
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
将id_rsa.pub公钥文件写入authorized_keys中,此时,我们就完成了liuyazhuang145主机上的免密码登录配置,我们可以利用ssh liuyazhuang145命令来检测ssh免密码登录是否配置成功。
在其他主机上分别执行ssh-keygen -t rsa命令,并将生成的id_rsa.pub文件拷贝到liuyazhuang145主机:
[root@liuyazhuang146 ~]# scp .ssh/id_rsa.pub liuyazhuang145:/root/.ssh/146
[root@liuyazhuang147 ~]# scp .ssh/id_rsa.pub liuyazhuang145:/root/.ssh/147
然后再liuyazhuang145主机上执行命令:
cat ~/.ssh/146 >> ~/.ssh/authorized_keys
cat ~/.ssh/147 >> ~/.ssh/authorized_keys
然后将authorized_keys文件分别复制到liuyazhuang146、liuyazhuang147
[root@liuyazhuang145 ~]# scp .ssh/authorized_keys liuyazhuang146:/root/.ssh/authorized_keys
[root@liuyazhuang145 ~]# scp .ssh/authorized_keys liuyazhuang147:/root/.ssh/authorized_keys
删除liuyazhuang145节点上~/.ssh下的146/147文件
rm ~/.ssh/146
rm ~/.ssh/147
此时,完成了各台主机间的ssh免密码登录。
在hadoop1.x 中使用的问题 :
(1)HDFS存在的问题:
1.NameNode单点故障,难以应用与在线场景
2.NameNode压力过大,且内存受限,影响系统扩展性
(2)MapReduce存在的问题:
1.JobTracker访问压力大,影响系统拓展性
2.难以支持除了MapReduce之外的计算框架,比如Spark,Storm等
Spark :内存计算框架,Storm 流式计算框架;
1)HDFS :NN Federation , HA ;
2)MapReduce : 运行 在YARN上的MR;
3)YARN : 资源管理系统
1)解决了HDFS的单点故障和内存受限问题
2)解决单点故障
2.1) HDFS HA :通过主备NameNode解决
2.2 )如果主NameNode发生故障,则切换到备NameNode上
4.4.1 HDFSFederation
4.4.2 水平拓展,支持多个NameNode
4.4.3 每个NameNode分管一部分目录
4.4.4 所有的NameNode共享所有的DataNode存储资源
4.4.5.仅仅是架构上发生了变化,使用方式不变化;
4.4.6.对HDFS使用者透明,Java API 还可以使用!
4.5.1 通过多个namenode / namespcae 把元数据的存储和管理分散到多个节点中,
使得namenode/namespace可以通过增加机器来进行水平拓展;
4.5.2 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候,不会也降低HDFS的性能。可以通过多个namespace来隔离不同类型的应用,把不同类型的应>用HDFS元数据存储和管理分派到不同的namenode中;
4.5.3 每个NameNode独立工作,数据共享;
主备NameNode
4.6.1 解决单点故障问题
(1)主NameNode对外提供服务,备NameNode同步主NameNode元数据以待切换;
(2)所有的DataNode同时向两个NameNode汇报数据块信息
4.6.2 两种切换选择
(1)手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
(2)自动切换:基于Zookeeper的实现
4.6.3 基于Zookeeper自动切换方案
(1)Zookeeper Failover Controller :监控NameNode的健康状态,并向Zookeeper注册NameNode
(2) NameNode挂掉后, ZKFC 为NameNode竞争锁,获得ZKFC锁的NameNode变为active
yarn : Yet Another Resource Negoiator
4.7.1 Hadoop2.x 资源管理系统
(1) 核心思想:将MRv1 中 的 JobTracker的资源管理和任务调度两个功能分开,>分别由ResourceManager和ApplicationMaster进程实现
(2) ResourceManaer :负责整个集群的资源管理和调度
(3) ApplicationMaster : 负责应用程序相关的事务,比如任务调度,任务监控和
容错;
4.7.2 YARN的引入使得多个计算框架可以运行在一个集群中
(1)每个应用程序对应一个ApplicationMaster
(2) 目前多个计算框架可以运行在YARN上,比如MapReduce ,Spark ,Storm 等;
将MapReduce作业直接运行在YARN上,而不是由JObTracker和TaskTracker构建的MRv>系统中
4.8.1 基本功能模块
(1)YARN负责资源管理和调度
(2)MRAppMaster :负责任务切分,任务调度,任务监控和容错等;
(3)MapTask/ReduceTask :任务驱动,与MRv1一致;
4.8.2 每个MapReduce作业对应一个MRAppMaster
(1)MrAppMaster任务调度
(2)YARN将资源分配给MRAPPMaster
(3)MRAppMaster进一步将资源分配给内部的任务
4.8.3 MRAppMater容错
(1)失败:由YARN重新启动
(2)任务失败后,MRAppMaster重新申请资源;
Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作。在hadoop1时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。这是hadoop1中的单点问题,也是hadoop1不可靠的表现。如下图所示,便是hadoop1.0的架构图;
为了解决hadoop1中的单点问题,在hadoop2中新的NameNode不再是只有一个,可以有多个(目前只支持2个)。每一个都有相同的职能。一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠。
Hadoop2.0中,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享(这也是主流的做法)。如下图所示,便是JournalNode的架构图。
两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了
对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,这就需要利用使用ZooKeeper了。首先HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。
至此,我们完成了基于HA的Hadoop环境准备工作,您可以阅读下一篇博文《Hadoop之——Hadoop2.5.2 HA高可靠性集群搭建(Hadoop+Zookeeper)》了。