HDFS-NameNode元数据和SecondaryNameNode、联邦机制

HDFS元数据是怎么管理的?

总所周知,HDFS的元数据都是保存在NameNode的内存里,放内存的好处很多,读写快,响应快,但是也会有要两个问题:

  1. 如果服务器重启后内存就会被清空,数据会丢失,数据怎么持久化?
  2. 单点NameNode的内存是有极限的,怎么扩展? (HDFS集群的性能瓶颈取决NameNode的内存大小)

HDFS是怎么解决第一个问题:( FsImage / Eidts / SecondaryNameNode )

NameNode里面有持久化机制,所有的元数据除了在内存对外提供使用,还会保存在两个重要的文件

  • FsImage (元数据信息的镜像)
    • FsImage是NameNode中关于元数据的镜像,一般称为检查点,存放比较完整的元数据信息
    • 由于是完整的镜像,所以每次加载到内存都非常耗内存和CPU,所以一般都会先把操作记录在Eidts
    • 包含了所有当前NameNode下管理的所有DataNode文件和文件block及block的元数据信息
    • 随着Eidts内容增大,需要在一定时间点和FsImage合并
  • Eidts (客户端的操作日志)
    • 存放了客户端最近的操作日志
    • 客户端写文件进HDFS时会首先写进Eidts
    • Eidts修改时元数据也会更新

FsImage和Eidts 在哪?

通过hdfs-site.xml 查看和配置:

<!-- FsImage 配置路径 -->
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas</value>
</property>
<!-- Edits 配置路径 -->
<property>
    <name>dfs.namenode.edits.dir</name>
    <value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits</value>
</property>

image

怎么查看FsImage和Eidts?

#FsImage 
hdfs oiv -i fsimage_000001 -p XML  -o myfsimage.xml

#Eidts	
hdfs oev -i eidts_000001 -p XML -o  myedit.xml

延申:当FsImage和Eidts两个文件容量越来越大时,应该怎么解决?(SecondaryNameNode 的辅助就很重要了,但是高可用架构就不需要了)

SecondaryNameNode的作用:定期合并FsImage和Eidts,把Eidts控制在范围内。

第二问题怎么解决:(HA+Federation)联邦机制

当集群大到一定程度的时候,NameNode进程使用的内存可能会达上百G,NameNode就成为了性能的瓶颈,所以HDFS提出NameNode水平扩展方案,即联邦机制(Federation).这个时候一个NameNode和SecondaryNode就看作是一个整体,即一个NameSpace。

  • 多个NameNode共用一个集群的资源,每台NameNode都可以单独对外提供服务

  • 每个NameNode都会定义一个存储池,有单独的ID,每个DataNode都为所有存储池提供存储,具体见于每个DataNode都会有单独的目录存储不同NameNode的数据,例如:NameNode-01目录、NameNode-02目录、NameNode-03目录...

  • DataNode 会按照存储池id向其对应的NameNode汇报块信息,例如NameNode-01目录向NameNode1汇报等。同时DataNode会向所有的NameNode汇报本地存储可用资源情况。

Federation的不足:由于Federation并没有完全解决单点故障问题,所以每个NameNode都跟单点部署一样需要配置SecondaryNameNode来辅助恢复还原挂掉的NameNode元数据信息。

所以一般集群规模很大的时候,就会采用HA(高可用)+Federation(联邦)的部署方案,也就是每个联合的NameNode(NameSpace)都是HA的。
image

posted @ 2021-08-02 22:41  没离开过o  阅读(489)  评论(0)    收藏  举报