面试题答案
一键面试数据写入时记录版本信息
- HBase数据结构基础:HBase 中数据以 Key - Value 形式存储,每个单元格(Cell)可以存储多个版本的数据。Key 由行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)组成,Value 则是实际存储的数据。
- LSM树写入机制:HBase 基于 LSM(Log - Structured Merge)树结构进行数据写入。当有新数据写入时,首先会写入到内存中的 MemStore(按照 Key 有序存储)。
- 版本信息记录:在写入 MemStore 时,会为每个写入的数据单元格添加版本信息。版本信息通常是一个时间戳,由系统时间或者用户自定义时间戳组成。例如,在使用 Java API 进行写入操作时,可以通过
Put
对象的addColumn(byte[] family, byte[] qualifier, long ts, byte[] value)
方法指定时间戳ts
,这个时间戳就是版本标识。当 MemStore 达到一定阈值后,会被刷写到磁盘形成 HFile(Immutable Store File),在 HFile 中数据同样按 Key 有序存储,并且每个单元格的版本信息也会被持久化记录下来。
数据读取时根据版本策略获取相应数据
- 读取流程概述:当进行数据读取时,首先会在 MemStore 中查找,如果 MemStore 中没有找到,则会在 HFile 中查找。HBase 会根据配置的版本策略来决定返回哪些版本的数据。
- 版本策略类型:
- 获取最新版本:这是最常见的策略。HBase 会按照时间戳从大到小排序,返回最新时间戳对应的版本数据。例如,在使用
Get
对象进行读取时,默认返回最新版本数据。如果使用 Java API,代码类似Get get = new Get(Bytes.toBytes(rowKey)); Result result = table.get(get);
,这里result
中返回的就是最新版本数据。 - 获取指定数量版本:可以通过设置
Get
对象的setMaxVersions(int numVersions)
方法来指定获取的版本数量。例如get.setMaxVersions(3);
,HBase 会按照时间戳从大到小排序,返回最新的 3 个版本的数据。 - 获取指定时间范围内版本:可以通过设置
Get
对象的setTimeRange(long minStamp, long maxStamp)
方法来指定时间范围。HBase 会返回时间戳在这个范围内的所有版本数据。例如get.setTimeRange(1600000000000L, 1610000000000L);
,则会返回时间戳在 1600000000000 到 1610000000000 之间的版本数据。
- 获取最新版本:这是最常见的策略。HBase 会按照时间戳从大到小排序,返回最新时间戳对应的版本数据。例如,在使用