在开发测试中使用HBaseMiniCluster

来源:互联网 发布:如何在淘宝上申请退款 编辑:程序博客网 时间:2024/05/02 00:47

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管理,只要加入此依赖就可以:

   <dependencies>      …      <dependency>         <groupId>org.apache.hbase</groupId>         <artifactId>hbase-server</artifactId>              <version>0.98.8-hadoop2</version>              <scope>provided</scope>      </dependency>      <dependency>         <groupId>org.apache.hbase</groupId>         <artifactId>hbase-testing-util</artifactId>         <version>0.98.8-hadoop2</version>         <scope>provided</scope>      </dependency>…   </dependencies>

 2.启动、停止Mini Cluster

      首先构造一个HBaseTestingUtility的实例,然后调用它的startMiniCluster()方法;它会启动一个HDFS的Mini Cluster以及一个Zookeeper的Mini Cluster,启动完成后返回一个MiniHBaseCluster对象;

 

HBaseTestingUtility UTIL = new HBaseTestingUtility();MiniHBaseCluster hbaseCluster = UTIL.startMiniCluster();

      在使用完以后,执行shutdownMiniCluster()方法来停止Mini Cluster,释放各种资源;运行期间生成的各种临时文件也会被清理;

3.创建HTable,输入以及查询数据

HBaseTestingUtility也提供了方法供管理HBase,例如创建和删除HTable;

HTable table = UTIL.createTable(Bytes.toBytes("mytable");…UTIL.deleteTable(Bytes.toBytes("mytable"));

 

      你也可以通过此Mini Cluster的Configuration,来创建HBase的连接实例,从而开始创建HTable等一系列操作,与操作正常HBase无异:

Configuration config = hbaseCluster.getConf();HConnection HConnectionManager.createConnection(config);HBaseAdmin hbaseAdmin = new HBaseAdmin(conn);HTableDescriptor desc = new HTableDescriptor(TableName.valueOf("mytable"));…hbaseAdmin.createTable(desc);

      在HTable创建以后,就可以按照HBase Java API做数据的插入、删除、查找;此处不做细数;

4.运行MapReduce任务

       上面提到的startMiniCluster()方法,默认不会启动MapReduce集群;如果要运行Map Reduce任务,需要启动Mini MR Cluster:

UTIL.startMiniMapReduceCluster();

      这个时候,一个有两个TaskTracker的MR集群就准备就绪了,可以提交MapReduce任务到它上面运行;这里以Hadoop的word count为例,把它移植到Mini Cluster上非常容易:

       首先在本地文件系统准备两个text文件,写入一些字符;在Mini Cluster启动后,将它们拷贝到HDFS中:

FileSystem fs = FileSystem.get(UTIL.getConfiguration());// create local file /tmp/mapreduce/file01 and file02Path p = new Path("/tmp/mapreduce/");fs.mkdirs(p);fs.copyFromLocalFile(new Path("/tmp/mapreduce/file01"), p);fs.copyFromLocalFile(new Path("/tmp/mapreduce/file02"), p);

      随后,用Mini Cluster的configuration来构造一个JobConf,设置输入输出等配置,并开始运行:

JobConf conf = new JobConf(UTIL.getConfiguration(), WordCount.class);conf.setJobName("wordcount");…FileInputFormat.setInputPaths(conf, new Path("/tmp/mapreduce/"));FileOutputFormat.setOutputPath(conf, new Path("/tmp/result"));JobClient.runJob(conf);

 

      如果需要,在MiniCluster停止之前,将Map Reduce的输出文件拷贝到本地文件系统,因为Mini Cluster的HDFS数据不会持久保存:

fs.copyToLocalFile(new Path("/temp/result/part-00000"), new Path("/tmp/mapreduce/result"));

      最后,调用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实例,传入导入或导出表的名称和位置就可以了,参见下面的例子:

String importLocation = "file://" + backupFolder.getAbsolutePath() + "/" + table;String[] args = new String[] { table, importLocation };boolean result = runImport(args);...private boolean runImport(String[] args) throws IOException, InterruptedException, ClassNotFoundException {        GenericOptionsParser opts = new GenericOptionsParser(new Configuration(UTIL.getConfiguration()), args);        Configuration conf = opts.getConfiguration();        args = opts.getRemainingArgs();        Job job = Import.createSubmittableJob(conf, args);        job.waitForCompletion(false);        return job.isSuccessful();    }

      导入导出数据有几个注意事项:

  1. 在导入数据前,确保要导入的HTable已经在Mini Cluster中被创建;
  2. JAVA_HOME环境变量被正确设置,否则MR job会失败;
  3. 如果导入的HTable数据过大,Mini Cluster可能会Out Of Memory,需设置JVM参数以适当增加Heap和Perm Gen大小;
  4. 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/

0 0