论坛首页 Java企业应用论坛

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

浏览 1417 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-12-04  
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


测试数据:

<pre name="code" class="java"> 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"</pre>


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,选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
3               16
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>

使用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,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
3               16
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
然后filter出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
2               4                8
3               16
5               64               NULL</pre>



当addColumn为Q2,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
4                                32
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
然后filter出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
2               4                8
4                                32
5               64               NULL</pre>


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

当addColumn为Q2,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
4                                32
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
然后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。

<pre name="code" class="java"> 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"</pre>




使用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。

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
2               4                8
3               16
4                                32
5               64               NULL
8                                              "test"</pre>


这块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,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
3               16
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
然后filter出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
2               4                8
3               16
5               64               NULL</pre>
加和为84.


当addColumn为Q2,先选择出
<pre name="code" class="java">
rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
4                                32
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
然后filter出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
2               4                8
4                                32
5               64               NULL</pre>
加和为40.

当addColumn为Q3,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
8                                              "test"</pre>
然后filter出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
8                                              "test"</pre>
加和为null.


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

当addColumn为Q1,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
3               16
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
然后filter出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
2               4                8
3               16
5               64               NULL</pre>
加和为84.


当addColumn为Q2,先选择出

<pre name="code" class="java"> rowkey          f/q1            f/q2           f/q3
1               1                2
2               4                8
4                                32
5               64               NULL
6               NULL             128
7               NULL             NULL</pre>
filter不生效。
加和为170.


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


结论:


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

simplehbase代码:
<pre name="code" class="java">https://github.com/zhang-xzhi/simplehbase</pre>
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics