HBase FuzzyRowFilter returns 没有结果
HBase FuzzyRowFilter returns no results
我很难让 HBase 的 FuzzyRowFilter
工作。
我有以下测试table:
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 开始,但结果是一样的 - none):
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)是否存在错误?我正在使用通过 Homebrew 在最新 Mac OS Sierra.
上安装的版本
更新
在 Cloudera Hadoop 集群 运行 CDH 5.7 和 HBase 1.2.0-cdh5.7.0 上,我得到了 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 不匹配,客户端只会闲置。
这些问题大多得到了解决,但有时它们会悄悄出现。
如果我们查看安装源和客户端版本,我们可以找出为什么没有返回数据并且没有传播异常。
我很难让 HBase 的 FuzzyRowFilter
工作。
我有以下测试table:
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 开始,但结果是一样的 - none):
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)是否存在错误?我正在使用通过 Homebrew 在最新 Mac OS Sierra.
上安装的版本更新
在 Cloudera Hadoop 集群 运行 CDH 5.7 和 HBase 1.2.0-cdh5.7.0 上,我得到了 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 不匹配,客户端只会闲置。 这些问题大多得到了解决,但有时它们会悄悄出现。 如果我们查看安装源和客户端版本,我们可以找出为什么没有返回数据并且没有传播异常。