扫描仪和计数调用上的 HBase shell“OutOfOrderScannerNextException”错误

Posted

技术标签:

【中文标题】扫描仪和计数调用上的 HBase shell“OutOfOrderScannerNextException”错误【英文标题】:HBase shell "OutOfOrderScannerNextException" error on scanner & count calls 【发布时间】:2014-10-18 08:38:40 【问题描述】:

无论我运行扫描命令还是计数,都会弹出此错误并且错误消息对我来说没有意义。 它说什么以及如何解决?

org.apache.hadoop.hbase.exceptions.OutOfOrderScannerNextException: 预期的 nextCallSeq:1 但从客户端获得的 nextCallSeq:0; request=scanner_id: 788 number_of_rows: 100 close_scanner: false next_call_seq: 0

命令:

计数“表”,5000 扫描 'table', COLUMN => ['cf:cq'], FILTER => "ValueFilter(=, 'binaryprefix:somevalue')"

编辑:

我在 hbase-site.xml 中添加了以下设置

<property>
    <name>hbase.rpc.timeout</name>
    <value>1200000</value>
  </property>
  <property>
    <name>hbase.client.scanner.caching</name>
    <value>100</value>
 </property>

没有影响

EDIT2:添加睡眠

                Result[] results = scanner.next(100);

                for (int i = 0; i < results.length; i++) 
                    result = results[i];
                    try 
                        ...
                        count++;
                        ...
                        Thread.sleep(10); // ADDED SLEEP
                     catch (Throwable exception) 
                        System.out.println(exception.getMessage());

                        System.out.println("sleeping");
                    
                

Edit2 后出现新错误:

org.apache.hadoop.hbase.client.ScannerTimeoutException: 101761ms passed since the last invocation, timeout is currently set to 60000
...


Caused by: org.apache.hadoop.hbase.UnknownScannerException: org.apache.hadoop.hbase.UnknownScannerException: Name: 31, already closed?
    ...

Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.UnknownScannerException): org.apache.hadoop.hbase.UnknownScannerException: Name: 31, already closed?
    ...

FINALLY BLOCK: 9900
Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.hbase.client.ScannerTimeoutException: 101766ms passed since the last invocation, timeout is currently set to 60000
    ...


Caused by: org.apache.hadoop.hbase.client.ScannerTimeoutException: 101766ms passed since the last invocation, timeout is currently set to 60000
    ...

Caused by: org.apache.hadoop.hbase.UnknownScannerException: org.apache.hadoop.hbase.UnknownScannerException: Name: 31, already closed?
    ...

Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.UnknownScannerException): org.apache.hadoop.hbase.UnknownScannerException: Name: 31, already closed?
    ...

【问题讨论】:

您使用的是哪个 HBase 版本? @Chiron hbase-0.98.6.1-hadoop1 在 Ubuntu 上独立 我正在运行另一个扫描命令,但问题仍然存在,我应该使用缓存吗? 这个问题真的没有答案吗? 【参考方案1】:

编辑:通过使用下载的 hbase 附带的相同客户端版本(不是 maven 0.99),我能够解决这个问题。 服务器版本为 0.98.6.1 在 ./lib 文件夹中包含客户端 jars

别忘了附上zookeeper库


旧:

现在我做了两件事,改变了表连接 API (0.99)

                    Configuration conf = HBaseConfiguration.create();
                    TableName name = TableName.valueOf("TABLENAME"); 
                    Connection conn = ConnectionFactory.createConnection(conf);
                    Table table = conn.getTable(name);

然后当错误弹出时,我尝试重新创建连接

                    scanner.close();
                    conn.close();
                    conf.clear();
                    conf = HBaseConfiguration.create();
                    conn = ConnectionFactory.createConnection(conf);
                    table = conn.getTable(name);
                    table = ConnectionFactory.createConnection(conf).getTable(name);
                    scanner = table.getScanner(scan);

这可行,但在收到第一个错误后可能会变慢。扫描所有行非常慢

【讨论】:

【参考方案2】:

这有时会在您进行大量删除时发生,您需要合并空白区域并尝试平衡您的区域

【讨论】:

【参考方案3】:

也可能是由磁盘损坏引起的。在我的情况下,它并没有损坏到 Ambari、HDFS 或我们的监控服务注意到它,而是损坏到无法服务于一个区域。

使用该磁盘停止区域服务器后,扫描工作。

我通过在调试模式下运行 hbase shell 找到了 regionserver:

hbase shell -d

然后一些区域服务器出现在输出中,其中一个脱颖而出。 然后我在主机上运行dmesg 来查找故障磁盘。

【讨论】:

以上是关于扫描仪和计数调用上的 HBase shell“OutOfOrderScannerNextException”错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 shell 命令和 mapreduce 扫描 HBase 会给出两种不同的结果

Shell脚本中实现hbase shell命令调用

HBase高级操作

hbase 命令的 Shell 脚本 |数“表”

hbaseshell命令显示已杀死

HBase概念学习Java API之扫描和过滤器