HBase异常:org.apache.hadoop.hbase.UnknownRowLockException

时间:2014-02-28 05:51:50

标签: hadoop hbase

我正在运行我编写的示例代码来测试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为什么会出现。

2 个答案:

答案 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