kudu java_kudu系列: Java API使用和效率测试

packagekudu_perf_test;importjava.sql.Timestamp;importjava.util.UUID;import org.apache.kudu.client.*;public classTest {private final static int OPERATION_BATCH = 500;//同时支持三个模式的测试用例

public static voidinsertTestGeneric(KuduSession session, KuduTable table, SessionConfiguration.FlushMode mode,int recordCount) throwsException {//SessionConfiguration.FlushMode.AUTO_FLUSH_BACKGROUND//SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC//SessionConfiguration.FlushMode.MANUAL_FLUSH

session.setFlushMode(mode);if (SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC !=mode) {

session.setMutationBufferSpace(OPERATION_BATCH);

}int uncommit = 0;for (int i = 0; i < recordCount; i++) {

Insert insert=table.newInsert();

PartialRow row=insert.getRow();

UUID uuid=UUID.randomUUID();

row.addString("id", uuid.toString());

row.addString("name", mode.name());

session.apply(insert);//对于手工提交, 需要buffer在未满的时候flush,这里采用了buffer一半时即提交

if (SessionConfiguration.FlushMode.MANUAL_FLUSH ==mode) {

uncommit= uncommit + 1;if (uncommit > OPERATION_BATCH / 2) {

session.flush();

uncommit= 0;

}

}

}//对于手工提交, 保证完成最后的提交

if (SessionConfiguration.FlushMode.MANUAL_FLUSH == mode && uncommit > 0) {

session.flush();

}//对于后台自动提交, 必须保证完成最后的提交, 并保证有错误时能抛出异常

if (SessionConfiguration.FlushMode.AUTO_FLUSH_BACKGROUND ==mode) {

session.flush();

RowErrorsAndOverflowStatus error=session.getPendingErrors();if (error.isOverflowed() || error.getRowErrors().length > 0) {if(error.isOverflowed()) {throw new Exception("Kudu overflow exception occurred.");

}

StringBuilder errorMessage= newStringBuilder();if (error.getRowErrors().length > 0) {for(RowError errorObj : error.getRowErrors()) {

errorMessage.append(errorObj.toString());

errorMessage.append(";");

}

}throw newException(errorMessage.toString());

}

}

}//仅支持手动flush的测试用例

public static void insertTestManual(KuduSession session, KuduTable table, int recordCount) throwsException {//SessionConfiguration.FlushMode.AUTO_FLUSH_BACKGROUND//SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC//SessionConfiguration.FlushMode.MANUAL_FLUSH

SessionConfiguration.FlushMode mode =SessionConfiguration.FlushMode.MANUAL_FLUSH;

session.setFlushMode(mode);

session.setMutationBufferSpace(OPERATION_BATCH);int uncommit = 0;for (int i = 0; i < recordCount; i++) {

Insert insert=table.newInsert();

PartialRow row=insert.getRow();

UUID uuid=UUID.randomUUID();

row.addString("id", uuid.toString());

row.addString("name", mode.name());

session.apply(insert);//对于手工提交, 需要buffer在未满的时候flush,这里采用了buffer一半时即提交

uncommit = uncommit + 1;if (uncommit > OPERATION_BATCH / 2) {

session.flush();

uncommit= 0;

}

}//对于手工提交, 保证完成最后的提交

if (uncommit > 0) {

session.flush();

}

}//仅支持自动flush的测试用例

public static void insertTestInAutoSync(KuduSession session, KuduTable table, int recordCount) throwsException {//SessionConfiguration.FlushMode.AUTO_FLUSH_BACKGROUND//SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC//SessionConfiguration.FlushMode.MANUAL_FLUSH

SessionConfiguration.FlushMode mode =SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC;

session.setFlushMode(mode);for (int i = 0; i < recordCount; i++) {

Insert insert=table.newInsert();

PartialRow row=insert.getRow();

UUID uuid=UUID.randomUUID();

row.addString("id", uuid.toString());

row.addString("name", mode.name());//对于AUTO_FLUSH_SYNC模式, apply()将立即完成kudu写入

session.apply(insert);

}

}public static void test() throwsKuduException {

KuduClient client= new KuduClient.KuduClientBuilder("10.0.0.100:7051,10.0.0.101:7051,10.0.0.101:7051")

.build();

KuduSession session=client.newSession();

KuduTable table= client.openTable("testdb.tmp_test_perf");

SessionConfiguration.FlushMode mode;

Timestamp d1= null;

Timestamp d2= null;longmillis;longseconds;int recordCount = 0;try{

mode=SessionConfiguration.FlushMode.AUTO_FLUSH_BACKGROUND;

d1= newTimestamp(System.currentTimeMillis());

insertTestGeneric(session, table, mode, recordCount);

d2= newTimestamp(System.currentTimeMillis());

millis= d2.getTime() -d1.getTime();

seconds= millis / 1000 % 60;

System.out.println(mode.name()+ "耗时秒数:" +seconds);

mode=SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC;

d1= newTimestamp(System.currentTimeMillis());

insertTestInAutoSync(session, table, recordCount);

d2= newTimestamp(System.currentTimeMillis());

millis= d2.getTime() -d1.getTime();

seconds= millis / 1000 % 60;

System.out.println(mode.name()+ "耗时秒数:" +seconds);

mode=SessionConfiguration.FlushMode.MANUAL_FLUSH;

d1= newTimestamp(System.currentTimeMillis());

insertTestManual(session, table, recordCount);

d2= newTimestamp(System.currentTimeMillis());

millis= d2.getTime() -d1.getTime();

seconds= millis / 1000 % 60;

System.out.println(mode.name()+ "耗时秒数:" +seconds);

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{if (!session.isClosed()) {

session.close();

}

}

}public static voidmain(String[] args) {try{

test();

}catch(KuduException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("Done");

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值