一、SecondaryNameNode
SecondaryNameNode主要负责定期的把edits文件中的内容合并到fsimage中。这个合并操作称为checkpoint,在合并的时候会对edits中的内容进行转换,生成新的内容保存到fsimage文件中。
注意:
- 在NameNode的HA架构中没有SecondaryNameNode进程,文件合并操作会由standbyNameNode负责实现
- 所以在Hadoop集群中,SecondaryNameNode进程不是必须的
二、DataNode
DataNode是提供真实文件数据的存储服务。DataNode有两个重要概念:block、replication
2.1、block
HDFS会按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block,HDFS默认Block大小是 128MB。Blokc块是HDFS读写数据的基本单位,不管你的文件是文本文件、视频、音频文件,针对hdfs而言都是字节。
datanode中数据的具体存储位置是由dfs.datanode.data.dir来控制的,通过查询hdfs-default.xml可以知道
查看具体的文件内容
- HDFS会按照固定的大小,顺序对文件进行划分并编号,划分好的每一块称为一个Block,HDFS默认Block大小是128M
- HDFS中,如果一个文件小于一个数据块的大小,那么并不会占用整个数据块的存储空间
假设我们上传了两个10M的文件 又上传了一个200M的文件?
Q:会产生多少个block块? 4个
Q:在hdfs中会显示几个文件?3个
2.2、Replication
多副本机制,HDFS默认副本数量为3
三、NameNode与DataNode的关系
NameNode维护了两份数据:
- file与block list的关系。对应的关系信息存储在fsimage和edits文件中,当NameNode启动的时候会把文件中的元数据信息加载到内存中
- datanode与block的关系,对应的关系主要在集群启动的时候保存在内存中,当DataNode启动时会把当前节点上的Block信息和节点信息上报给NameNode
四、HDFS回收站
HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户在Shell命令行删除的 文件/目录,会进入到对应的回收站目录中,在回收站中的数据都有一个生存周期,也就是当回收站中的 文件/目录在一段时间之内没有被用户恢复的话,HDFS就会自动的把这个文件/目录彻底删除,之后,用户就永远也找不回这个文件/目录了。
默认情况下hdfs的回收站是没有开启的,需要通过一个配置来开启,在core-site.xml中添加如下配置,value的单位是分钟,1440分钟表示是一天的生存周期。
core-site.xml的配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop_repo</value>
</property>
<!--回收站配置-->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>
-
先暂停Hadoop
sbin/stop-all.sh
-
修改core-site.xml
cd /root/software/hadoop-3.3.4/etc/hadoop
-
重启服务
sbin/start-all.sh
-
删除一个文件尝试下
hdfs dfs -rm /README.txt
-
浏览器查看
http://192.168.234.100:9870/explorer.html#/user/root/.Trash/Current
注意:
如果删除文件过大,超过回收站大小的话会提示删除失败。需要指定参数 -skipTrash ,指定这个参数表示删除的文件不会进回收站
hdfs dfs -rm -skipTrash /README.txt
五、HDFS的安全模式
平时操作HDFS的时候,有时候可能会遇到这个问题,特别是刚启动集群的时候去上传或者删除文件,会发现报错,提示NameNode处于safe mode。
这个属于HDFS的安全模式,因为在集群每次重新启动的时候,HDFS都会检查集群中文件信息是否完整,例如副本是否缺少之类的信息,所以这个时间段内是不允许对集群有修改操作的,如果遇到了这个情况,可以稍微等一会,等HDFS自检完毕,就会自动退出安全模式。
5.1、查看安全模式
hdfs dfsadmin -safemode get
如果想快速离开安全模式,可以通过命令强制离开
hdfs dfsadmin -safemode leave
正常情况下建议等HDFS自检完毕,自动退出
六、HDFS的高可用和高扩展
6.1、高可用(HA)Highly Available
我们前面分析了NameNode负责接收用户的操作请求,所有的读写请求都会经过它,如果它挂了怎么办?这个时候集群是不是就无法正常提供服务了?是的,那现在我们这个集群就太不稳定了,因为NameNode只有一个,是存在单点故障的。
所以在HDFS的设计中,NameNode也是可以支持多个的,一个主的多个备用的,当主的挂掉了,备用的可以顶上去,这样就可以解决NameNode节点宕机导致的单点故障问题了,也就实现了HDFS的高可用
解决方案:
NameNode 切换可以自动切换,也可以手工切换,如果想要实现自动切换,需要使用到zookeeper集群。 使用zookeeper集群自动切换的原理是这样的: 当多个NameNode 启动的时候
- 会向zookeeper中注册一个临时节点,当NameNode挂掉的时候,这个临时节点也就消失了(这属于zookeeper的特性)
- zookeeper就会有一个watcher监视器监视到,就知道这个节点down掉了,然后会选择一个节点转为Active,把down掉的节点转为Standby。
6.2、高扩展
NameNode节点的内存是有限的,只能存储有限的文件个数,那使用一个主NameNode,多个备用的NameNode能解决这个问题吗?
解决方案:
Federation可解决单一命名空间的一些问题,提供以下特性
- HDFS集群扩展性
- 性能更高效
- 良好的隔离性