Hadoop分布式文件系统HDFS
Hadoop分布式文件系统HDFS
HDFS文件系统由以下守护进程协调地运行提供服务:NameNode进程
SecondaryNameNode进程
DataNode进程
HDFS是主从架构。运行NameNode进程的服务器是主节点,运行DataNode进程的服务器是从节点。集群上的每个从节点都会运行一个DataNode进程。这个DataNode进程管理着挂在到这个DataNode上的存储设备。HDFS系统提供一个统一的文件系统命名空间。NameNode进程负责管理这些存储在集群上文件的元数据。
1. Hadoop文件的本质是块存储
在Hadoop系统,每个文件被分割成多个数据块。一般数据块的大小为64M,也可配置为32M或128M。
每个数据块存储在DataNode上。为了防止节点故障,这些数据块是有备份的。在Hadoop系统中,备份数量默认配置为3。
NameNode具有RackAware机架感知功能,这个可以配置:
若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同副本2机架的另一个节点上;其他副本随机挑选。
若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2机架的另一个节点上;其他副本随机挑选。
若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同副本2机架的另一个节点上;其他副本随机挑选。
若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2机架的另一个节点上;其他副本随机挑选。
2. 文件元数据和NameNode
文件元数据信息是由NameNode负责维护的。
NameNode管理所有的文件操作,包括文件/目录的打开、关闭、重命名、移动等待。DataNode是负责存储实际的文件数据。当客户端请求或发送文件数据,文件的数据在物理上是不经过NameNode传输的。客户端仅是简单地从NameNode获取文件的元数据,再根据其元数据信息直接从DataNode获取文件的数据块。
NameNode存储的一些元数据包括:
- 文件/目录名称及其相对于父目录的位置;
- 文件和目录的所有权及权限;
- 各个数据块的文件名。
NameNode并不存储每个数据块的位置。每个数据块的位置是在集群启动时从每个DataNode获取的。NameNode维护的信息是HDFS的文件由哪些数据块组成。
元数据存储在NameNode的本地磁盘,为了快速访问,在集群操作时会把这些元信息加载到内存。
3. HDFS系统写操作
有一个文件FileA,100M大小。Client将FileA写入到HDFS上。
HDFS按默认配置。
HDFS分布在三个机架上Rack1,Rack2,Rack3。
a. Client将FileA按64M分块。分成两块,block1和Block2;
b. Client向nameNode发送写数据请求,如图蓝色虚线①------>。
c. NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②--------->。
Block1: host2,host1,host3
Block2: host7,host8,host4
d. client向DataNode发送block1;发送过程是以流式写入。
流式写入过程,
1>将64M的block1按64k的package划分;
2>然后将第一个package发送给host2;
3>host2接收完后,将第一个package发送给host1,同时client想host2发送第二个package;
4>host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。
5>以此类推,如图红线实线所示,直到将block1发送完毕。
6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。
7>client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线
8>发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示。
9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。
10>client向NameNode发送消息,说我写完了,如图黄色粗实线。。。这样就完毕了。
分析,通过写过程,我们可以了解到:
①写1T文件,我们需要3T的存储,3T的网络流量带宽。
②在执行读或写的过程中,NameNode和DataNode通过HeartBeat进行保存通信,确定DataNode活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去。读取时,要读其他节点去。
③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份。
4. HDFS系统读操作
那么,读操作流程为:
a. client向namenode发送读请求。
b. namenode查看Metadata信息,返回fileA的block的位置。
block1:host2,host1,host3
block2:host7,host8,host4
c. block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后block2,去host7上读取;
上面例子中,client位于机架外,那么如果client位于机架内某个DataNode上,例如,client是host6。那么读取的时候,遵循的规律是:
优选读取本机架上的数据。