过期数据删除

最近更新时间:2025-12-24 12:03:43

我的收藏
系统提供了强大的数据版本控制和生命周期管理功能,主要包括:
最大版本数:控制每个单元格保留的历史版本数量。
最小版本数:与 TTL 结合使用,确保在数据过期时保留指定数量的版本。
Time To Live (TTL):为列族设置数据存活时间,自动删除过期数据。
注意:
当前版本仅支持 ColumnFamily 级别的 TTL/最大版本数/最小版本数,不支持 Cell 级别的 TTL/最大版本数/最小版本数。

最大版本数

作用:通过 HColumnDescriptor 设置每个列族中每个单元格保留的最大版本数。
默认值:1
机制:系统不会覆盖数据,而是通过时间戳追加新版本。旧版本会在 Major Compaction 时被删除。
建议:请根据应用需求调整最大版本数。不建议将最大版本数设置过高(如数百),否则会导致存储文件过大。

最小版本数

作用:通过 HColumnDescriptor 设置每个列族中每个单元格保留的最小版本数。
默认值:0(表示禁用)。
使用场景:与 TTL 结合使用,配置如“保存最近 T 分钟的数据,最多 N 个版本,但至少保留 M 个版本”(M < N)。
限制:仅在列族启用 TTL 时有效;必须小于最大版本数。

TTL

功能说明
作用:为列族设置 TTL( Time To Live ) (以秒为单位),HBase 会在数据过期后自动删除该列族中的所有行,包括当前版本和旧版本。
时间基准:TTL 时间以 UTC 时间为准。
清理机制:在 Minor Compaction 过程中,HBase 会删除仅包含过期数据的存储文件。
配置参数
MIN_VERSIONS:如果设置了最小版本数(MIN_VERSIONS)为非零值,TTL 功能将失效。

配置示例

建表时设置 ColumnFamily 的 TTL/min/maxVersions 属性
TableName tableName = createTDSQLTableName("ht1");
byte[] CF1 = Bytes.toBytes("cf1");
byte[] CF2 = Bytes.toBytes("cf2");

// 创建表描述符
TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(tableName);

// 配置第一个列族:TTL=2秒,最小版本=2,最大版本=5
tdb.setColumnFamily(
ColumnFamilyDescriptorBuilder.newBuilder(CF1)
.setTimeToLive(2)
.setMinVersions(2)
.setMaxVersions(5)
.build()
);

// 配置第二个列族:TTL=3秒,最小版本=4,最大版本=10
tdb.setColumnFamily(
ColumnFamilyDescriptorBuilder.newBuilder(CF2)
.setTimeToLive(3)
.setMinVersions(4)
.setMaxVersions(10)
.build()
);

// 构建表并创建
try (Admin admin = connection.getAdmin()) {
admin.createTable(tdb.build());
}
修改 ColumnFamily 的 TTL/min/maxVersions 属性
TableName tableName = TableName.valueOf("ht1");
byte[] CF2 = Bytes.toBytes("cf2");

try (Admin admin = connection.getAdmin()) {
// 获取当前列族配置
ColumnFamilyDescriptor currentDesc = admin.getDescriptor(tableName)
.getColumnFamily(CF2);
// 基于现有配置创建新配置(保留其他设置)
ColumnFamilyDescriptor newDesc = ColumnFamilyDescriptorBuilder.newBuilder(currentDesc)
.setTimeToLive(10) // 修改 TTL=10秒
.setMinVersions(2) // 修改最小版本=2
.setMaxVersions(5) // 修改最大版本=5
.build();
// 应用修改
admin.modifyColumnFamily(tableName, newDesc);
System.out.println("列族配置更新成功");
}