Hypertable的automatic Counter

来源:互联网 发布:nginx能干什么 编辑:程序博客网 时间:2024/05/14 06:01

Hypertableautomatic Counter可以实现自动的原子计数器,即将一个Column Family定义为counter,例如:create table foo(f counter)。此时,此Column Family中所有Column Qualifier的Value将为一个64位的无符号整数,并且对其的插入,将自动按照key进行加减即使前后两次写入的Cell的key和timestamp完全一致(普通才Cell将会产生覆盖操作)。即对于一个定义为counter的Cell,不管写入多少次,客户端查询时将只会看到一个合并之后的结果。

Hypertable写入时,首先将数据写入内存中的CellCache,待CellCache达到一个CellStore文件大小后,才会刷入磁盘形成一个持久化的CellStore文件。刷入之前,相同key的Cell将会在内存中累加,最终写入CellStore文件中只有一份。但是后续如果出现相同key的Cell的话,由于HDFS不能被重写,只能将其写入新的CellStore文件中。查询时,会将来自不同CellStore文件中相同key的Cell在内存中累加后显示为一条结果。但是磁盘上此时已经保存了一个Cell的多个版本,这时也会看到表磁盘空间增长较快。同一个Cell的不同版本将在Hypertablemajor compaction之后被合并,即将累加的结果保留为最新版本,释放其余版本的磁盘空间。

我们一般会看到磁盘增长的过程,却看不到磁盘回收之后的效果,这是因为Hypertable并没有触发major compaction(Hypertable目前没有定时触发major compaction的机制)。通过手动触发major compaction,可以明显地看到所占用磁盘空间的下降,并且确定compaction之后多个版本已经合并为一个最新的版本。

最终结论:一个定义为CounterCell,不管入库程序写入多少次,在HDFS上存储时,“最终”将只占用一个Cell的存储空间。

原创粉丝点击