HDFS是Hadoop的分布式文件存储系统,HDFS的组成是通过NameNode与DataNodes来管理,其中NameNode只有一个,用来管理文件系统的元数据,元数据就是一个文件的基本信息,在windows系统中,一个文件的元数据可以通过属性或者通过详细信息可以查看,主要包括:文件名,文件的创建的时间,文件的大小,文件的所有者等。在HDFS中一个文件是被分为不同块来存储的,因此,NanmeNode管理的元数据,包括文件名,文件的大小,文件被分为的block数量,每个block的位置,以及之间的顺序等。
而DataNodes,主要是用来存储具体数据即(block),每个block最大的为128M(在hadoop2.x中,在hadoop1.x中为64M),这里每个集群只有一个NameNode,当NameNode发生故障之后,整个文件系统将无法正常的工作,这时,引入了Secondary NameNode来辅助NameNode,当NameNode发生故障时,通过SecondaryNameNode来进行工作。具体的框架图如下:
HDFS的工作原理:
(1)客户端写入操作:
场景:客户端向hdfs系统写入一个文件file,500M大小,
HDFS分布在三个机架上Rack1,Rack2。
1): 客户端会根据file的大小将其按64M分块。分成两块,block1和Block2;
2):客户端向NameNode发送写数据请求。
3):NameNode节点接受客户端的写入请求,之后记录block信息。并返回可用的DataNode。
返回的信息(每个block分配的主机名):
Block1: host2,host1,host3
Block2: host7,host8,host4
NameNode具有RackAware机架感知功能,这个可以配置。DataNode节点存储block的规则:
a 若client为DataNode节点,那存储block时,副本1,同客户端所在的同一个节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;hadoop中默认的是三个副本,但是可以自己配置副本的数量,如果有超过3个,其他副本随机挑选。
b 若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。
4): 客户端向DataNode发送block1数据;发送过程是以流式写入。
流式写入过程:写入的时候客户端会将每个block按照64k的大小进行分包,以包的形式发送给DataNode
a将64M的block1按64k的package划分;
b将第一个package发送给host2;
c host2接收完后,将第一个package发送给host1,同时客户端向host2发送第二个package;
d host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。
e 依次类推,直到将block1发送完毕。
f 然后 host2,host1,host3向NameNode,同时 host2向客户端发送“block1发送完”通知。
g 客户端收到host2发来的消息后,向namenode发送“block1 写完”的消息,这样就完成了一个block的写入工作。
h 发送完block1后,再向host7,host8,host4发送block2,具体步骤与block1 一样,这里注意到block1与block2 不一定在同一个主机上,甚至不在同一机架上。
i 发送完block2后,host7,host8,host4向NameNode,host7向客户端发送通知。
j 客户端向NameNode发送“消息写完”消息。
这里值得注意:
在执行读或写的过程中,NameNode和DataNode通过HeartBeat(心跳)进行保存通信,确定DataNode活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去。读取时,要读其他节点去。
读取操作相比写入操作,简洁点。
1).首先客户端向NameNode发送读的请求。
2). NameNode查看元数据信息,返回file的block的位置以及block的数序。
block1:host2,host1,host3
block2:host7,host8,host4
3). block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后block2,去host7上读取;
优选读取本机架上的数据。