大白话告诉你Hadoop架构原理( 二 )


大白话告诉你Hadoop架构原理

文章插图
此时他会先跟NameNode通信,说:大哥,我想创建一个新的文件,他的名字叫“/usr/hive/warehouse/access_20180101.log”,大小是1TB,你看行不?
然后NameNode就会在自己内存的文件目录树里,在指定的目录下搞一个新的文件对象,名字就是“access_20180101.log” 。
这个文件目录树不就是HDFS非常核心的一块元数据,维护了HDFS这个分布式文件系统中,有哪些目录,有哪些文件,对不对?
但是有个问题,这个文件目录树是在NameNode的内存里的啊!
这可坑爹了,你把重要的元数据都放在内存里,万一NameNode不小心宕机了可咋整?元数据不就全部丢失了?
可你要是每次都频繁的修改磁盘文件里的元数据,性能肯定是极低的啊!毕竟这是大量的磁盘随机读写!
没关系,我们来看看HDFS优雅的解决方案 。
每次内存里改完了,写一条edits log,元数据修改的操作日志到磁盘文件里,不修改磁盘文件内容,就是顺序追加,这个性能就高多了 。
每次NameNode重启的时候,把edits log里的操作日志读到内存里回放一下,不就可以恢复元数据了?
大家顺着上面的文字,把整个过程,用下面这张图跟着走一遍 。
大白话告诉你Hadoop架构原理

文章插图
但是问题又来了,那edits log如果越来越大的话,岂不是每次重启都会很慢?因为要读取大量的edits log回放恢复元数据!
所以HDFS说,我可以这样子啊,我引入一个新的磁盘文件叫做fsimage,然后呢,再引入一个JournalNodes集群,以及一个Standby NameNode(备节点) 。
每次Active NameNode(主节点)修改一次元数据都会生成一条edits log,除了写入本地磁盘文件,还会写入JournalNodes集群 。
然后Standby NameNode就可以从JournalNodes集群拉取edits log,应用到自己内存的文件目录树里,跟Active NameNode保持一致 。
然后每隔一段时间,Standby NameNode都把自己内存里的文件目录树写一份到磁盘上的fsimage,这可不是日志,这是完整的一份元数据 。这个操作就是所谓的checkpoint检查点操作 。
然后把这个fsimage上传到到Active NameNode,接着清空掉Active NameNode的旧的edits log文件,这里可能都有100万行修改日志了!
然后Active NameNode继续接收修改元数据的请求,再写入edits log,写了一小会儿,这里可能就几十行修改日志而已!
如果说此时,Active NameNode重启了,bingo!没关系,只要把Standby NameNode传过来的fsimage直接读到内存里,这个fsimage直接就是元数据,不需要做任何额外操作,纯读取,效率很高!
然后把新的edits log里少量的几十行的修改日志回放到内存里就ok了!
这个过程的启动速度就快的多了!因为不需要回放大量上百万行的edits log来恢复元数据了!如下图所示 。
大白话告诉你Hadoop架构原理

文章插图
此外,大家看看上面这张图,现在咱们有俩NameNode 。
  • 一个是主节点对外提供服务接收请求
  • 另外一个纯就是接收和同步主节点的edits log以及执行定期checkpoint的备节点 。
大家有没有发现!他们俩内存里的元数据几乎是一模一样的啊!
所以呢,如果Active NameNode挂了,是不是可以立马切换成Standby NameNode对外提供服务?
这不就是所谓的NameNode主备高可用故障转移机制么!
接下来大家再想想,HDFS客户端在NameNode内存里的文件目录树,新加了一个文件 。
但是这个时候,人家要把数据上传到多台DataNode机器上去啊,这可是一个1TB的大文件!咋传呢?
很简单,把1TB的大文件拆成N个block,每个block是128MB 。1TB = 1024GB = 1048576MB,一个block是128MB,那么就是对应着8192个block 。
这些block会分布在不同的机器上管理着,比如说一共有100台机器组成的集群,那么每台机器上放80个左右的block就ok了 。
但是问题又来了,那如果这个时候1台机器宕机了,不就导致80个block丢失了?
也就是说上传上去的1TB的大文件,会丢失一小部分数据啊 。没关系!HDFS都考虑好了!
它会默认给每个block搞3个副本,一模一样的副本,分放在不同的机器上,如果一台机器宕机了,同一个block还有另外两个副本在其他机器上呢!
大伙儿看看下面这张图 。每个block都在不同的机器上有3个副本,任何一台机器宕机都没事!还可以从其他的机器上拿到那个block 。
这下子,你往HDFS上传一个1TB的大文件,可以高枕无忧了吧!


推荐阅读