高可用
咱们曾经晓得了,读取文件、上传文件,都须要通过 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 的压力。