YCSB擴充套件-語句執行頻率,執行指定的測試查詢語句

孫悟空空發表於2016-03-18

引言

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打包、釋出就可以使用了。

參考文獻

  1. 使用YCSB測試MongoDB的微分片效能
  2. 使用YCSB測試Mongodb效能的方法簡介
  3. ycsb gib官網
  4. 使用YCSB對HBASE進行測試

相關文章