数据优化
优化策略
数据目录配置优化策略:该数据目录下的所有库下的所有的原生表默认复用该数据目录优化策略。
数据库配置优化策略:该数据库下的所有原生表默认复用该数据库优化策略。
数据表配置优化策略:该配置仅针对配置的原生表生效。
用户通过上面的组合配置,可实现针对某库某表定制化优化策略,或者某些表关闭策略。
DLC 针对优化策略还提供高级参数配置,如用户对 Iceberg 熟悉可根据实际场景定制化高级参数,如下图所示。


DLC 针对高级参数设置了默认值。DLC 会将文件尽可能合并到128M大小,快照过期时间为2天,保留过期的5个快照,快照过期和清理孤立文件的执行周期分别为 600 分钟和 1440 分钟。
针对 upsert 写入场景,DLC 默认还提供合并阈值,该部分参数由 DLC 提供,在超过5min的时间新写入的数据满足其中一个条件将会触发小文件合并,如表所示。
参数 | 含义 | 取值 |
AddDataFileSize | 写入新增数据文件数量 | 20 |
AddDeleteFileSize | 写入新增Delete文件数据量 | 20 |
AddPositionDeletes | 写入新增Position Deletes记录数量 | 1000 |
AddEqualityDeletes | 写入新增Equality Deletes记录数量 | 1000 |
优化引擎
DLC 数据优化通过执行存储过程完成对数据的优化,因此需要数据引擎用于执行存储过程。当前 DLC 支持使用 Spark SQL 引擎作为优化引擎,在使用时需注意如下几点:
数据优化的 Spark SQL 引擎与业务引擎分开使用,可避免数据优化任务与业务任务相互抢占资源,导致任务大量排队和业务受阻。
生产场景建议优化资源 64CU 起,除非量特性表,如果小于 10 张表且单表数据量超过 2G,建议资源开启弹性,防止突发流量,建议采用包年包月集群,防止提交任务时集群不可用导致优化任务失败。
参数定义
数据库、数据表数据优化参数设置在库表属性上,用户可以通过创建库、表时携带数据优化参数(DLC 原生表提供的可视化创建库表用户可配置数据优化);用户也可通过 ALTER DATABASE/TABLE 对表数据进行表更,修改数据优化参数详细的操作请参见 开启数据优化。
属性值 | 含义 | 默认值 | 取值说明 |
smart-optimizer.inherit | 是否继承上一级策略 | default | none:不继承 default:继承 |
smart-optimizer.written.enable | 是否开启写入优化 | disable | disable:不开启 enable:开启 |
smart-optimizer.written.advance.compact-enable | (可选)写入优化高级参数,是否开始小文件合并 | enable | disable:不开启 enable:开启 |
smart-optimizer.written.advance.delete-enable | (可选)写入优化高级参数,是否开始数据清理 | enable | disable:不开启 enable:开启 |
smart-optimizer.written.advance.min-input-files | (可选)合并最小输入文件数量 | 5 | 当某个表或分区下的文件数目超过最小文件个数时,平台会自动检查并启动文件优化合并。文件优化合并能有效提高分析查询性能。最小文件个数取值较大时,资源负载越高,最小文件个数取值较小时,执行更灵活,任务会更频繁。建议取值为5。 |
smart-optimizer.written.advance.target-file-size-bytes | (可选)合并目标大小 | 134217728 (128 MB) | 文件优化合并时,会尽可能将文件合并成目标大小,建议取值128M。 |
smart-optimizer.written.advance.before-days | (可选)快照过期时间,单位天 | 2 | 快照存在时间超过该值时,平台会将该快照标记为过期的快照。快照过期时间取值越长,快照清理的速度越慢,占用存储空间越多。 |
smart-optimizer.written.advance.retain-last | (可选)保留过期快照数量 | 5 | 超过保留个数的过期快照将会被清理。保留的过期快照个数越多,存储空间占用越多。建议取值为5。 |
smart-optimizer.written.advance.expired-snapshots-interval-min | (可选)快照过期执行周期 | 600(10 hour) | 平台会周期性扫描快照并过期快照。执行周期越短,快照的过期会更灵敏,但是可能消耗更多资源。 |
smart-optimizer.written.advance.remove-orphan-interval-min | (可选)移除孤立文件执行周期 | 1440(24 hour) | 平台会周期性扫描并清理孤立文件。执行周期越短,清理孤立文件会更灵敏,但是可能消耗更多资源。 |
优化类型
当前 DLC 提供写入优化和数据清理两种类型,写入优化对用户写入的小文件进行合并更大的文件,从而提供查询效率;数据清理则是清理历史过期快照的存储空间,节约存储成本。
写入优化
小文件合并:将业务侧写入的小文件合并为更大的文件,提升文件查询效率;处理写入的deletes文件和data文件合并,提升MOR查询效率。
数据清理
快照过期:执行删除过期的快照信息,释放历史数据占据的存储空间。
移除孤立文件:执行移除孤立文件,释放无效文件占据的存储空间。
根据用户的使用场景,在优化类型上有一定差异,如下所示。
优化类型 | 建议开启场景 |
写入优化 | upsert 写场景:必须开启 merge into 写场景:必须开启 append 写入场景:按需开启 |
数据清理 | upsert 写场景:必须开启 merge into 写入场景:必须开启 append 写入场景:建议开启,并结合高级参数及历史数据回溯需求配置合理的过期删除时间 |
DLC 的写入优化不仅完成小文件的合并,还可以提供手动构建索引,用户需要提供索引的字段及规则,之后 DLC 将产生对应的存储过程执行语句,从而完成索引的构建。该能在 upsert 场景和结合小文件合并同时进行,完成小文件合并的时候即可完成索引构建,大大提高索引构建能力。
优化任务
DLC 优化任务产生有时间和事件两种方式。
时间触发
时间触发是优化高级参数配置的执行时间,周期性地触发检查是否需要优化,如对应治理项满足条件后,将会产生对应的治理任务。当前时间触发的周期至少是60min,通常用在清理快照和移除孤立文件。
时间触发针对小文件合并类型的优化任务仍然有效,当时触发周期默认为60min。
V1表(需后端开启)情况,每60min触发一次小文件合并。
V2表情况,防止表写入慢,长时间达不到事件触发条件,当时间触发V2进行小文件合并时,需要满足上一次小文件合并时间间隔超过1小时。
当快照过期和移除孤立文件任务执行失败或者超时时,在下一个检查周期会再次执行,检查周期为60min。
事件触发
事件触发发生了表 Upsert 写入场景,主要是 DLC 数据优化服务后台会监控用户表数据的 Upsert 表写入的情况,当写的达到对应的条件时,触发产生治理任务。事件触发用在小文件并场景,特别是 flink upsert 实时写入场景,数据写入快,频繁产生小文件合并任务。
如数据文件阈值20,deletes 文件阈值20,则写入20个文件或者20个 deletes 文件,并同时满足相同任务类型之间的产生的间隔默认最小时间5min时,就会触发产生小文件合并。
生命周期
DLC 原生表的生命周期(Lifecycle),指表(分区)数据从最后一次更新的时间算起,在经过指定的时间后没有变动,则此表(分区)将被自动回收。DLC 元数据表的生命周期执行时,只是产生新的快覆盖过期的数据,并不会立即将数据从存储空间上移除,数据真正从存储上移除需要依赖于元数据表数据清理(快照过期和移除孤立文件),因此生命周期需要和数据清理一起使用。
注意:
生命周期移除分区时只是从当前快照中逻辑移除该分区,但是被移除的文件并不会立即从存储系统中移除。
生命周期需要配置数据优化快照过期一起使用,才能保证被移除的文件会从存储系统上移除。
如果用户在 WeData 配置了 DLC 表生命周期管理,无需再次在 DLC 上配置原生表生命周期规则。
参数定义
数据库、数据表生命周期参数设置在库表属性上,用户可以通过创建库、表时携带生命周期参数(DLC 原生表提供的可视化创建库表用户可配置生命周期);用户也可通过 ALTER DATABASE/TABLE 对表数据进行表更改,修改生命周期参数详细的操作请参见 DLC 原生表操作配置。
属性值 | 含义 | 默认值 | 取值说明 |
smart-optimizer.lifecycle.enable | 是否开启生命周期 | disable | disable:不开启;enable:开启。默认不开启 |
smart-optimizer.lifecycle.expiration | 生命周期实现周期,单位:天 | 30 | 当 smart-optimizer.lifecycle.enable 取值为 enable 时生效,需大于1 |
smart-optimizer.lifecycle.expired-field | 过期字段 | | 数据表中某个时间格式字段,后端会根据该列进行数据过期 |
smart-optimizer.lifecycle.expired-field-format | 过期字段格式 | | 当前支持的时间格式包括 yyyy-MM-dd、yyyyMMdd、yyyyMMddHH、yyyyMM |
结合 WeData 管理原生表生命周期
如果用户分区表的按照天分区,如分区值为 yyyy-MM-dd、yyyyMMdd、yyyyMMddHH、yyyyMM 的分区值,可配合 WeData 完成数据生命周期管理,WeData 数据表生命周期配置详细过程参考 WeData 数据管理。
数据导入
DLC 原生表(Iceberg)支持多种方式的数据导入,根据数据源不同,可参考如下方式进行导入。
数据位置 | 导入建议 |
数据在用户自己的 COS 桶上 | 通过在 DLC 建立外部表,之后通过 Insert into/overwrite 的方式导入 |
数据在用户本地(或者其他执行机上) | 用户需要将数据上传到用户自己的 COS 桶上,之后建立 DLC 外部表,通过 insert into/overwrite 的方式导入 |
数据在用户 mysql | |
数据在用户自建 hive 上 | 用户通过建立联邦 hive 数据目录,之后通过 insert into/overwrite 的方式导入 |