Block(数据块):
- HDFS上面基本默认的基本存储单位,大小一般为128M
- 一个大的文件会被拆分成一个个的数据块,然后存储在不同的机器。若小于block的大小,则实际占用的空间为其文件的大小
- 基本的读写单位,每次读的都是一个块,每个块都会被复制到多台机器
HDFS采用的是master/slave 架构。一个HDFS集群是由一个NameNode和多个DataNode构成。
NameNode(元数据节点)和DataNode(数据节点):
NameNode是集群的中心服务器,负责管理集群,以及存储元数据,DataNode就是真正存储数据的节点。
NameNode作为集群的中心服务器,主要存储两个东西:
- 所有数据的命名空间(Namespace Image),包括文件名,副本数,文件路径等
- 用户对数据的操作日志(edit log)
DataNode会以数据块的形式存储数据。负责处理Client的读写数据的请求,并周期性发送心跳信号和块状态报告到NameNode。DataNode之间也会进行通信,复制数据块,保证数据的冗余性
NameNode的单点问题:
Namenode是整个分布式文件系统的一个单点故障,一旦故障,整个分布式文件系统就无法使用了,因为无法从blocks中重构出相应的文件了。所以确保Namenode能从失败中及时恢复是很重要的一件事。
一般应对的方法有两种:
- 备份NameNode中保存的永久信息
保存多份数据,最常用的做法是把永久信息保存到本地文件系统和某个远程NFS上去。这些多写操作是同步和原子性的,因为NameNode上都是源数据,写少读多,每次保存的量比较小,消耗一些写的性能,来保证集群的健壮,还是值得的。 - 运行一个Secondary NameNode
它最主要的工作就是把namespace image检查点文件与edit log相融合(以防止edit log过大)并把融合后的namespace image保存在自己的本地文件系统上,同时发送这个新的备份给namenode。
由于secondary namenode上保存的状态信息总是要滞后于namenode上的状态信息的缘故(未融合的edit log记录了这一部分改变),如果namenode完全失败,数据肯定要丢失一部分。
最保险最常用的方式,是把上述两种方法结合起来,也即当namenode故障时,把远端NFS上的namespace image拷贝到secondary namenode上,然后把secondary namenode当做namenode来运行。
DataNode的数据存储和读取:
-
写入数据:
-
读取数据: