一. HDFS回收站
我们Windows系统里面有一个回收站,当想恢复删除文件的时候可以到这里面恢复,HDFS也有回收站。
HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/
每一个被用户在shell命令行删除的文件/目录,都会进入到对应的回收站目录中,在一段时候内用户没对数据进行恢复的话,HDFS就会自动把这个文件/目录彻底删除。
默认情况下HDFS的回收站是没有开启的,需要通过一个配置来开启,在core-site.xml中添加如下配置:
value的单位是分钟,1440分钟代表一天
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
注意,如果删除文件过大,超过回收站大小的话会提示删除失败,需要指定参数--skip Trash,指定这个参数跳过回收站。
[root@bigdata01 hadoop-3.2.0]# hdfs dfs -rm -r -skipTrash /user.txt
Deleted /user.txt
[root@bigdata01 hadoop-3.2.0]#
二.HDFS安全模式
大家在平时操作HDFS的时候,有可能遇到这个问题,特别是刚启动群集的时候去上传或者删除文件,会发现错误,提示NameNode处于SafeMode.
这个属于HDFS的安全模式,因为在集群每次重新启动的时候,HDFS都会检查集群中文件信息是否完整,这个时间段内是不允许对集群修改操作的,如果遇到这个情况,可以稍等一会,等HDFS自检 完毕,就会自动退出安全模式。
访问HDFS的web页面,可以看到下面的信息,ON表示处于安全模式,OFF表示安全模式已经结束。
或者通过HDFS命令也可以查看当前的状态:
[root@bigdata01 hadoop-3.2.0]# hdfs dfsadmin -safemode get
Safe mode is ON
如果想快速离开安全模式,也可以使用命令强制离开:
[root@bigdata01 hadoop-3.2.0]# hdfs dfsadmin -safemode leave
Safe mode is OFF
三.HDFS的高可用和高扩展
在HDFS的设计中,NameNode是支持多个的,一个主的,多个备的,当主的挂掉了,备的就可以顶上去,这样就解决了NameNode节点宕机导致的单点故障问题了。
前面我们说了: NameNode节点的内存是有限的,只能存储有限的文件个数,那使用一个主NameNode,多个备用的NameNode能解决这个问题吗?
不能!
一个主NameNode,多个备NameNode的方案只能解决NameNode的单点故障问题,无法解决单个NameNode内存不够的问题。那怎么办呢?不用担心,官方提供了Faderation机制,可以翻译为联邦,它可以解决单节点内存不够用的情况。
HA架构图:
HDFS的HA,是指在一个群集中存在多个NameNode,分别运行在独立的物理节点上。在任何时间点,只有一个NameNode处于Active状态,其他的处于Standby状态。Active NameNode(简写为Active NN)负责所有客户端的操作,而Standby NameNode(简写为StandBy NN)用来同步Active NameNode的状态信息,以提供快速的故障恢复能力。
为了保证Active NN与StandBy NN节点状态同步,即元数据一致。除了DataNode需要向这些NameNode发送block位置信息外,还构建了一组独特的守护进程:“JournalNodes”(简称JN),用来同步edits信息,当Active NN执行任何有关命名空间的修改,它需要持久化到一半以上的JNS上。而Standby NN负责观察JNs的变化,读取从Active NN发送过来的edits信息,并更新自己内部的命令空间。一旦Active NN遇到错误,StandBy NN需要保证从JNs读出全部的Edits , 然后切换成Active状态 , 如果有多个Standby NN,还会涉及到选主的操作,推选出一份Standby NN切换为Active 状态。
元数据包含两块,一个是静态的,一个是动态的。
静态的是fsimage和edits,其实fsimage是由edits文件合并生成的,所以只需保证edits文件内容的一致性。这个工作是由JournalNodes集群同步的,它保证多个NameNode中edits文件内容的事务性同步。
动态数据是指block和DataNode节点的信息,这个如何保证呢?
当DataNode启动的时候,上报数据信息的时候需要向每个NameNode都上报一份。
这样就可以保证多个NameNode的元数据信息都一样了,当一个NameNode 挂掉以后,立即从Standby NN中选择一个进行接管,集群不会受到影响,因为每个NameNode的元数据都是时刻同步的。
注意:使用集群的时候,不能启动SecondaryNameNode,会出错。因为SecondaryNameNode负责合并edits到fsimage文件,现在这个工作被standby NN负责了。
NameNode可以自动切换,也可以手工切换,如果需要自动切换,需要使用到Zookeeper集群。
使用Zookeeper集群自动切换的原理是这样的:
当多个NameNode启动的时候,会向Zookeeper中注册一个临时节点,当NameNode挂掉的时候,这个临时节点也就消失了,这属于Zookeeper的特性,这个时候,Zookeeper就会有一个watcher监视器监视到,就知道这个节点down掉了,然后会选择一个节点转为Active, 把down掉的节点转为Standby.