在开发测试中使用HBaseMiniCluster
Author: Shi, Shaofeng
为了方便开发人员,HBase以及其它Hadoop组件提供了Mini Cluster的运行方式:在一个JVM里模拟运行Hadoop集群,包括HDFS,Zookeeper,HBase 以及MapReduce;如果你需要运行一些简单的代码或测试案例,或者想在IDE中通过断点来调试,那么这时候用Mini Cluster就再合适不过了;HBase的单元测试中已经频繁使用这种方法;本文将介绍 Mini Cluster的几种简单使用:
- 启动、停止HBase Mini Cluster
- 创建HTable,输入以及查询数据
- 运行MapReduce任务
- 导入导出HTable数据
1.准备
要使用HBase Mini Cluster,最方便的办法是使用HBASETestingUtility类;这个类提供了启动、停止、创建、配置等实用方法来管理Mini Cluster;如果你的项目是用Maven管理,只要加入此依赖就可以:
2.启动、停止Mini Cluster
首先构造一个HBaseTestingUtility的实例,然后调用它的startMiniCluster()方法;它会启动一个HDFS的Mini Cluster以及一个Zookeeper的Mini Cluster,启动完成后返回一个MiniHBaseCluster对象;
在使用完以后,执行shutdownMiniCluster()方法来停止Mini Cluster,释放各种资源;运行期间生成的各种临时文件也会被清理;
3.创建HTable,输入以及查询数据
HBaseTestingUtility也提供了方法供管理HBase,例如创建和删除HTable;
你也可以通过此Mini Cluster的Configuration,来创建HBase的连接实例,从而开始创建HTable等一系列操作,与操作正常HBase无异:
在HTable创建以后,就可以按照HBase Java API做数据的插入、删除、查找;此处不做细数;
4.运行MapReduce任务
上面提到的startMiniCluster()方法,默认不会启动MapReduce集群;如果要运行Map Reduce任务,需要启动Mini MR Cluster:
这个时候,一个有两个TaskTracker的MR集群就准备就绪了,可以提交MapReduce任务到它上面运行;这里以Hadoop的word count为例,把它移植到Mini Cluster上非常容易:
首先在本地文件系统准备两个text文件,写入一些字符;在Mini Cluster启动后,将它们拷贝到HDFS中:
随后,用Mini Cluster的configuration来构造一个JobConf,设置输入输出等配置,并开始运行:
如果需要,在MiniCluster停止之前,将Map Reduce的输出文件拷贝到本地文件系统,因为Mini Cluster的HDFS数据不会持久保存:
最后,调用shutdownMapReduceCluster()方法停止MR Cluster;
5.导入HBase表到Mini Cluster
由于HBase Mini Cluster每次都会创建一个全新的运行时,运行数据会在JVM停止时清理,无法持久化数据;而有些时候, 我们的测试前需要初始化一些数据,或者测试后需要保留数据,这个时候就需要导入或导出数据到HBase Mini Cluster中。
HBase的数据导出和导入是通过运行相应的Map Reduce完成的;在上一节我们已经讲到如何在Mini Cluster上运行Map Reduce,那么只要构造HBase的Import或Export job实例,传入导入或导出表的名称和位置就可以了,参见下面的例子:
导入导出数据有几个注意事项:
- 在导入数据前,确保要导入的HTable已经在Mini Cluster中被创建;
- JAVA_HOME环境变量被正确设置,否则MR job会失败;
- 如果导入的HTable数据过大,Mini Cluster可能会Out Of Memory,需设置JVM参数以适当增加Heap和Perm Gen大小;
- HBase导出的文件会放在Mini HDFS Cluster,所以还需要从HDFS拷贝到本地文件系统; 导入可以直接从本地文件读取。
6.HBase Mini Cluster在Apache Kylin项目中的使用
Apache Kylin是一个大数据分析的OLAP引擎,支持在PB数据上进行秒级的SQL查询;之所以能达到这么高的效率,因为Kylin会对大数据做预计算并将结果(称为Cube)存储在HBase中以备查询;很多测试案例,例如验证Kylin对各种SQL查询的支持的测试,都是在这个预先创建好的HBase上来运行的;
起初,为了运行这些测试,每个开发人员都需要创建一个Hadoop的Sandbox VM,运行HBase, Map Reduce等任务;然后运行一个程序来构建测试用的范例Cube;Sandbox的搭建需要额外的计算资源,而计算Cube的过程则要花去一两个小时;这对于一位新用户来说,无疑增加了上手的难度,影响了他们对Kylin的兴趣;
HBase Mini Cluster帮助Apache Kylin很好地解决了这个问题;首先,我们将预计算的Cube (每个是一个HTable) 从Sandbox中导出并压缩,保留在代码库;运行测试案例之前, 启动HBase Mini Cluster,导入Cube;最后再更新Kylin配置中的HBase连接参数,让Kylin连接到此 Mini Cluster,完成各种测试;这样就不再依赖Sandbox,用户克隆下Kylin源代码就可以运行成功测试案例。
7.后续工作
这是HBase Mini Cluster在Apache Kylin中的初次尝试,收到了良好的效果;后续还有更多场景采取这个方案;我们也会探索如何在Mini Cluster中运行Hive;如果实现的话,那么Kylin计算Cube的过程也就可以一起完成了。
8.总结
本文先介绍了HBase Mini Cluster的使用,例如操作创建和操作HBase数据,运行Map Reduce任务,导入导出HTable 等;最后介绍了它在Apache Kylin中的使用,希望能对Hadoop的开发人员有所帮助和启示。
展开阅读:
[1] HBaseTestingUtility.java https://github.com/apache/hbase/blob/master/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java
[2] Haddop WordCount example
https://hadoop.apache.org/docs/r1.0.4/mapred_tutorial.html
[3] HBase export/import
https://hbase.apache.org/book/ops_mgt.html#export
[4] Apache Kylin
http://www.kylin.io/