高可用

咱们曾经晓得了,读取文件、上传文件,都须要通过NameNode,如果NameNode宕机了,那客户端就不晓得往哪里读写数据,整个集群就不可用了。

Hadoop的高可用是通过zookeeper来实现的,Hadoop - 集群装置(高可用),这篇文章也提到了zookeeper的作用,实际上对于大数据的各个组件来说,很多高可用都是通过zookeeper来做的,咱们上面看看zookeeper是如果实现Hadoop的高可用。在zookeeper中实现master选举的,能够看之前的文章zookeeper之master选举,这里不做细节补充。
高可用个别都是通过冗余的形式,部署多个节点,其中一个作为流动的节点,对外提供服务,残余的节点作为处于待机状态,当流动节点不能够的时候,顶替成为流动节点。
在高可用的Hadoop中,NameNode的节点数量是2个,并且每个NameNode都有zkfc,用于和zookeeper进行通信。

当其中一个NameNode胜利的在zookeeper创立一个节点后,他就成了active节点,另外一个就是standby节点。active节点对外提供服务,standby节点监听zookeeper的节点,当发现active节点不能够的时候,就去zookeeper上创立节点,变成active节点。

DataNode须要定时的给NameNode发送心跳,NameNode就会在内存中记录每个DataNode最初发送心跳的工夫,作为DataNode存活的根据,那此时是有两个NameNode的,如果仅仅把心跳发送到active节点下面,那故障转移的时候,新的active是不晓得哪些DataNode是存活的,为了疾速的实现故障转移,所以DataNode发送心跳的时候,就会获取到两个NameNode的地址和端口,一起发送本人的心跳信息。

NameNode内存中除了保留DataNode的心跳信息,还保留了元数据信息。为了让两个NameNode的元数据也同步,每次元数据有变更的时候,active节点也会把数据发送到journalnode集群,standby节点就会定期的从journalnode集群读取元数据信息。

为了保障NameNode的高可用,HDFS引入了zookeeper和journalnode,如果这两个不是高可用的,那也会影响到NameNode的高可用,所以这两个也要是高可用的。

联邦集群

高可用的NameNode也是有他的瓶颈,比方所有的拜访都要通过active节点的NameNode,高可用的NameNode并没有缩小active节点的压力,另外一个瓶颈就是元数据的治理,元数据会始终增长,NameNode的内存总有被耗费完的一天,并且始终加内存会导致每次加载元数据过多让启动变得异样慢,并且full gc的工夫也很长。为了解决这两个问题,HDFS推出了联邦集群。
既然一个NameNode有瓶颈,那就多几个NameNode来分单压力,如图下所示,有三组的NameNode,每组的NameNode都有active节点和standby节点。他们和zookeeper以及journalnode的关系跟高可用一样。

那这些NameNode是怎么治理元数据和DataNode的呢?联邦集群里引入了块池的概念,比方咱们有三组的NameNode,那就有三个块池,每个DataNode就会划分成多个逻辑概念的块。
比方下图,假如每个DataNode分为三块,每个块都有对应的块池,第一组的NameNode往块池1读写数据,并保留对应的元数据信息。第二组的NameNode往块池2读写数据,并保留对应的元数据信息。第三组的NameNode往块池3读写数据,并保留对应的元数据信息。假如元数据原先为600G,那此时每个NameNode只有治理200G的元数据就好了。另外在读写上,也升高为原来的三分之一,大大减少了NameNode的压力。