1

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

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

4

2 回答 2

3

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

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

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

在压缩期间,您的旧数据将被释放,并释放空间。

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

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

于 2012-05-08T07:30:41.293 回答
2

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

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

  1. 它被写入预写日志 (WAL),这样如果机器在下一次文件刷新之前出现故障,您就不会丢失数据;和
  2. 它被插入到内存中区域数据的排序表示中(这非常快,即使它已排序,因为它在内存中)。

下次当内存中有足够的新内容来保证它的存在时,内存中的内容就会被刷新到磁盘中(同样,由于它已经排序,所以速度非常快)。而且,根据您在表格上使用的设置(例如,您是否要保留许多过去的版本,是否要保留已删除的值等),旧版本的值可能会在刷新时立即被清除时间也是如此。

但是,无论哪种情况,很明显,随着时间的推移,单个值的不同版本可能会保存在多个这些存储文件中,并且一次读取将不得不访问许多存储文件。这就是紧缩的用武之地:将许多存储文件合并为一个,这样读取就不必这样做了。

于 2012-05-08T13:57:02.683 回答