Hadoop HBase单行事务支持中的行锁定
在HBase中,为了提供单行事务支持,它使用了行锁定概念。例如,假设Hadoop HBase单行事务支持中的行锁定,hadoop,nosql,hbase,bigdata,Hadoop,Nosql,Hbase,Bigdata,在HBase中,为了提供单行事务支持,它使用了行锁定概念。例如,假设 Put p=new Put(“/*行键*/”)此语句将锁定该行 所以,在我们完成 表1.put(p) 锁无法打开 所以,如果我开始一个新的看跌期权 Put p1=新Put(“/行键”) p1 put不应该工作,因为行已经被锁定,但在HBase 0.94中,当我尝试它工作时 关于行锁,我的理解有什么错误吗。如果没有,那么单行事务支持在没有行锁定的情况下是如何工作的。我认为在您发出table.put(p)命令之前,行不会被锁定。使
Put p=new Put(“/*行键*/”)代码>此语句将锁定该行
所以,在我们完成
表1.put(p)
锁无法打开
所以,如果我开始一个新的看跌期权
Put p1=新Put(“/行键”)
p1 put不应该工作,因为行已经被锁定,但在HBase 0.94中,当我尝试它工作时
关于行锁,我的理解有什么错误吗。如果没有,那么单行事务支持在没有行锁定的情况下是如何工作的。我认为在您发出table.put(p)命令之前,行不会被锁定。使用Put p=新Put(“行键”);您正在创建一个对象来保存有关写入的信息,但实际上还没有与数据库通信。当您准备尝试写入数据库时,请键入table.put(p)。如果同一行上同时发生两个put()操作,则其中一个操作可能会失败。但我认为不可能长时间保持行锁,因为锁发生在HBase内部,无法从外部控制。因此,过程如下所示:
- 您的代码将put发送到hbase
- hbase在内部为您锁定行
- hbase写入数据
- hbase解锁该行
这意味着,如果两个人试图将put()发送到同一行,则只有一个人会成功,HBase会向另一个客户端发送错误消息
假设两个客户端试图同时放置()相同的行键
- 客户端1发送put
- 客户端2发送put
- hbase锁定客户端1的行
- hbase向客户端2发送错误,因为该行已锁定
- hbase写入客户端1的数据
- hbase解锁该行
按照上一个问题中的ip地址和登录时间示例,这意味着如果有人同时从不同的ip地址登录两次,则只会将一个ip写入数据库,但时间戳将与写入的ip匹配
我可能不完全理解这一点,但这是我目前的理解。我希望它能有所帮助。HBase的工作方式是,当应用PUT以确保将行写入原子块时,会在regionserver(而不是客户端)中保留锁,但它不提供(如果需要,需要使用类似的方法)
假设您的两个PUT不是从同一个客户端发送的(在这种情况下,它们可能是同一事务的一部分),除非HBase将崩溃或PUT之间的某个位置发生超时(例如由于压缩)。您的两个PUT将根据它们到达的顺序在HBase中串行应用 有一个方法getRowLock(),可以使用Put对象调用它。因此,我认为在创建对象时,只有行被锁定。你说的可能是对的。Thanx的回答我想问一下您使用的是什么版本的HBase API?我发现这个页面似乎表明行锁可以由客户端生成和持有。我认为,作为对我答案的更正,java客户端将自动从服务器获取锁,但它只在调用table.put()时获取锁。很难找到关于这些问题的文档,不是吗!为了澄清这一点,当您创建一个新的Put()对象时,您根本没有接触服务器。但是,当您调用table.put(p)时,java客户端将从服务器内部获得一个锁,然后写入数据,然后释放锁。希望这能有所帮助:)如果有经验的人能给出答案,那就太好了。也许你可以访问那些人常去的HBase IRC频道#我想是irc.freenode.net上的hbase。还有一件事。9.3.4. 行锁行锁仍在客户端API中,但不鼓励使用,因为如果管理不当,这些行锁可能会锁定区域服务器。HBASE-2332中有一个已存在的票证,用于从客户端删除此功能。