JMeter测试HBase

摘要:
importorg.apache.hadop.hbase.client.Result;//表名privateStringrowkey=null//Rowkey值privateSampleResults;

在网上找了关于jmeter连接hbase的方式,主要分为两种:通过导入jar包连接(Java Request)和通过BeanShell远程连接,由于刚接触jmeter没多久,对BeanShell还不熟,所以打算通过eclipse用Java编写连接hbase的程序并打包成jar包,导入到jmeter的方式连接hbase。

HBase本地远程连接HBase是测试成功的,一开始采用直接打包成runnable jar的方式导入到jmeter,但是创建Java Request之后,页面查不到创建好的接口,后来网上查询到,需要专门写一个程序继承“AbstractJavaSamplerClient”类,jmeter才能识别。

1、创建Java工程

新创建一个Java工程或者在需要调用的工程上创建个类,将ext目录下ApacheJMeter_core.jar、ApacheJMeter_java.jar引入项目(若提示无法找到org/apache/jorphan/logging/LoggingManager接口,需要同时引入lib目录下的jorphan.jar包);

继承AbstractJavaSamplerClient类,并重写以下方法:

public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;

具体接口如下:

package main.jmeter;

import java.io.IOException;

import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

import main.hbase.HBaseDAO;

public class Create extends AbstractJavaSamplerClient {
    private String tableName = null;//表名
    private String rowkey = null;    //rowkey值
    private SampleResult results;
    
    /**
     * 设置传入参数
     * 可以设置多个,已设置的参数会显示到Jmeter参数列表中
     */
    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("tableName","");
        params.addArgument("rowkey","");
        return params;
    }
    
    /**
     * 初始化方法,初始化性能测试时的每个线程
     * 实际运行时每个线程仅执行一次,在测试方法运行前执行,类似于LoadRunner中的init方法
     */
    @Override
    public void setupTest(JavaSamplerContext context) {
        results = new SampleResult();
        tableName = context.getParameter("tableName");//注意:此处是接收jmeter的参数传入,需要用引号括起来,否则读取不到值
        if(tableName != null && tableName.length() > 0){
            results.setSamplerData(tableName);
        }
        rowkey = context.getParameter("rowkey");
        if(rowkey != null && rowkey.length() > 0){
            results.setSamplerData(rowkey);
        }
    };
    
    /**
     * 性能测试时的线程运行体
     * 测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于Loadrunner中的Action方法
     */
    @SuppressWarnings("deprecation")
    @Override
    public SampleResult runTest(JavaSamplerContext arg0) {
        boolean success = false;
        results.sampleStart();
        HBaseDAO hbase = new HBaseDAO();
        HTable table = hbase.getHTable(tableName);
        // getRow 根据rowkey获取所有版本记录
        Result r;
        try {
            r = hbase.getRowVersions(table, rowkey,1);
            KeyValue[] kv = r.raw();
            for(KeyValue value:kv){
                results.setDataEncoding("UTF-8");
                results.setResponseData("运行结果 :  value = " + new String(value.getValue()));
                success = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                table.close();
                results.sampleEnd();
                results.setSuccessful(success);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return results;
    }
    
     /**
      * 测试结束方法,结束测试中的每个线程
      * 实际运行时,每个线程仅执行一次,在测试方法运行结束后执行,类似于Loadrunner中的End方法
      */
    @Override
    public void teardownTest(JavaSamplerContext arg0) {
        
    }

}

2、打包并导入

 将编辑好的Java项目打成jar包:Export->JAR file->finish

将导出的jar包放入libext目录下

3、运行JMeter

打开jmeter,点击测试计划将HBase依赖的所有jar包加入环境(建议先拷贝至ext目录下),添加线程组、Java Request

JMeter测试HBase第1张

在类名称中找到自己创建的类,参数列表会自动显示类中自定义的参数,填入要测试的值(可添加CSV配置元件,通过参数方式传入);

添加察看结果树、聚合报告,看是否能正常运行,若有异常,点击右上角三角符号查看原因

JMeter测试HBase第2张

若遇到java.io.IOException: Could not locate executable nullinwinutils.exe in the Hadoop binaries.异常,是由于找不到hadoop.home.dir的路径;

我本地运行连接hbase是正常的,但是导入到JMeter之后报个这个异常,我们集群用的是Hadoop 2.6.0,所以从网上下载了个Apache Hadoop Common 2.6.0:https://github.com/amihalik/hadoop-common-2.6.0-bin

解压到本地,然后在HBase的初始化程序中添加(也可配置环境变量)

System.setProperty("hadoop.home.dir", "D:\Hadoop\hadoop-common-2.6.0");

JMeter测试HBase第3张

重新打包后运行正常。

免责声明:文章转载自《JMeter测试HBase》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在Ubuntu中安装HP LaserJet 1020驱动使用Uboot启动内核并挂载NFS根文件系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QtDbus的API及示例

目录 1. Client :: Method Call 1.1. 方法1: 直接使用 Message 传递消息(Low-Level-API) 1.2. 方法2: 通过 DBusInterface 调用方法(同步+异步) 1.3. 方法3: 从XML导入代理类 2. Subscriber :: Signal Catching 2.1. 方法1:...

SwipeRefreshLayout 配合fragment 下拉刷新的使用,超级简单

前台demo <android.support.v4.widget.SwipeRefreshLayout android:layout_width="match_parent" android:id="@+id/swipe_container" android:layout_height="wrap_content" > <ListVie...

Java Script 读书笔记 (三) 函数

1. 函数作用域     在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。    变量v在函数内部定义,所以是一个局部变量,函数之外就无法读取。    函数内部定义的变量,会在该作用域内覆盖同名全局变量。    1 var v=1; 2 function f(){ 3 var v=2; 4 console...

类型信息

一、Class对象 在Object类中定义了以下的方法,此方法将被所有子类继承: public final Class getClass() @Test public void test3() { Person person = new Person(); Class clazz = person.getC...

React实现组件缓存的一种思路

前言 对于某个页面中的某个组件,很多时候需要其保持一直激活的状态,之前我的博客里面有一篇提到一种缓存策略,就是利用Route的children方法来display该组件或隐藏该组件。但是这种方式需要借助到Route组件并且只能缓存整个页面,而不是页面中的部分组件。并且这种缓存单纯的只是在页面上把它的display变成了block和none,仅仅是在路由离...

Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum

  Scalaz是由一堆的typeclass组成。每一个typeclass具备自己特殊的功能。用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上。scala这个编程语言借鉴了纯函数编程语言Haskell的许多概念。typeclass这个名字就是从Haskell里引用过来的。只不过在Haskell里用的名称是typ...