NameNode
NameNode是HDFS架构中的主节点(Master)。HDFS架构中只有一个NameNode。NameNode主要负责管理HDFS的元数据,配置副本的放置策略,处理Client请求。
Client
Client主要负责切分文件,与各节点进行交互。
切分文件是把文件分割成数据块(Block)。数据块默认大小是128M,每个数据块有多个副本存储在不同的机器上,副本数可在文件生成时指定 (默认有3个副本)。
交互包括与NameNode进行交互,Client从NameNode获取文件的元数据;从DataNode读取数据和向DataNode写入数据。
元数据是指描述数据属性的数据。数据属性包括存储位置、格式、权限、大小、历史版本等。
为什么HDFS会以文件块的方式来存储数据:
(1)一个文件有可能大于集群中任意一个磁盘,引入块机制可以很好的解决这个问题
(2)使用块作为文件存储的逻辑单位可以简化存储子系统
(3)块非常适合用于数据备份进而提供数据容错能力
(4)副本优点是安全,缺点是占空间
每一个块默认的大小为128M,是可以更改配置的:(这里块的大小以128M为例子,128M为134217728字节)
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
注意当一个文件的大小不足128M时,比如文件大小为2M,那么这个文件也占用一个block,但是这个block实际只占2M的空间,所以从某种意义上来讲,block只是一个逻辑单位。
DataNode
DataNode是HDFS架构中的从节点(Slave)。DataNode负责存储Client发来的数据块,执行数据块的读写操作,汇报存储信息给NameNode。
Secondary NameNode
SecondaryNameNode主要是用来进行镜像备份,对NameNode中的edits文件与fsimage文件进行定期合并。镜像备份是指备份fsimage文件。
心跳机制:
Datanode和Namenode一直保持的心跳连接:每隔一定时间都会向Namenode发送数据包
主要目的:
(1)告知Namenode,只要心跳不停止,认为Datanode一直是存活的状态,一旦停止后,先认为其假死,然后等待一会,如果依然不发送数据,认为真的宕机。
(2)向Namenode报告自己Datanode的块信息,让Namenode时刻更新每个Datanode的block信息。其中block信息是由每个Datanode来存储的,Namenode只是临时存储,每次启动,Datanode都需要重新报告自己所有块信息。
负载均衡机制:
Namenode要保证所有的block块在每个Datanode中存储的数量都是均衡的。
副本机制:
为了防止数据丢失,每个block块都要构建副本,默认情况下HDFS的副本数据为3个。
如果Namenode检测到某一个block副本数量不足3个,此时会自动进行维护block块,自动新增副本,保证为3个,如果检测到block副本数量大于3个,此时Namenode通知对应Datanode删除多余block块。
每一个block块的副本最多和Datanode的节点相等,副本越多,表示数据的可靠性越高,但是对磁盘的消耗比较大。