浏览 1417 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-12-04
测试原因: 原有的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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |