HDFS的读写流程面试的重点
挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
客户端通过DistributedFileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
NameNode返回是否可以上传。
客户端请求第一个 Block上传到哪几个DataNode服务器上,NameNode返回3个DataNode节点。
客户端通过FSDataOutputStream模块请求NameNode返回的三个DataNode中的就近的一个节点(dn1)上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。dn1、dn2、dn3逐级应答客户端。
客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。重复执行上述步骤,知道文件上传完毕。
Fsimage文件:是HDFS文件系统元数据的一个永久的检查点,它里面的内容主要包括HDFS文件系统的所有目录和文件inode的序列化信息。
Edits文件:这个文件主要存放的是HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作第一步会记录到Edits文件中。
seen_txid文件是用来保存最后一个edits_数字的文件。
当NameNode启动的时候会将Fsimage文件加载到内存中,同时也会加载Edits文件里面的更新操作,保证内存中的元数据信息是最新的,同步的,我们可以把这一步理解成NameNode启动的时候会把Fsimage和Edits文件合并。
查看Fsimage文件,执行命令:hdfs oiv -p XML -i fsimage_0000000000134673403,下图是Fsimage文件的部分内容,也可以使用命令:hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径