一、NameNode、SecondaryNameNode以及DataNode
1> Namenode(NN):元数据节点 ----> 存储的是目录
一个HDFS集群只有一个活跃的NN。
NameNode被格式化之后,将在Hadoop的/data/tmp/dfs/name/current目录中产生如下文件:
fsimage_0000000000000000000 fsimage_0000000000000000000.md5 seen_txid VERSION
1、Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
2、Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
3、seen_txid文件:保存的是一个数字,就是最后一个edits_的数字。
4、每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。
edits文件会特别多,namenode会将这些edits传给Secondarynamenode(理解为秘书),
由它来存储并合并,在将合并后的Fsimage文件传回给namenode。
2> SecondaryNameNode(SNN): 从元数据节点 ----> 相当于Namenode的秘书
接受namenode传来的edits文件按,并每隔一段时间后将他们合并压缩成一个Fsimage文件,将他传回给Namenode,Namenode需要的时候直接从这里读取就即可,没有再去读edits文件。
3> DataNode(DN):数据节点 ----> 真正存储数据并进行备份的地方
保存、检索Block。接收的数据真正存储的地方。一个集群可以有多个数据节点。
二、读写过程
1、HDFS副本机制:
为避免数据丢失,创建多个数据的副本,他的存放满足以下特点:
副本默认书为3份。
一个在本地机架节点 一个在同机架不同节点 (通过机架感知) 一个在不同机架上的某一节点
2、读文件
客户端发出请求,传递给DistributedFilesystem,由他向Namenode申请,Namenode获取对应的数据所在块的位置,传递给他,他再返回给客户端;客户端通过这个位置信息,依靠FSDataInputStream去读取相应位置上的文件
3、写文件
客户端发出请求,传递给DistributedFilesystem,由他向Namenode申请,Namenode获取距离客户端最接近的节点位置,传递给他,他再返回给客户端;客户端通过这个位置信息,以FSDataOutputStream去在对应的节点上存储数据,存储完成后,通过机架感应,在同机架的另一个节点位置上再写(备份),这一步完成后,再去其他的任意机架上的某一节点,再去备份。这样存储的数据就有三份(副本机制)。