Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop HBase单行事务支持中的行锁定_Hadoop_Nosql_Hbase_Bigdata - Fatal编程技术网

Hadoop 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)命令之前,行不会被锁定。使

在HBase中,为了提供单行事务支持,它使用了行锁定概念。例如,假设

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中有一个已存在的票证,用于从客户端删除此功能。