使用HBase来保存经常更改的设置值是否合适?

时间:2012-05-08 06:19:46

标签: hbase hdfs

考虑到HBase基础的HDFS的一次写入约束,听起来不适合使用HBase作为数据库来管理经常更改的 ,每用户设置值数千万用户。这里的设置值是,例如,布尔值,用于控制用户个人信息(例如生日,电话号码和电子邮件地址)的可见性以及每个朋友的标志,以控制谁被允许访问个人信息的可见部分。我担心每次用户更改设置值时存储大小都会增长和增长,即使HBase将多个更改合并到一个写入HDFS上也是如此。

但是,我不确定这是不是真的不合适。我的理解可能是错的。你能给我评论一下吗?

2 个答案:

答案 0 :(得分:3)

HBase用于其文件系统的HDFS是一个仅附加文件系统,这意味着文件的任何部分都不会被覆盖。新的变化包含在旧的变化之上,就像CouchDB一样。

然而,与CouchDB不同,HBase管理自己的分裂和压缩。

  

重要的是要强调,主要的压缩对于StoreFile清理是绝对必要的,唯一的变体是它们何时发生。它们可以通过HBase shell或HBaseAdmin进行管理。

在压缩过程中,您的旧数据将被释放,空间将被释放。

您可能应该将经常更改的数据分成其自己的列族,并且可能会打开压缩。不幸的是,此时,刷新是在全局进行的,而不是按列系列进行,但HBase-3149正在解决这个问题。

我想直接回答你的问题,是的,HBase可以存储经常修改的数据。只要确保有人仔细阅读configurations page并根据您的情况做出正确的决定。

答案 1 :(得分:2)

为了扩展Jacob的答案,理解为什么HBase对经常变化的值有好处,需要理解Log Structured Merge Trees的方法。

与典型的关系数据库(使用B +树和“就地更新”语义)不同,对HBase的所有写入都被视为带时间戳的附加。对于你所做的每一个PUT,无论它是一个新值(“INSERT”,RDBMS语言)还是现有键(“UPDATE”,在RDBMS中),都会发生两件事:

  1. 它被写入Write Ahead Log(WAL),因此如果机器在下一次文件刷新之前关闭,则不会丢失数据;和
  2. 它被插入到内存中区域数据的排序表示中(这非常快,即使它已经排序,因为它在内存中)。
  3. 下一次内存中有足够的新东西来保证它,内存中的东西会被刷新到磁盘上(由于它已经排序,因此速度非常快)。并且,根据您在表格中使用的设置(例如,您是否希望保留大量过去版本,是否要保留已删除的值等),旧版本的值可能会在刷新时立即清除时间也是如此。

    在任何一种情况下,很明显,随着时间的推移,单个值的不同版本可能会存放在多个存储文件中,并且单个读取将需要访问许多存储文件。这就是压缩的结果:将许多商店文件合并为一个,这样读取就不必这样做了。