线上需要部署2个NameNode:一个节点是Active状态并对外提供服务;另一个节点是StandBy状态,作为Active的备份,备份状态下不提供对外服务,也就是说HDFS客户端无法通过请求StandBy状态的NameNode来实现修改文件元数据的目的。如果ZkFailoverController服务检测到Active状态的节点发生异常,会自动把StandBy状态的NameNode服务切换成Active的NameNode。
NameNode存储并管理HDFS的文件元数据,这些元数据主要包括文件属性(文件大小、文件拥有者、组以及各个用户的文件访问权限等)以及文件的多个数据块分布在哪些存储节点上。需要注意的是,文件元数据是在不断更新的,例如HBase对HLog文件持续写入导致文件的Block数量不断增长,管理员修改了某些文件的访问权限,HBase把一个HFile从/hbase/data目录移到/hbase/archive目录。所有这些操作都会导致文件元数据的变更。因此NameNode本质上是一个独立的维护所有文件元数据的高可用KV数据库系统。为了保证每一次文件元数据都不丢失,NameNode采用写EditLog和FsImage的方式来保证元数据的高效持久化。每一次文件元数据的写入,都是先做一次EditLog的顺序写,然后再修改NameNode的内存状态。同时NameNode会有一个内部线程,周期性地把内存状态导出到本地磁盘持久化成FsImage(假设导出FsImage的时间点为t),那么对于小于时间点t的EditLog都认为是过期状态,是可以清理的,这个过程叫做推进checkpoint。
NameNode会把所有文件的元数据全部维护在内存中。因此,如果在HDFS中存放大量的小文件,则造成分配大量的Block,这样可能耗尽NameNode所有内存而导致OOM。因此,HDFS并不适合存储大量的小文件。当然,后续的HDFS版本支持NameNode对元数据分片,解决了NameNode的扩展性问题。
资料来源:《HBase原理与实践》,文章链接:https://developer.aliyun.com/article/724670
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。