一、HDFS最基本运行流程
1.组成:
NameNode: 存放文件的元数据信息(数据分成了多少个block,多少副本,不同的block分到了哪些DataNode上),也即hdfs文件系统中的文件与真实的block之间的映射关系。其格式为:
filename,replicas,block_id,id2host(文件名,副本数,block_id,block到主机NameNode的映射),结合上图好好体会。
DataNode:数据节点,提供真实文件数据的存储服务,即存储的是blocks。不同的数据节点在不同的主机上,多个主机可以在一个rack(机架)上,这样一个rack断电,其他rack仍然工作。分布式存储可以有效降低负载,提高数据的可靠性以及访问的吞吐量。
Secondary NameNode: 主要负责将操作日志文件中的元数据信息与元数据镜像文件合并。这个下面会具体讲工作流程,这里先忽略。
2.HDFS基本机制:
因为这里和下面讲的有很大重叠,所以这里先
浅讲。
(1) 首先,client上传文件到HDFS文件系统的虚拟目录/hdfs://host-name:9000/…下,它以为数据就存放在这个目录下,其实不然,但对于用户,它只需这样以为就足够了。
(2)实际上,在client提出上传请求时,NameNode会响应它元数据信息,告诉client文件应该分成多少块,存放在哪些DataNode上;同时也会告诉datanode应该复制多少样本,复制在哪。
(3)然后,另一个client想下载这个文件,它会在虚拟目录/hdfs://host-name:9000/…下直接下载得到文件,它以为它是这样得到的,其实不然,但对于用户,它只需这样以为就足够了。
(4)实际上,client请求下载时,NameNode会告诉它在哪些datanode中下载。然后,client去对应的datanode中把block下载下来,合并成一个block得到最终的完整的文件。
二、HDFS具体的工作原理
1. 写文件到HDFS
1.client上传文件到hdfs,发出上传请求
2.Namenode首先往edits中记录元数据操作日志,并返回元数据信息给client(即分成多少block,不同block放在哪些datanode上)
3.client根据namenode返回的信息,对文件进行切分,写入到datanode中
4.datanode再将block复制到其他datanode上,并向namenode返回成功信息,若失败,则重新分配datanode进行复制
5.client上传文件成功后,将成功信息返回给NameNode,NameNode将本次元数据信息写入内存(方便数据的读取)
6.当edits写满时,需要将这一段时间内新的元数据刷到fs_image文件中,这个过程在secondary namenode中进行
6.1 首先Namenode通知Secondary Namenode进行checkpoint操作
6.2 然后Namenode会停止往edits中写数据,而是生成一个edits.new文件,数据写入edits.new
6.3 secondary namenode会从namenode下载 fs_image 和 edits,合并为fs_image.checkpoint
6.4 secondary namenode将fs_image.checkpoint上传到namenode,改名为fs_image,替换原文件;同时edits.new改名为edits,并替换原文件
2. 从HDFS读文件
读文件这块就和浅讲里一样,我们通过具体的presentation来讲述
(事先清空了HDFS里的文件,并上传了一个大于128M的压缩包文件(jdk-8u151-linux-x64.tar.gz)到HDFS系统)
首先,在server中dfs的服务器存储目录下,我们有一个文件的两个数据块
然后,client把这两个数据块下载下来,我们把它们复制到home下,模拟文件下载的过程(因为真实情况你是看不到下载数据块并合并这两个过程的)。
接着,手动合并:
cat blk_...89 >> blk_...88
这样的话,合并后的文件应该就是完整的文件,进行解压验证。
然后,解压:
tar -zxvf blk_...88
得到了解压后的文件,说明合并后的文件就是完整的文件。
另外,再上传一个小文件(jpg 图片) ,我们在服务器存储目录下,发现了该block:
这再次说明,大block经过合并,就是完整文件,小block就是完整文件。