美文网首页
HDFS 如何寻找文件对应的block?

HDFS 如何寻找文件对应的block?

作者: 我要进大厂 | 来源:发表于2021-09-03 21:44 被阅读0次

    导读

    1、edits.log 是什么?
    2、fsimage 是什么?
    3、如何寻找文件,又如何通过文件寻找到对应的block?文件和block是怎么映射?

    hadoop2.7.3 官方文档

    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/

    说明:
    ①为hdfs-site.xml中属性dfs.namenode.edits.dir的值决定;用于namenode保存edits.log文件

    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 信息才哪里来?保存在内存还是文件?

    image.png

    https://www.aboutyun.com/thread-7604-1-1.html

    相关文章

      网友评论

          本文标题:HDFS 如何寻找文件对应的block?

          本文链接:https://www.haomeiwen.com/subject/kddhzctx.html