hbase 0.94.0 0.94.9 0.94.24 功能不兼容初步分析

hbase 0.94.0 0.94.9 0.94.24 功能不兼容初步分析

测试原因:
原有的simplehbase count测试代码当hbase从某个集团版本升级后,部分测试代码不通过,怀疑hbase的各个版本有兼容性问题。


测试环境:
0.94.0 0.94.9 0.94.24使用本机的独立部署hbase。 client 0.94.9


测试数据:

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
3 16
4 32
5 64 NULL
6 NULL 128
7 NULL NULL
8 "test"



Note:
多family的组合情况太多,不考虑,主要测试单family的情况。
文中涉及的filter。

SingleColumnValueFilter filter = new SingleColumnValueFilter(
ColumnFamilyNameBytes, QName1, CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(4L)));
scan.setFilter(filter);


Scan

0.94.0 0.94.9 0.94.24
功能一致。

scan时startKey和endKey相等,则返回结果包含该key。
使用scan.addColumn()时,结果的keyvalue必须在qualifer中。因此使用一个不存在的Column时,scan不到任何结果。
当addColumn为Q1,选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
3 16
5 64 NULL
6 NULL 128
7 NULL NULL


使用scan.addFamily()时,结果的keyvalue必须在family中。


Scan with filter

使用scan.addColumn()时
0.94.0 0.94.9 一致
0.94.24和其他版本不一致

在0.94.0 0.94.9 中,当scan.addColumn()时,无论该column是否和filter中的column一致,该filter都是生效的。
区别在于返回的行不同。

当addColumn为Q1,先选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
3 16
5 64 NULL
6 NULL 128
7 NULL NULL

然后filter出

	rowkey          f/q1            f/q2           f/q3 
2 4 8
3 16
5 64 NULL



当addColumn为Q2,先选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
4 32
5 64 NULL
6 NULL 128
7 NULL NULL

然后filter出

	rowkey          f/q1            f/q2           f/q3 
2 4 8
4 32
5 64 NULL



在0.94.24中,当scan.addColumn()时,如果column和filter中的column不一致,该filter不生效的。

当addColumn为Q2,先选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
4 32
5 64 NULL
6 NULL 128
7 NULL NULL

然后filter不生效,返回结果。


使用scan.addFamily()时
3个版本功能一致。


Coprocessor
由于coprocessor的默认实现,会使用scan的family和qualifer,因此,使用coprocessor时必须进行设置。
正常的原生scan,hbase会检测到scan没有设置family时,会自动填充该HTable的所有family。

Count

使用scan.addColumn()时
0.94.0 0.94.9 0.94.24一致


使用0.94.0 0.94.9 0.94.24时,count的结果和addColumn没有关系。
该测试中都是返回8.
可以看做在数据全集上面count。

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
3 16
4 32
5 64 NULL
6 NULL 128
7 NULL NULL
8 "test"




使用scan.addFamily()时
3个版本功能一致。


Count with filter

使用scan.addColumn()时
0.94.0 0.94.9 0.94.24一致

使用0.94.0 0.94.9 0.94.24时,count的结果都是5。
可以看做在数据全集应用filter,然后count。

	rowkey          f/q1            f/q2           f/q3 	
2 4 8
3 16
4 32
5 64 NULL
8 "test"



这块hbase自己的3个版本一致。
但是count中的scan和原生scan的功能不一致。


使用scan.addFamily()时
3个版本功能一致。


Sum
3个版本功能一致。


Sum with Filter

使用scan.addColumn()时
0.94.0 0.94.9 一致
0.94.24和其他版本不一致

当使用0.94.0 0.94.9 时,

当addColumn为Q1,先选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
3 16
5 64 NULL
6 NULL 128
7 NULL NULL

然后filter出

	rowkey          f/q1            f/q2           f/q3 
2 4 8
3 16
5 64 NULL

加和为84.


当addColumn为Q2,先选择出

rowkey f/q1 f/q2 f/q3
1 1 2
2 4 8
4 32
5 64 NULL
6 NULL 128
7 NULL NULL

然后filter出

	rowkey          f/q1            f/q2           f/q3 
2 4 8
4 32
5 64 NULL

加和为40.

当addColumn为Q3,先选择出

	rowkey          f/q1            f/q2           f/q3 
8 "test"

然后filter出

	rowkey          f/q1            f/q2           f/q3 
8 "test"

加和为null.


在0.94.24中,当scan.addColumn()时,如果column和filter中的column不一致,该filter不生效的。

当addColumn为Q1,先选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
3 16
5 64 NULL
6 NULL 128
7 NULL NULL

然后filter出

	rowkey          f/q1            f/q2           f/q3 
2 4 8
3 16
5 64 NULL

加和为84.


当addColumn为Q2,先选择出

	rowkey          f/q1            f/q2           f/q3 
1 1 2
2 4 8
4 32
5 64 NULL
6 NULL 128
7 NULL NULL

filter不生效。
加和为170.


使用scan.addFamily()时
3个版本功能一致。


结论:


使用不同版本的hbase,需要对scan,filter,coprocessor做测试,以往的经验往往靠不住。
另外,欢迎大家提测试用例,我会添加到simplehbase测试代码里面。
这样,我们就有一个hbase测试代码库,可以在升级hbase时做回归测试。

simplehbase代码:
https://github.com/zhang-xzhi/simplehbase
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值