前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YARN聚合文件格式

YARN聚合文件格式

作者头像
陈猿解码
发布2023-02-28 14:40:53
4930
发布2023-02-28 14:40:53
举报
文章被收录于专栏:陈猿解码

【前言】

我们都知道日志聚合后的文件是存放在HDFS中的,然而每个application可能会有很多的container,每个container又有多个日志文件,那么日志聚合后,这些日志文件在HDFS中是怎样进行存放的。本文就来聊聊hadoop日志聚合后的文件格式及相关内容。

【TFile&BCFile】

在HDFS中,提供了多种文件格式,有普通的文件文件格式和二进制格式;用于KV键值对存储的SequenceFile,TFile;有用于列式存储的parquet,rc,orc等格式。

这里重点要说的是TFile,因为聚合后的日志文件就是采用这种格式进行存储的。

提到TFile,那么就不得不提起BCFile,因为BCFile是TFile的底层物理存储层。

BCFile是Block Compresed File的缩写,顾名思义,数据的存储是按照一个一个的Block进行存储的,同时这些block是可以进行压缩存储的。按照作用这些block可以分为数据块(DataBlock)和元数据块(MetaBlock),数据块通常就是要写入的数据内容,而元数据块可以自定义写入,BCFile也会将数据块的索引信息记录下来作为元数据块写入到文件中。

BCFile的具体格式如下图所示:

  • 文件的开头是一个16字节的魔数;
  • 接着是一个一个的数据块;
  • 数据块之后是一个或多个可选的自定义写入的元数据块;
  • 然后是数据块的索引信息(DataIndex,本质上也是一个元数据块),索引信息记录了block采用的压缩方式(例如gz,lzo),数据块的个数,以及每个数据块的起始偏移位置,原始长度,压缩后的长度;
  • 数据块索引信息之后存放的是元数据块的索引信息(MetaIndex),同样包括元数据块的个数,每个元数据块的名称,每个元数据块使用的压缩方式,起始偏移位置,原始长度与压缩后的长度;
  • 再跟着的是16字节的数据块索引的起始偏移位置(MetaIndexOffset);
  • 然后是BCFile的版本信息;最后以16字节的魔数结束。

了解了BCFile后,再来看TFile的格式。TFile本身是一堆KV的容器,Key和Value均为无类型的字节数据,其中Key的长度限制为64KB,而Value的长度则没有限制。

尽管TFile保存的是KV键值对,但底层采用的是BCFile,所以实际上就是将不同的KV存放在不同的数据块中(注:一个KV只会存在于一个数据块中,不会出现Key存放在一个block中,value存放到另外一个block的情况,也不会出现一个value跨block存放的情况)

另外,TFile还定义了两个元数据块,一个叫TFile.meta,记录了TFile的版本号信息、TFile中KV键值对的总数、以及用于对Key进行排序的排序算法名;另外一个元数据块叫TFile.index,记录了TFile中第一个Key的长度及名称,每个数据块中最后一个Key的名称、以及每个数据块中KV键值对的个数。

具体格式如下图所示:

注:KV键值对在写入的时候,有几个小细节

  • Key和Value的写入都调用writeUTF函数写入,这意味着真正的key,value的具体值之前会有2字节的长度信息,即标识后面值的长度;对于key的写入,额外还会再单独以1个字节记录key的长度(包括前面提到的2字节的长度信息);对于value则按照chunk的编码方式写入。
  • TFileIndexEntry在写入时候,也会先在头部写入整个Entry的长度,然后再写入Entry的内容。

【日志聚合的文件格式】

有了前面的铺垫,再来看看日志聚合的文件是怎么在TFile中存储的。

由于TFile本质上是KV键值对的容器,因此可以变相理解为日志聚合后的文件中包含了哪些KV键值对,具体存储的KV包括:

  • Applicaiton的版本号(VERSION),value是一个固定值
  • Application的ACL信息(APPLICATION_ACL),value是一个列表,包括view_app和modify_app
  • Application的owner信息(APPLICATION_OWNER),value是一个字符串数据
  • Container的ID,value则是这个Container的所有日志信息,包括每个日志的文件名、文件长度、日志文件的具体内容。

【实际文件分析】

下面就以一个实际的文件按照上面的说明对照进行分析下。

有几个需要注意的地方:

  • 日志文件的长度信息在写入时,会将长度转换成字符串再写入,例如syslog日志文件的长度为22113,对应的二进制信息为“3232313133"。
  • 数据块索引于元数据索引信息中会记录偏移位置,这个偏移位置并不是直接转换成16进制进行存储的,而是有一定的规则,具体为:

【总结】

本文总结了日志聚合文件的格式。从格式中可以看到,TFile的元数据信息结合BCFile中的数据块索引信息就可以知道每个数据块的第一个key和最后一个key的偏移位置,这样可以快速的从前或从后进行遍历查找。另外,不难猜到,文件的读取是从尾部开始,先读取元数据块索引文件的偏移位置信息,然后移动到该位置读取元数据块索引的信息,进而得到数据块索引的偏移位置,再移动到该位置读取数据块索引信息,得到每个数据块的偏移位置,数据块中的kv个数等。实际上下载某个container的日志文件时,确实也是按照该方式进行的。有兴趣的可以阅读相关源码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈猿解码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档