从 HBase 查询、更新和删除数据

569 阅读6分钟

从 HBase 查询数据

在 HBase 上运行的最简单、最有效的查询是基于行键的查询。

HBase 中的行键是有序的,这些连续行键的范围存储在一起。因此,查找行键通常意味着查找起始行键小于或等于给定行键的最高顺序范围。这意味着为应用程序正确设计行键非常重要。最好在语义上将行键与表中包含的数据相关联。

在Google Bigtable研究论文中,行键由倒置域名组成,因此与特定域相关的所有内容都组合在一起。按照这些准则,最好使用行键对订单表进行建模,行键是项目或产品名称、订单日期和可能的类别的组合。根据最常访问数据的方式,这三种长块的组合序列可能会有所不同。因此,如果最常按时间顺序访问订单,您可能需要创建如下行键:

<date> + <timestamp> + <category>+<product>

但是,如果订单最常由类别和产品名称访问,则创建一个行键,如下所示:

<category> + <product>+ <date>+<timestamp>

尽管行键很重要,并且为大量数据提供了有效的查找机制,但几乎没有内置功能支持二级索引。任何不利用行键的查询都会导致表扫描缓慢。

搜索引擎框架 Lucene 等第三方工具能够帮助在 HBase 表上创建二级索引。

接下来,让我们了解一下 查询 Redis数据结构服务器的过程。

查询Redis

查询 Redis 与在其中插入记录一样优雅和简单。之前您了解到可以使用 get 命令获取特定字符串的值,如下所示:

./redis-cli get akey

或获取一系列列表值,如下所示:

./redis-cli lrange list_of_books 0 4

类似地,你可以得到一个集合的成员,如下所示:

./redis-cli smembers asset

或排序集的成员,如下所示:

./redis-cli zrevrange azset 0 4

您还看到,像交集、并集和差分这样的集合操作也可以分别使用 SINTER、SUNION 和 SDIFF 命令非常容易地执行。

当你从关系世界转移到NoSQL的世界时,你听到的不是数据创建或查询,而是人们谈论最多的是围绕它的数据更新和事务完整性。

更新和删除数据

关系世界深深植根于数据库完整性的 ACID 语义,并为数据更新和修改维护不同级别的隔离。相反,NoSQL并不极端重视ACID事务,在某些情况下完全忽略了它。

要设置上下文,您首先需要了解 ACID 的含义。ACID 是一个首字母缩略词,代表原子性、一致性、隔离性和持久性。非正式地说,原子性意味着事务要么全部发生,要么回滚。一致性意味着对数据库的每次修改都会将其从一个一致状态带到另一个一致状态。不存在不一致和未解决的状态。隔离可以保证,当正在进行的操作正在使用数据片段时,其他某个进程无法修改该数据片段。持久性意味着所有提交的数据都可以从任何类型的系统故障中恢复。

与其他部分一样,我依次介绍不同类型的NoSQL数据库,从MongoDB开始。

在 MongoDB、HBase 和 Redis 中更新和修改数据

与关系数据库不同,NoSQL 存储中不存在锁定的概念。这是设计上的选择,而不是巧合。像MongoDB这样的数据库应该是分片和可扩展的。在这种情况下,跨分布式分片的锁定可能很复杂,并且会使数据更新过程非常缓慢。

但是,尽管没有锁定,但一些提示和技巧可以帮助您以原子方式更新数据。首先,更新整个文档,而不仅仅是文档的几个字段。最好使用原子方法来更新文档。可用的原子方法如下:

  • $set -设置值

  • $inc-按给定量递增特定值

  • $push-将值附加到数组

  • $pushall - 将多个值追加到数组

  • $pull - 从现有数组中删除值

  • $pullAll - 从现有数组中删除多个值

例如,{ $set : { “order_date” : new Date(2010, 10, 01)} } 以原子方式更新订单集合中的order_data。

使用原子操作的另一种策略是使用更新(如果当前原则)。从本质上讲,这涉及三个步骤:

1. 获取对象。

2. 在本地修改对象。

3. 发送更新请求,指出“如果对象仍与其旧值匹配,则将对象更新为此新值”。

文档或行级锁定和原子性也适用于 HBase。

HBase 支持行级读写锁。这意味着当修改、更新或创建行中的任何列时,行将被锁定。在HBase术语中,创建和更新之间的区别并不明确。这两个操作执行类似的逻辑。如果该值不存在,则会插入该值或更新该值。

因此,行级锁定是一个很好的主意,除非在空行上获得了一个锁,然后该锁不可用,直到超时。

Redis 对事务的概念有限,可以在此类事务的范围内执行操作。

Redis MULTI 命令启动事务单元。在 MULTI 执行所有命令后调用 EXEC,并调用 DISCARD 回滚操作。两个键(key1和 key2)的原子增量的一个简单示例如下:

>MULTI OK

>INCR key1 QUEUED 

>INCR key2 QUEUED 
           
>EXEC

1)(integer)1

2)(integer)1

有限原子性与事务完整性

尽管最小原子支持的细节因数据库而异,但其中许多数据库具有相当多的类似特征。

CAP 定理指出,以下三个中的两个可以同时最大化:

  • 一致性-每个客户端都有相同的数据视图

  • 可用性-每个客户端总是可以读写

  • 分区容忍-系统在分布式物理网络中运行良好。

另一个经常出现的话题是最终一致性的概念。这个术语有时令人困惑,而且常常不能正确理解。

最终一致性是一种用于并行编程和分布式编程领域的内存一致性模型。最终一致性可从以下两方面诠释:

  • 给定一段足够长的时间,在这段时间内不发送任何更新,可以预期所有更新最终都将通过系统传播,所有副本都将是一致的。

  • 在持续更新的情况下,接受的更新最终要么到达副本,要么从服务中退出。

最终一致性意味着基本上可用,软状态,最终一致性(基础)


本文正在参加「金石计划 . 瓜分6万现金大奖」