Hbase存儲結構和查詢方式已經有所了解,如何調用連接並且進行數據查詢呢,可以使用jmeter的Java腳本進行操作.
Hbase查詢主要是scaner通過濾器filter進行操作,根據要查詢列族還是rowkey可分為多種filter,可根據具體條件來進行查詢,放個filter比較全的鏈接,有興趣可以參考:https://www.jianshu.com/p/bcc54f63abe4
以下為代碼,包括rowkey前綴模糊查詢+列前綴模糊查詢+值范圍查詢等幾個組合查詢,多個filter可以放到一個list里,單個filter查詢拆出來使用即可:
package hbasetest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
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 org.apache.logging.log4j.Logger;
import hbase.HbaseTable;
public class ValueRange extends AbstractJavaSamplerClient {
public Connection connection;
public Arguments getDefaultParameters() {
Arguments args = new Arguments();
//數據僅為示例,需要根據實際情況添加
args.addArgument("hbase.zookeeper.quorum", "192.168.1.1,192.168.1.2,192.168.1.3");
args.addArgument("hbase.zookeeper.property.clientPort","2020");
args.addArgument("zookeeper.znode.parent","/hbase-unsecure");
args.addArgument("hbase.master", "hbasetest.com:16000");
args.addArgument("TableName","P_test");
args.addArgument("family","info");
args.addArgument("column","Str");
args.addArgument("value","7A");
args.addArgument("rowkey","BH");
args.addArgument("range","HXMFNQFOTXW9024ZJ");
return args;
}
public void setupTest(JavaSamplerContext context)
{
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", context.getParameter("hbase.zookeeper.quorum"));
conf.set("hbase.zookeeper.property.clientPort", context.getParameter("hbase.zookeeper.property.clientPort"));
conf.set("zookeeper.znode.parent", context.getParameter("zookeeper.znode.parent"));
conf.set("hbase.master", context.getParameter("hbase.master"));
try {
connection = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("finally")
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO 自動生成的方法存根
SampleResult sr = new SampleResult();
try {
String tableName = arg0.getParameter("TableName");
if (StringUtils.isBlank(tableName)) {
}
Table table =connection.getTable(TableName.valueOf(tableName));
Admin admin =connection.getAdmin();
if(!admin.isTableAvailable(TableName.valueOf(tableName))){
connection.close();
sr.setSuccessful(false);
return sr;
}
Scan scan = new Scan();
scan.setCaching(60000);
List<Filter> lf = new ArrayList<Filter>();
//1.rowkey前綴模糊查詢+列前綴模糊查詢
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(arg0.getParameter("rowkey").getBytes()));
Filter filter1 = new ColumnPrefixFilter(arg0.getParameter("column").getBytes());
//2.rowkey前綴模糊查詢+列前綴模糊查詢+值范圍查詢
//Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(arg0.getParameter("rowkey").getBytes()));
//Filter filter1 = new ColumnPrefixFilter(arg0.getParameter("column").getBytes());
//Filter filter2 = new SingleColumnValueFilter(arg0.getParameter("family").getBytes(), Bytes.toBytes("Str"), CompareFilter.CompareOp.GREATER_OR_EQUAL, arg0.getParameter("range").getBytes());
//3.rowkey前綴模糊查詢+值范圍查詢
//Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(arg0.getParameter("rowkey").getBytes()));
//Filter filter1 = new SingleColumnValueFilter(arg0.getParameter("family").getBytes(), Bytes.toBytes("Str"), CompareFilter.CompareOp.GREATER_OR_EQUAL, arg0.getParameter("range").getBytes());
//4.列前綴模糊查詢+值范圍查詢
//Filter filter = new ColumnPrefixFilter(arg0.getParameter("column").getBytes());
//Filter filter1 = new SingleColumnValueFilter(arg0.getParameter("family").getBytes(), Bytes.toBytes("Str"), CompareFilter.CompareOp.GREATER_OR_EQUAL, arg0.getParameter("range").getBytes());
lf.add(filter);
lf.add(filter1);
//lf.add(filter2);
FilterList fl = new FilterList(lf);
sr.sampleStart();
scan.setFilter(fl);
ResultScanner scanner = table.getScanner(scan);
sr.sampleEnd();
sr.setSuccessful(true);
} catch (Exception e) {
e.printStackTrace();
sr.setSuccessful(false);
}
finally {
return sr;
}
}
}
可使用Hbase的Ambari進行監控服務器資源,包括cpu,io,內存以及Hbase的磁盤HDFS等:
該工具還支持圖表按照時間范圍展示: