导读
1、edits.log 是什么?
2、fsimage 是什么?
3、如何寻找文件,又如何通过文件寻找到对应的block?文件和block是怎么映射?
edits.log
概念
edits.log ,hdfs编辑日志文件。记录了客户端对hdfs的所有更改记录。比如增删,重名名文件、目录等操作。namenode启动后,先将fsimage元数据读取到内存中,再借助最新的edits.log在内存回放操作后,得到hdfs最新的元数据信息。------------edits.log类似mysql的binlog。
存储位置
我的edits.log 存储的路径在:/kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits/current/
edits.log存储路径说明:
①为hdfs-site.xml中属性dfs.namenode.edits.dir的值决定;用于namenode保存edits.log文件
因edits.log是二进制的,可通过下面命令进行导出成xml,进行查看内容
hdfs oev -i edits_0000000000000001037-0000000000000001056 -o /home/hadoop/edit2.xml
edits.log
edits.log 内容
image.png (1) edits记录一个文件上传的事务:
OP_ADD ->
OP_ALLOCATE_BLOCK_ID -> OP_SET_GENSTAMP_V2 -> OP_ADD_BLOCK ->
OP_ALLOCATE_BLOCK_ID -> OP_SET_GENSTAMP_V2 -> OP_ADD_BLOCK ->
... (多少个block,执行多少次分配)
OP_CLOSE -> OP_RENAME_OLD
说明:<NUM_BYTES>0</NUM_BYTES> 在执行op_add_block操作时为0,拷贝完成后才会变成实际大小。
fsimage
概念
fsimage:HDFS元数据镜像文件。nn初始化后,fsimage一开始为fsimage_0 ,内容为空。后续的fsimage文件,都是跟edits.log整合后生成的,而不是直接从nn的内存直接落入到文件的。
②为hdfs-site.xml中属性dfs.namenode.name.dir的值决定;用于namenode保存fsimage文件
https://www.aboutyun.com/thread-7604-1-1.html
通过fsimage我们可以看到,namenode内存中的元数据信息,包含了文件的block id。
我们的文件对应的block id映射信息存在BlocksMap中,那么BlocksMap存在什么位置?BlocksMap存放于fsimage文件中。
BlocksMap
从以上fsimage中加载如namenode内存中的信息中可以很明显的看出,在fsimage中,并没有记录每一个block对应到哪几个datanodes的对应表信息,而只是存储了所有的关于namespace的相关信息。而真正每个block对应到datanodes列表的信息在hadoop中并没有进行持久化存储,而是在所有datanode启动时,每个datanode对本地磁盘进行扫描,将本datanode上保存的block信息汇报给namenode,namenode在接收到每个datanode的块信息汇报后,将接收到的块信息,以及其所在的datanode信息等保存在内存中。HDFS就是通过这种块信息汇报的方式来完成 block -> datanodes list的对应表构建。Datanode向namenode汇报块信息的过程叫做blockReport,而namenode将block -> datanodes list的对应表信息保存在一个叫BlocksMap的数据结构中。
BlocksMap的内部数据结构如下:
image如上图显示,BlocksMap实际上就是一个key为Block对象,value为BlockInfo对象的一个Map表,其中Block对象中只记录了 blockid,block大小以及时间戳信息,这些信息在fsimage中都有记录。而BlockInfo是从Block对象继承而来,因此除了 Block对象中保存的信息外,还包括代表该block所属的HDFS文件的INodeFile对象引用以及该block所属datanodes列表的信息(即上图中的DN1,DN2,DN3,该数据结构会在下文详述)。
因此在namenode启动并加载fsimage完成之后,实际上BlocksMap中的key,也就是Block对象都已经加载到 BlocksMap中,每个key对应的value(BlockInfo)中,除了表示其所属的datanodes列表的数组为空外,其他信息也都已经成功加载。所以可以说:fsimage加载完毕后,BlocksMap中仅缺少每个块对应到其所属的datanodes list的对应关系信息。所缺这些信息,就是通过上文提到的从各datanode接收blockReport来构建。当所有的datanode汇报给namenode的blockReport处理完毕后,BlocksMap整个结构也就构建完成
image.png image.png思考
namenode是从哪里获知文件块的位置?
比如:hdfs fsck 信息才哪里来?保存在内存还是文件?
网友评论