专题:如何写测试——HBase

最近做Spark Streaming任务时用到了HBase做中间状态查询和存储,顺手写了一些测试,小小总结了一下各部分测试的写法。话说这里为什么不用redis呢?Redis作为kv存储系统还是太简单了,HBase可以让你少操很多很多心,这里就不跑题了。

  想提笔写的时候搜到了几篇类似的,这还是让我犹豫了一下还要不要再写。不过别人的毕竟是别人的,如果能够引入一些差异,写写就还是有意义的。
1. How-to: Test HBase Applications Using Popular Tools
2. CSDN上的翻译:使用常用工具测试HBase应用

1. HBase和各类测试方法

  1. 利用HBaseTestObj的HBase的Put测试。个人认为没什么用,要检查Put还不如直接检查进入Put之前的内容。
  2. 使用MRUnit来测试MapReduce的HBase表输入输出,这一部分可以参照前一篇的MapReduce测试,本质与1是一致的,就是检查Put对象(取出Put对象中的内容做比较,不要费神去自己构造Put对象了,神烦)。
  3. 使用HBase Mini Cluster的HBaseTestingUtility进行集成测试,网上的介绍是说启动一次需要20-30秒,实测结果是比一般的测试慢不了多少,建议就直接使用这个,简单并且统一,不用专门为了测试而测试。下面的例子都是以HBase Mini Cluster为基础进行的测试。
  4. FakeHBase,没有尝试使用,看起来挺好的。

      一般来说只会使用其中的一种,选一个就好。

2. 测试用例

2.1 测试基本环境

  • 引入以下依赖,根据自己的情况进行调整,需要解决掉与原有依赖的冲突(下面的HBase的版本是公司内部版,酌情替换掉吧)
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.4.0</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase</artifactId>
    <version>0.94.11</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.4.0</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.4.0</version>
    <scope>test</scope>
</dependency>
  • 测试的before/after单元中HTable的建立与关闭(虽然是Scala代码,但是应该不影响理解)。
class HBaseTest extends FlatSpec with BeforeAndAfterAll {
  private var utility: HBaseTestingUtility = _
  private var table: HTable = _

  override protected def beforeAll(): Unit = {
    super.beforeAll()
    utility = new HBaseTestingUtility()
    utility.startMiniCluster()
    // 建表,分配列族
    table = utility.createTable(
      "ip-profile".getBytes,
      Array(FAMILY_A.getBytes, FAMILY_B.getBytes)
    )
  }

  override protected def afterAll(): Unit = {
    super.afterAll()
    table.close()
    utility.shutdownMiniCluster()
  }

2.2 写测试

  验证一个写入和读出这个一般来说这一步意义不大,因为HBase里面只有一种类型的数据——Bytes。如果使用的是HBase提供的一系列方法

byte[] Bytes.toBytes(long t);
byte[] Bytes.toBytes(int t);
byte[] Bytes.toBytes(byte t);
byte[] Bytes.toBytes(String t);

是不会有问题的。需要验证的是在某个逻辑序列之后输出到HBase的结果的验证。但是由于这里使用的是Mini cluster,具体操作上来说与普通的HBase表的put/get/delete并没有差异。需要注意的是HTable的获得不能够再由conf文件创建得到

HTable hTable = new HTable(conf, "tableName")

  如果之前有直接使用conf来获得表的函数,在这里需要进行拆分成类似于def ipGeographicQuery(hTable: HTable, ...)这样的。要适应测试也是需要对代码进行一些修改的。剩下的就没有什么了,都是普通的操作。下面是一段没有逻辑的代码:

val put = new Put(key)
put.add(col.family(), col.qualifier(),  ThriftSerde.serialize(u))
table.put(put)

val get = new Get(key)
get.add(col.family(), col.qualifier(), ThriftSerde.serialize(u))
val rs = table.put(get)
val thriftObj = new ThriftObj()
ThriftSerde.deserialize(thriftObj, rs.getValue(col.family(), col.qualifier()))

基本上意思就是,如果使用mini-cluster就没有什么需要专门为测试特殊处理的地方了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值