HDFS 上传文件和读文件的流程
(1)由客户端 Client 向 NameNode 节点发出请求;
(2)NameNode 向 Client 返回可以存数据的 DataNode 列表,这里遵循机架感应原则(把副本分别放在不同的机架,甚至不同的数据中心);
(3)客户端首先根据返回的信息先将文件分块(Hadoop2.X 版本每一个 block 为128M,而之前的版本为 64M);
(4)通过 NameNode 返回的 DataNode 信息,将文件块以写入方式直接发送给DataNode,同时复制到其他两台机器(默认一份数据,有两个副本);
(5)数据块传送完成以后,dataNode 向 Client 通信,同时向 NameNode 报告;
(6)依照上面(4)到(5)的原理将所有的数据块都上传,结束后向 NameNode 报告表明已经传完所有的数据块。
NameNode 启动的时候,会加载 fsimage
Fsimage 加载过程完成的操作主要是为了:
(1)从 fsimage 中读取该 HDFS 中保存的每一个目录和每一个文件
(2)初始化每个目录和文件的元数据信息
(3)根据目录和文件的路径,构造出整个 namespace 在内存中的镜像
(4)如果是文件,则读取出该文件包含的所有 blockid,并插入到 BlocksMap 中。
HDFS 存储系统中,引入了文件系统的分块概念(block),
块是存储的最小单位,HDFS定义其大小为 64MB。
与单磁盘文件系统相似,存储在 HDFS 上的文件均存储为多个块,不同的是,如果某文件大小没有到达 64MB,该文件也不会占据整个块空间。
在分布式的 HDFS集群上,Hadoop 系统 保证一个块存储在一个 datanode 上。
HDFS 的 namenode 只存储整个文件系统的元数据镜像,这个镜像由配置 dfs.name.dir指定,
datanode 则存有文件的 metainfo 和具体的分块,存储路径由 dfs.data.dir 指定。