ArgoDB Holodesk表格式对应的小文件合并方法 (Compact Service)

友情链接:


前情提要

在实际业务中,小文件现象出现频率并不低,当小文件过多时,将会导致内存占用高、集群不稳定,增加计算资源的开支等一系列问题,因此解决小文件问题迫在眉睫!!

由于篇幅限制,欲了解小文件出现背景,原因分析,为什么要治理小文件,小文件过多的危害等方面的内容,可参考:【小文件详解】不同阶段下的小文件治理最佳解决手段

在前面介绍小文件治理相关的文章中有提到,小文件治理无外乎三个阶段,存储端、计算端以及SQL端。其中存储端合并指的是说当表中有小文件或者小文件过多时,可以通过合并已经写入到存储的文件来治理,主要适用于以下原因导致的小文件问题:

  • 频繁的写入数据;
  • torc表compact多次合并失败后进入黑名单,导致小文件不再继续合并;
  • 历史数据流程导致小文件问题,这些数据一般是从别的数据库迁移过来,后续没有进行治理;

但是,不同的表格式的合并方式不同

本篇文章主要为读者介绍如何针对Holodesk表做合并。


背景介绍

Holodesk表与Torc表delta跟base文件产生的条件不一样,其所有的写操作都会在底层写入一个新的文件,而不是写入已有文件中。其中,insert操作生成新的base文件, update/delete操作生成新的delta文件。当进行频繁的小数据量的写入操作,会导致出现大量的 base/delta 文件,并且内容很少(KB 级别),因此为了避免出现IO开销大,影响性能,内存占用高等一系列问题,小文件合并功能至关重要。

Holodesk表的合并由compact service组件执行,需要单独安装。

常见的小文件合并功能是通过计算引擎服务来执行 Compact 任务的,可能会占用部分计算资源。新推出的Compact Service则在组件级别做了隔离,开启后不会影响到Quark的查询计算性能,合并效果更好。


Compact类型

Holodesk中的Compact类型主要分为三类:minor,major,full。

Minor

将一个base文件下的多个delta文件合并成一个新的delta文件,并apply到原有的base文件上:

命令:alter table <table_name> compact 'minor';
image.png

Major

将一个base文件和它的所有delta文件合并成一个新的base文件:

命令:alter table <table_name> compact 'major';
image.png

Full

将多个小的base文件合并成一个新的base文件,并且会一并删除delta文件:

命令:alter table <table_name> compact 'full';
image.png


执行方式

A. 同步compact(自动)

安装了compact service,且服务正常的话,compact的任务由compactservice来做。

默认是 compact‘full’,用户可以根据业务特点,自定义小文件自动合并策略,平衡小文件数量和合并开销。

  • holodesk.compaction.trigger.enabled

用于控制是否通过Compact Service 服务执行 Compact 任务。若设置为 false,则由计算引擎服务执行 Compact 任务。

引入版本:2.1 作用域:session、global
默认值:true 范围:true、false

作用:Compact Service 是 ArgoDB 上的小文件合并专用服务。设置该参数TRUE,能够通过 Compact Service 进行小文件合并任务,小文件合并效果更好。

影响:设置该参数False,则通过计算引擎服务执行 Compact 任务,可能占用计算资源。

限制:如果 Compact Service 服务服务/异常,那么该参数失效,此时通过计算引擎服务执行 Compact 任务。

  • holodesk.fullcompaction.filesize.threshold

用于控制一个 Base 文件是否属于小文件,大于阈值的 Base 文件不是小文件,不会进行 Full Compact

引入版本:2.1 作用域:global(通过 Manager 对 Compact Service 设置参数)
默认值:134217728(128M) 范围:单位Byte

影响:阈值越大,越容易触发 Full Compact

  • holodesk.fullcompaction.filenum.threshold

用于控制full compact触发阈值,当小文件数量(block)超过阈值时合并

a. 如果是非分区分桶表,那么相同 tablet 上的小文件超过阈值时合并

b. 如果是分区表,那么相同分区,相同 tablet 的小文件超过阈值时合并

c. 如果是分桶表,那么相同bucket,相同 tablet 的小文件超过阈值时合并

d. 如果是分区分桶表,那么相同分区、相同 bucket、相同 tablet 的小文件超过阈值时合并

引入版本:2.1 作用域:global(通过 Manager 对 Compact Service 设置参数)
默认值:3 范围:[1,+∞)

作用:full compaction 通过合并 base 文件来减少小文件数量

影响:阈值越小,越容易触发 Full Compact

  • holodesk.majorcompaction.delta.filesize.ratio

用于控制 Major Compact 触发阈值,当 delta size/ base size 超过阈值时合并

引入版本:2.1 作用域:global(通过 Manager 对 Compact Service 设置参数)
默认值:0.2 范围:(0,1)

作用:Major Compact 通过合并 Base 文件以及 Delta 文件来减少小文件数量

影响:阈值越小,越容易触发 Major Compact

  • holodesk.minorcompaction.delta.filenum.threshold

用于控制 Minor Compact 触发阈值,当一个 Base 文件的 Delta 文件数量超过阈值时,触发 delta 文件之间的合并。

引入版本:2.1 作用域:global(通过 Manager 对 Compact Service 设置参数)
默认值:3 范围:[1,+∞)

