我正在运行我编写的示例代码来测试HBase lockRow()
和unlockRow()
方法。示例代码如下:
HTable table = new HTable(config, "test");
RowLock rowLock = table.lockRow(Bytes.toBytes(row));
System.out.println("Obtained rowlock on " + row + "\nRowLock: " + rowLock);
Put p = new Put(Bytes.toBytes(row));
p.add(Bytes.toBytes("colFamily"), Bytes.toBytes(colFamily), Bytes.toBytes(value));
table.put(p);
System.out.println("put row");
table.unlockRow(rowLock);
System.out.println("Unlocked row!");
当我执行我的代码时,我得到一个UnknownRowLockException
。文档说明将未知行锁传递给区域服务器时会抛出此错误。我不确定这是怎么回事。如何解决它。
堆栈跟踪如下:
Obtained rowlock on row2
RowLock: org.apache.hadoop.hbase.client.RowLock@15af33d6
put row
Exception in thread "main" org.apache.hadoop.hbase.UnknownRowLockException: org.apache.hadoop.hbase.UnknownRowLockException: 5763272717012243790
at org.apache.hadoop.hbase.regionserver.HRegionServer.unlockRow(HRegionServer.java:2099)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:604)
at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1055)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.translateException(HConnectionManager.java:1268)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1014)
at org.apache.hadoop.hbase.client.HTable.unlockRow(HTable.java:870)
at HelloWorld.Hello.HelloWorld.main(HelloWorld.java:41)
修改
我刚刚意识到我应该打印rowLock.getLockId()
而不是rowLock
。我这样做并将它与堆栈跟踪中的行锁进行比较,它们是相同的,所以我不确定UnknownRowLockException
为什么会出现。
答案 0 :(得分:0)
请更改基础系统上的'文件描述符限制' 在linux上,您可以使用ulimit
执行此操作请注意,HBase在其日志中打印为它看到的ulimit的第一行。
答案 1 :(得分:0)
我能够以这种方式解决此错误:
获取的rowLock需要作为参数传递给put构造函数。
HTable table = new HTable(config, "test");
RowLock rowLock = table.lockRow(Bytes.toBytes(row));
System.out.println("Obtained rowlock on " + row + "\nRowLock: " + rowLock);
Put p = new Put(Bytes.toBytes(row), rowLock);
p.add(Bytes.toBytes("colFamily"), Bytes.toBytes(colFamily), Bytes.toBytes(value));
table.put(p);
System.out.println("put row");
table.unlockRow(rowLock);
System.out.println("Unlocked row!");
在我之前的方法中,在表的一行上获得了一个rowLock。但是,由于未使用rowLock(未传递给put构造函数),因此当我调用unlockRow方法时,该方法等待60秒(锁定超时)以检查是否已使用锁定。 60秒后,锁定到期,我最终得到UnknownRowLockException