系统提供了强大的数据版本控制和生命周期管理功能,主要包括:
·最大版本数:控制每个单元格保留的历史版本数量。
·最小版本数:与 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,最大版本=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("列族配置更新成功");}