java - HBase FuzzyRowFilter 不返回任何结果

标签 java macos scala hbase

我很难让 HBase 的 FuzzyRowFilter 正常工作。

我有如下测试表:

hbase(main):014:0> scan 'test'
ROW                                  COLUMN+CELL
 row-01                              column=colfam1:col1, timestamp=1481193793338, value=value1
 row-02                              column=colfam1:col1, timestamp=1481193799186, value=value2
 row-03                              column=colfam1:col1, timestamp=1481193803941, value=value3
 row-04                              column=colfam1:col1, timestamp=1481193808209, value=value4
 row-05                              column=colfam1:col1, timestamp=1481193812737, value=value5
5 row(s) in 0.0200 seconds

这是我的 Java 代码(我从 Scala 开始,但结果是一样的——没有):

    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.zookeeper.quorum", "localhost:2182");
    conf.set("hbase.master", "localhost:60000");
    conf.set("hbase.rootdir", "/hbase");


    try {
        Scan scan = new Scan();
        scan.setCaching(5);

        byte[] rowKeys = Bytes.toBytesBinary("???-01");
        byte[] fuzzyInfo = {0x01,0x01,0x01,0x00,0x00,0x00};
        FuzzyRowFilter fuzzyFilter = new FuzzyRowFilter(
                Arrays.asList(
                        new Pair<byte[], byte[]>(
                                rowKeys,
                                fuzzyInfo)));

        System.out.println("### fuzzyFilter: " + fuzzyFilter.toString());

        scan.addFamily(Bytes.toBytesBinary("colfam1"));
        scan.setStartRow(Bytes.toBytesBinary("row-01"));
        scan.setStopRow(Bytes.toBytesBinary("row-05"));
        scan.setFilter(fuzzyFilter);

        Connection conn = ConnectionFactory.createConnection(conf);
        Table table = conn.getTable(TableName.valueOf("test"));
        ResultScanner results = table.getScanner(scan);

        int count = 0;
        int limit = 100;
        for ( Result r : results ) {
            System.out.println("" + r.toString());
            if (count++ >= limit) break;
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

我只是没有从服务器返回任何结果。如果我注释掉行 scan.setFilter(fuzzyFilter);,我会得到执行结果:

keyvalues={row-01/colfam1:col1/1481193793338/Put/vlen=6/seqid=0}
keyvalues={row-02/colfam1:col1/1481193799186/Put/vlen=6/seqid=0}
keyvalues={row-03/colfam1:col1/1481193803941/Put/vlen=6/seqid=0}
keyvalues={row-04/colfam1:col1/1481193808209/Put/vlen=6/seqid=0}

我做错了什么吗? HBase(版本 1.2.2)是否存在错误?我在最新的 Mac OS Sierra 上使用通过 Homebrew 安装的版本。

更新

在运行 CDH 5.7 和 HBase 1.2.0-cdh5.7.0 的 Cloudera Hadoop 集群上,我得到了 rowkey row-01 所需的输出。该错误一定与我的本地设置有关。

解决方案

确实,问题是 HBase 服务器安装和客户端 JAR 版本不匹配。就我而言,我使用的是工件

  • hbase-common
  • hbase 客户端
  • hbase 服务器

版本 1.2.0-cdh5.7.0 而不是 1.2.2

我的错误是假设次要版本差异不会产生大的影响,但显然 Cloudera 已在其版本中应用了一些相对于官方代码库的重大更改。更改为正式版本 1.2.2 使 FuzzyRowFilter 正常工作。

最佳答案

它应该只打印 row-01 的 rowkey,这可以从过滤条件中看出。 没有这样的错误,它会按预期工作,因为我已经使用了一段时间了。 检查您的配置、依赖项等。 由于版本控制,很多时候图书馆和他们的客户变得不兼容。 让我们举一个简单的例子:

class ServerVersionA {
public static void getData() {
    return DataOject(data with headerVersionA);
}

class ClientVersionB {
public void showData() {
    DataObject dataObject = makeRequest(params);
    //Check whether data recieved is of version B after veryfying header                                         boolean status=validate(dataObject);
    if (status) {
        doIO(dataObject);
    }
}

在这种情况下,如果 header 不匹配,客户端就会闲置。 这些问题大多得到了解决,但有时它们会悄悄出现。 如果我们查看安装源和客户端版本,我们可以找出为什么没有返回数据并且没有传播异常。

关于java - HBase FuzzyRowFilter 不返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41037764/

相关文章:

java - 同步创建Akka Actor

java - 无法检索单选按钮的状态

java - 无限递归错误

java - 如果一个线程打开一个套接字并且主程序退出会发生什么?

macos - 无法在 Mac 上运行 Jenkins

scala - 如何将 Scala Spark DataFrames 架构导出到 Json 文件?

java - 将 Json 数据绑定(bind)到条形图

linux - fatal error : pthread. h:没有那个文件或目录

macos - macports 构建错误

scala - IntelliJ Idea sbt托管源文件