我一直在努力了解 Hbase 的工作原理。特别是 - 数据如何存储到磁盘。
我在网上阅读了一些文章,其中有两篇对我有帮助——
http://th30z.blogspot.com/2011/02/hbase-io-hfile.html?spref=tw
和
我还有一些疑问,可能是因为我对HBase不是很了解。这是我从阅读中得到的——每笔交易——(Put/Get/Delete) 在 memstore 中保存为 KeyValue,然后在刷新时注销到 StoreFiles/Hfiles。存储在磁盘上的数据其实就是这些HFiles。
现在,KeyValue 类的结构指定了需要存储的数据(如果有)、键和操作类型(Put/Get/Delete)。 HFiles 中的数据 block 本身代表 KeyValues(“rowkey”是 Key 的一部分)。
在我看来,当这些 KeyValues 被持久化时,它更像是保存一个事务而不是对现有数据进行更改。何时处理/合并此类交易以产生一行。我假设它可能是在压缩过程中,但是我不知道如何处理对写入 HFile 但未压缩的数据的请求。
文章说“一个KeyValue对写入一个block之前,key的顺序必须比前一个大”,我也是没看懂。
我觉得我在理解HBase的过程中做了一些错误的假设。
谁能帮我理解这一点。
最佳答案
"Before a KeyValue pair is written to a block, the order ..."
是的,新数据可以被视为交易,但它们与压缩后的数据格式/结构相同。也就是说,这些“交易”与旧数据共存,除了时间戳之外,与旧数据没有区别。
当请求到来时,hbase会同时查看之前的数据和新数据(你说的“事务”),但是会返回时间戳较新的新数据。
"Before a KeyValue pair is written to a block, the order of the key must be bigger than the previous one"
我想这里的重点是,在将 block 写入磁盘之前,键在 memstore(内存缓存)中进行排序以确保“键的顺序必须大于前一个”。
关于java - HBase 数据持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18167631/