HBase 数据持久化

Posted

技术标签:

【中文标题】HBase 数据持久化【英文标题】:HBase data persistence 【发布时间】:2013-08-11 00:32:04 【问题描述】:

我一直在尝试了解 Hbase 的工作原理。具体来说 - 如何将数据存储到磁盘。

我在网上阅读过文章,其中两篇对我有帮助 -

http://th30z.blogspot.com/2011/02/hbase-io-hfile.html?spref=tw

http://www.slashdocs.com/iyxmiz/hfile-a-block-indexed-file-format-to-store-sorted-key-value-pairs.html

我还有一些疑问,可能是我对 HBase 不是很了解。这是我从所读内容中得到的 - 每个事务 - (Put/Get/Delete) 在 memstore 中保存为 KeyValue,然后在刷新时写入 StoreFiles/Hfiles。存储在磁盘上的数据实际上就是这些 HFile。

现在,KeyValue 类的结构指定 - 需要存储的数据(如果有)、键和操作类型(Put/Get/Delete)。 HFiles 中的数据块本身代表 KeyValues(“rowkey”是 Key 的一部分)。

在我看来,当这些 KeyValues 被持久化时,它更像是保存事务而不是更改现有数据。何时处理/合并此类交易以产生一行。我假设它可能是在压缩过程中,但是我不知道如何处理对写入 HFile 但未压缩的数据的请求。

文章说“在将KeyValue对写入块之前,key的顺序必须大于前一个”,我也没有理解。

我觉得我在理解HBase的过程中做了一些错误的假设。

谁能帮我理解这个。

【问题讨论】:

【参考方案1】:

“在将 KeyValue 对写入块之前,顺序...”

是的,新数据可以被视为事务,但它们与压缩后的数据格式/结构相同。也就是说,这些“交易”与旧数据共存,与旧数据没有区别,除了时间戳

当请求到来时,hbase 会同时查看以前的数据和新数据(您提到的“事务”),但会返回时间戳较新的新数据。

“在将KeyValue对写入块之前,key的顺序必须大于前一个”

我想这里的重点是,在将块写入磁盘之前,密钥在 memstore(内存缓存)中进行排序,以确保“密钥的顺序必须大于前一个”。

【讨论】:

我的问题是....如果它们被保存为事务,假设我们有两个具有相同列族的事务(2 PUTS),第二个 PUT 更新由发布的一个的列值第一的。现在,当 HBase 收到对特定 rowkey 的请求时,它是否会合并这两个 KeyValue 以给出结果? 对。 HBase 将合并这两个 KeyValues 以给出结果。 好的。并且在压缩期间将优化删除以删除该行键的前面的 KeyValues?语句不应该是 - “在将 KeyValue 对写入块之前,键的顺序必须不小于前一个”? 对。 1) DELETE 将像 PUT 一样附加数据,但带有标签“delete”,而 PUT 带有标签“put”。因此,请求时将跳过 DELETE 数据。压缩将删除“删除”数据。 2) 是的,您可以参考book section 了解详情。

以上是关于HBase 数据持久化的主要内容,如果未能解决你的问题,请参考以下文章

HBase数据持久化之HRegion.flushcache即CF持久化

学习HBase,你需要这样一本书

HBase储备知识一:相关基本信息

Hbase 原理

HBase架构模型特点

结合Hbase实时数据分析