2023/11/6
Block Caching
DataNode通常直接从磁盘读取数据,但是频繁使用的Block可以在内存中缓存。默认情况下,一个Block只有一个数据节点会缓存。但是可以针对每个文件可以个性化配置。
作业调度器可以利用缓存提升性能,例如MapReduce可以把任务运行在有Block缓存的节点上。 用户或者应用可以向NameNode发送缓存指令(缓存哪个文件,缓存多久),缓存池的概念用于管理一组缓存的权限和资源。
HDFS Federation
HDFS Federation提供了一种横向扩展NameNode的方式。在Federation模式中,每个NameNode管理命名空间的一部分,例如一个NameNode管理/user目录下的文件,另一个NameNode管理/share目录下的文件。
每个NameNode管理一个namespace volumn,所有volumn构成文件系统的元数据。每个NameNode同时维护一个Block Pool,保存Block的节点映射等信息。各NameNode之间是独立的,一个节点的失败不会导致其他节点管理的文件不可以。
客户端使用mount table将文件路径映射到NameNode。mount table 是在NameNode群组之上封装了一层,这一层也是一个Hadoop文件系统的实现,通过viewfs:协议访问。
HDFS HA(High Availability 高可用性)
启动新的NameNode之后,需要重新配置客户端和DataNode的NameNode信息。
重启耗时的原因大致有:
-
元数据镜像文件载入到内存耗时较长
-
需要重放edit log
-
需要收到来自DataNode的状态报告并且满足条件后才能离开安全模式提供写服务。
Hadoop的HA方案
采用HA的HDFS集群配置两个NameNode,分别处于Active和Standby状态。切换过程一般持续几十秒到数分钟。
HA设计到的主要实行逻辑有
-
主备需要共享edit log存储 主NameNode和待命的NameNode共享一份edit log,当主备切换时,Standby通过回放edit log同步数据。
-
DataNode需要同时往主备发送Block Report 因为Block映射数据存储在内存中(不是磁盘上),为了在Active挂掉后能够快速启动,DataNode需要同时向主备两个NameNode发送Block Report。
-
客户端徐亚配置failover模式(失效备援模式,对用户透明) 客户端在配置文件中使用的HDFS URI是逻辑路径,映射到一对NameNode地址。客户端会不断尝试每一个NameNode地址直到成功。
-
Standby替代Secondary NameNode
NameNode的切换通过代failover controller来实现。failover controller默认使用Zookeeper来保证只有一个NameNode处于Active状态。
命令行接口
命令行的交互只要通过Hadoop fs来操作。
文件权限是否开启通过dfs.permissions.enabled属性来控制,这个属性默认为false