作用:Minor Compact 通过合并 Base 文件的多个 Delta 文件来减少小文件数量

影响:阈值越小,越容易触发 Minor Compact

此外,还有一些参数,建议减少以下 Compact Senice 服务的参数值,增加触发 Compact的频率,防止小文件个数太多影响读取的性能,也能防止文件生成的速率快过Compact 的性能,导致小文件个数超过 50000 ,实时写入任务失败。
参数 默认值(单位) 说明
holodesk.compact.init.interval 60(s) 设置 Init 线程 SLEEP 的时间
holodesk.compact.table.interval 300(s) 设置同一张表同一分区执行 Compact 的最低间隔
holodesk.compact.thread.max 10 限制执行 COMPACT 的最大并发数
holodesk.compact.worker.interval 20(s) 设置 worker 线程运行周期中 SLEEP 的时间
holodesk.fullcompaction.single.task.filenum.threshold 50(个) 控制 fullcompact 单个 task 处理的小文件数量上限


B. 异步compact(手动)

通过 DBA Service 的存储 > 数据库菜单页面,我们可以查看各表当前的小文件数量。在特殊情况下,例如未合理设置自动合并策略或某个表因历史原因小文件数量过多,我们可以通过手动触发下述命令,立即执行小文件合并任务。

  • alter table <table_name> compact ‘full’;
  • alter table <table_name> compact ‘major’;
  • alter table <table_name> compact ‘minor’;
ArgoDB 执行 SQL 任务时,其 Task 数量与数据文件数量(base文件)有关,因此 full compact 能够通过减少数据文件数量来减少 Task 数。

接下来,我们介绍如何通过 DBA Service 查看表的小文件数量,找出异常表后并执行手动 Compact 操作。

  1. 登录 Transwarp Manager 平台。
  2. 选择仪表盘 > 集群页面,单击 DBAService 进入服务详情界面。
  3. 选择角色,然后查看 DBA Service Server 角色网址并访问。
  4. 输入账号和密码,填写验证码后进入 DBAService 首页,然后单击对应的 Qaruk 服务。
  5. 在左侧导航栏,单击存储 > 数据库,然后在统计标签页筛选表类型(如 Holodesk),并基于小文件数量排序,查看是否存在小文件异常多的表。

image.png

6. 单击相关库名后,下拉查看对应的表名,随后登录 ArgoDB 数据库,在业务低峰期执行下述格式的命令,对指定的表执行合并小文件任务。

ALTER TABLE <table_name> compact "full"|"major"|"minor";
  • full:将 base 文件合并成一个 base 文件,并且删除无用的 delta 文件
  • major:将 base 及其 delta 文件合并,生成一个新的 base 文件
  • minor:将 base 的 delta 文件合并,生成一个新的 delta 文件
【示例】
对 demodb 数据库中的 customer 表执行 FULL COMPACT 操作:
ALTER TABLE demodb.customer COMPACT "full";

7. 操作完毕后,可单击顶部的实时标签,查找对应表名以查看小文件数量变化。

8. 检查自动 Compact 相关参数设置,使其覆盖本次出现的表未被自动 Compact 特例情况。


管理 Compact 任务

通过 DBA Service,您可以便捷地监控和管理 Compact 任务,为您的后续操作(例如调整 Compact 频率)提供数据支持。

注意:Compact 频率具体涉及的参数是 holodesk.compact.table.interval ,默认为 300 单位为秒。
但是在高频的数据 INSERT 场景下,可能出现 Compact 效率跟不上小文件生成的速率,此时可适当调小该值(例如 30)来提升执行频率。
  1. 登录 Transwarp Manager 平台。
  2. 选择仪表盘 > 集群页面,单击 DBAService 进入服务详情界面。
  3. 选择角色,然后查看 DBA Service Server 角色网址并访问。
  4. 输入账号和密码,填写验证码后进入 DBAService 首页。
  5. 单击 Compact Service 卡片。

image.png

6. 单击左侧导航栏的查询,可查看 Compact 任务的执行情况,例如任务类型、是否成功、耗时等信息。

image.png

通过查询语句的前缀可判断任务类型:
前缀为 Checking:表示为 Compact 检查操作,系统会定期检查表是否满足小文件触发条件。一旦满足,则会自动创建小文件合并任务。
前缀为 isCompact: true:表示 Compact 执行操作,执行小文件合并。

7. 单击左侧导航栏的存储 > 合并,基于阈值来查看是否存在 Compact 慢的表。

本案例中,我们选择最近 7 天中,Compact 任务执行超过 5 分钟,且表的小文件数量大于 10 的条件进行筛选,列出小文件数量最多的 3 个表,我们可以基于此信息判断是否存在较多 Compact 慢的表,然后调整 Compact 参数,例如频率、资源分配等。

image.png


注意事项

① 分桶表:跨分桶不能进行合并

② 分区表:跨分区不能进行合并


写在最后

以上就是当前Holodesk表如何合并小文件的全部内容,如需了解更多其他表格式的合并方式可参考:



评论
登录后可评论
发布者
星小环分享号
文章
180
问答
205
关注者
27
banner
关注星环科技
获取最新活动资讯

加入TDH社区版技术交流群

获取更多技术支持 ->

扫描二维码,立即加入