系统提供了强大的数据版本控制和生命周期管理功能,主要包括:
最大版本数:控制每个单元格保留的历史版本数量。
最小版本数:与 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,最大版本=5tdb.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(CF1).setTimeToLive(2).setMinVersions(2).setMaxVersions(5).build());// 配置第二个列族:TTL=3秒,最小版本=4,最大版本=10tdb.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("列族配置更新成功");}