了解:
fsimage
namenode的元数据镜像文件,一般称为检查点
editlog
namenode操作日志
fsimage、editlog位置:查看hdfs-site.xml,查看 dfs.namenode.name.dir的配置值,目录下有这俩文件(不带md5尾缀的文件)
block
块。hdfs已块为单位进行存储,使用hdfs数据的程序也以块为单位分配初始线程。根据版本不同块大小不同,文件按块大小进行切分。例:块128M,文件300M,就会切分为128M,128M,44M三个块。
packet
packet是dn之间块同步或者client与dn建立数据传输时的基本单位,默认64kb。
chunk
数据校验的基本单位,默认512b,
读写流程:
写:
- client端向nn发出写文件请求。
- nn检查是否已存在文件、检查权限。若通过检查,先将操作写入EditLog(如果中途失败,可以按日志内操作顺序重新操作),然后扫dn,返回一个可写数据得dn地址列表。
- client端按对应版本块大小(1.x版本 64M,2.X版本 128M)的块切分文件。
- client将nn返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个dn写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。(注意写的是块的基本单位parket,所以不是写好一个块之后才向下一个dn写,如果按块来说是异步。)
- 每个dn写完一个块后,会返回确认信息。(在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中)
- 写完数据,关闭输输出流。
- 发送完成信号给nn。
读:
- client端访问nn,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象
- 就近与一台dn建立输入流
- dn向输入流中中写数据,以packet为单位来校验
- 关闭输入流