HDFS(The Hadoop Distributed File System)是Hadoop的可以运行在普通硬件上的分布式文件系统。
1.HDFS特点
1.1 高容错率
HDFS把硬件故障看做常态,来做设计。增加数据副本,冗余存储,利用集群的优势,使数据高可用。集群本身也有错误检测和快速、自动的恢复机制。
1.2 流式数据访问
HDFS是建立在一次写多次读
的模式的概念之上的,HDFS存储的数据集作为hadoop的分析对象。在数据集生成后,长时间在此数据集上进行各种分析。每次分析都将设计该数据集的大部分数据甚至全部数据,因此使用场景大多是,读取整个数据集。流式读取最小化了硬盘的寻址开销,只需要寻址一次,然后就一直读。对于大文件的特点也更适合流式读取。
与流数据访问对应的是随机数据访问
,它要求定位、查询或修改数据的延迟较小,比较适合于创建数据后再多次读写的情况,如传统的关系型数据库。
1.3 适合超大数据集
1.4 移动计算比移动数据更经济
把与计算相关的逻辑,尽量晚的执行。每个节点计算完成以后,再移动数据汇总,而不是把数据汇总之后再进行计算。样就能降低网络阻塞的影响,提高系统数据的吞吐量。
2.Namenode 和 Datanode
HDFS采用master/slave
架构。一个HDFS集群是由一个Namenode和多个的Datanode组成。顾名思义,Namenode是集群的中心服务器,负责管理集群,以及存储元数据,Datanode就是真正存储数据的节点。
Namenode作为集群的中心服务器,主要存储两个东西:
1)所有数据的命名空间(Namespace Image),包括文件名,副本数,文件路径等
2)用户对数据的操作日志(edit log)
Datanode会以块
的形式,存储数据。负责处理Client的读写数据的请求,并周期性发送心跳信号和块状态报告(Blockreport)到Namenode。
2.1 Namenode的单点问题
Namenode是整个分布式文件系统的一个单点故障(single point of failure),一旦故障,整个分布式文件系统就无法使用了,因为无法从blocks中重构出相应的文件了。所以确保Namenode能从失败中及时恢复是很重要的一件事。
应对故障一般有两种做法:
2.1.1 备份Namenode中保存的永久信息
保存多份数据,最常用的做法是把永久信息保存到本地文件系统和某个远程NFS(Network FileSystem)上去。这些多写操作是同步和原子性的,因为Namenode上都是源数据,写少读多,每次保存的量比较小,消耗一些写的性能,来保证集群的健壮,还是值得的。
2.1.2 运行一个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来运行。
2.2 DataNode的数据存储和读取
HDFS把文件转化为另一种数据格式,并以Block的形式,分散存储在每一个DataNode上。
其中Block的默认大小是128M,HDFS为了保证数据的安全,会把同一份Block复制多份副本,分别存储在不同的DataNode上,默认是3个副本。
下面是HDFS写入数据的过程:
下面是HDFS读取数据的过程:
3.结尾
HDFS是Hadoop的主要功能之一,Hadoop的所有计算,都是基于HDFS的存储结构之上的。所以要先梳理好HDFS的基本结构。