您的位置:首页 > 数据库 > Mongodb

YCSB扩展-语句执行频率,执行指定的测试查询语句

2016-03-18 16:29 501 查看

引言

ycsb是雅虎开源的一款通用的性能测试工具,该工具的特点是小巧,灵活,扩展性强。网上已经有很多有关ycsb使用的介绍如文献[1-2]。文献[3 ]为ycsb git中的官方文档,包含了ycsb的使用,配置文件各参数的详细说明。文献[4 ]使用ycsb对HBASE进行测试,并通过修改原代码,达到了符合自身的测试要求。本文使用ycsb对MongoDB数据库进行测试,并扩展其原代码使ycsb支持了如下功能:(1)支持测试语句执行的时间频率,即每隔一定的时间执行一条语句;(2)执行指定的sql语句

ycsb简单分析

ycsb-properties展示了配置文件各参数的说明,其中target参数表示指的是每秒最大操作数,当一秒内到达这个阈值,线程就会休眠1毫秒。显然,ycsb并没有很好的支持每隔一定时间执行一条语句的功能。并且ycsb执行的语句时ycsb系统设置好的语句,用户并不能指定特殊的语句执行。以上两个问题是本文要解决的问题。

背景介绍

本事测试的数据库为MongoDB,所以出现的代码均为与测试MongoDB的代码相关。并只修改了读操作。对于其他操作大家举一反三吧。

问题解决

配置文件workloada:

mongodb.url=mongodb://10.0.0.1:27017  #mongodb的连接机制

mongodb.database=test    #测试的数据库名
table=test  #集合名
mongodb.writeConcern=normal
timeseries.granularity=200   #每隔200毫秒打印一次信息
operationcount=1000    #执行10000条语句

delaytime=200   #每隔200毫秒执行一条数据,ycsb并没有该数据,是作者自己加的

readallfields=true
measurementtype=timeseries
workload=com.yahoo.ycsb.workloads.CoreWorkloadMY  #自己编写的查询类,系统默认为CorWorkload
readproportion=1   #只进行读操作
updateproportion=0
scanproportion=0
insertproportion=0

requestdistribution=zipfian


CoreWorkloadMY类。在ycsb-master\core\src\main\java\com\yahoo\ycsb\workload\文件夹下增加CoreWorkloadMY类。CoreWorkloadMY类基于CoreWorkload类进行了修改,代码只展示了增加和修改的地方,其他与CoreWorkload类相同。

public class CoreWorkloadMY extends Workload{

/**
* 默认延迟时间
*/
public static final String DELAYTIME_PREFIX_DEFAULT = "0";

/**
* 延迟时间
*/
int delayTime;

public void init(Properties p) throws WorkloadException {
delayTime = Integer.parseInt(p.getProperty(DELAYTIME_PREFIX, DELAYTIME_PREFIX_DEFAULT));
}

public void doTransactionRead(DB db) {
int keynum = 0;

String keyname = "";

HashSet<String> fields = null;

db.read(table, keyname, fields, new HashMap<String, ByteIterator>());

try{

Thread.sleep(delayTime);

} catch (InterruptedException e){
e.printStackTrace();
}

}
}


MongoDbClient类修改,由于CoreWorkloadMY中的db是MongoDbClient的实体对象,因此MongoDbClient类中的read操作同样需进行修改,同样,下面代码只展示了修改的部分,其他部分与原有的MongoDbClient代码相同。该文件位置在ycsb-master\mongodb\src\main\java\com\yahoo\ycsb\db下。

public class MongoDbClient extends DB {

public int read(String table, String key, Set<String> fields,
HashMap<String, ByteIterator> result) {
com.mongodb.DB db = null;
try{
db = mongo.getDB(database);
db.requestStart();

DBCollection collection = db.getCollection(table);

DBObject queryResult = null;

queryResult = collection.findOne(); //这里写自己的特定的查询语句

return queryResult != null ? 0 : 1;

} catch (Exception e){
System.err.println(e.toString());
return 1;
} finally {
if (db!=null)
{
db.requestDone();
}
}
}
}


完后,使用maven打包、发布就可以使用了。

参考文献

使用YCSB测试MongoDB的微分片性能

使用YCSB测试Mongodb性能的方法简介

ycsb gib官网

使用YCSB对HBASE进行测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ycsb mongodb 扩展