当前位置: 首页 > news >正文

在开发测试中使用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管理,只要加入此依赖就可以:

   <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 file02

Path 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/

相关文章:

  • 使用JProfiler进行性能调优
  • DBA的新领域:调试Oracle(进阶篇)
  • Comet框架Pushlets的集成
  • 如何定制一个基于REST Service的ODBC驱动程序
  • Maven依赖版本冲突报告
  • Maven中的扁平化POM
  • 你好,HBase
  • Maven Build Tracking
  • 分布式文件系统概述
  • 调试Oracle 之一 基础篇
  • 基于Apache Mesos 构建高可靠,高可用的Jenkins CI
  • Kepler性能分析之M2E调优
  • Ebay开源 Pulsar:实时大数据分析平台
  • JS组件化验证检测
  • 基于云技术的集成测试代码覆盖率收集的一站式解决方案
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • C++入门教程(10):for 语句
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • python docx文档转html页面
  • python大佬养成计划----difflib模块
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 浮动相关
  • - 概述 - 《设计模式(极简c++版)》
  • 关于使用markdown的方法(引自CSDN教程)
  • 前端性能优化——回流与重绘
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​linux启动进程的方式
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (12)Hive调优——count distinct去重优化
  • (52)只出现一次的数字III
  • (6)设计一个TimeMap
  • (8)STL算法之替换
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (独孤九剑)--文件系统
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (九)One-Wire总线-DS18B20
  • (七)理解angular中的module和injector,即依赖注入
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core Swagger 过滤部分Api
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET文档生成工具ADB使用图文教程
  • .net下简单快捷的数值高低位切换
  • .Net中ListT 泛型转成DataTable、DataSet
  • /etc/fstab和/etc/mtab的区别
  • [2023年]-hadoop面试真题(一)
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [C++]priority_queue的介绍及模拟实现
  • [codeforces]Checkpoints