Hbase插入参数测试与对比

本文通过实际测试对比了HBase中不同参数设置对读写性能的影响,特别是针对List批量写入与单条Put操作进行了深入分析。实验结果显示,合理配置setAutoFlush和writebuffer参数能显著提升写入效率。
HBase读写性能和几个参数有密切关系,比如cache和batch会影响读, 而write buffer会影响写,另外除了参数会影响,在程序里怎么处理也极大的影响插入性能,诸如List比一条一条put性能是否要高呢? 网上大部分言论是否正确呢?今天我会通过程序读取HBASE,然后再原封不动的写入另外一张表,对比各个参数的组合对插入的影响。

HTable htable1 = new HTable(hbaseconf, "test2");
Scan scan1 = new Scan();
ResultScanner scaner = htable.getScanner(scan1);
List list = new ArrayList();
scan1.setCaching(300);
htable1.setWriteBufferSize(6*1024*1024);
htable1.setAutoFlush(false);
put.setWriteToWAL(false)

测试一:
方法参数时间插入条数结果比较
putsetWriteToWAL(false)
setCaching(300)
setWriteBufferSize(6*1024*1024)
setAutoFlush(false)
1分钟105000所有参数给到最优的时候,2者性能旗鼓相当
ListList<500>
setWriteToWAL(false)
setCaching(300)
setWriteBufferSize(6*1024*1024)
setAutoFlush(false)
1分钟105000


测试二:

方法参数时间插入条数结果比较
putsetWriteToWAL(true)
setCaching(300)
setWriteBufferSize(6*1024*1024)
setAutoFlush(false)
1分钟95000开启不写Wal log好像没有影响,哪怕对put也影响不大
ListList<500>
setWriteToWAL(true)
setCaching(300)
setWriteBufferSize(6*1024*1024)
setAutoFlush(false)
1分钟105000


测试三:

方法参数时间插入条数结果比较
putsetWriteToWAL(true)
setCaching(300)
setWriteBufferSize(1*1024*1024)
setAutoFlush(false)
1分钟95000 write buffer List
影响较大,但是对Put好像
没什么影响
ListList<500>
setWriteToWAL(true)
setCaching(300)
setWriteBufferSize(1*1024*1024)
setAutoFlush(false)
1分钟75000

测试四:

方法参数时间插入条数结果比较
putsetWriteToWAL(true)
setCaching(300)
setWriteBufferSize(6*1024*1024)
setAutoFlush(true)
1分钟20000 auto flush 对Put影响极大,但是对List没影响要少很多
ListList<500>
setWriteToWAL(true)
setCaching(300)
setWriteBufferSize(6*1024*1024)
setAutoFlush(true)
1分钟65000

通过以上几个测试, setAutoFlush参数对性能影响最大,不管是通过List 还是直接put,  另外write buffer影响对List 有较大影响。 本身的List和put 好像差距不大,甚至说没有差距。

所以对于Hbase使用put插入,主要关注2个参数,一个是write buffer,一个就是setAutoFlush.

整个测试程序:




import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;


import com.sun.java_cup.internal.runtime.Scanner;
import com.sun.org.apache.xpath.internal.operations.Mod;


public class filterTest {
public static void main(String[] args) throws IOException {

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Configuration hbaseconf = HBaseConfiguration.create();
hbaseconf.set("hbase.zookeeper.quorum",
"datanode01.isesol.com,datanode02.isesol.com,datanode03.isesol.com,datanode04.isesol.com,cmserver.isesol.com");
hbaseconf.set("hbase.zookeeper.property.clientPort", "2181");
hbaseconf.set("user", "hdfs");
HTable htable = new HTable(hbaseconf, "t_ui_all");
HTable htable1 = new HTable(hbaseconf, "test2");
Scan scan1 = new Scan();
scan1.setCaching(300);

/*Filter rowfilter = new RowFilter(CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("A131420033-1007-9223370539574828268")));
Filter rowfilter1 = new RowFilter(CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes("A131420033-1007-9223370539574828268"))); */


// scan1.setRowPrefixFilter(Bytes.toBytes("A131420033-1007-9223370539574828268"));
// Filter filter = new SingleColumnValueFilter(Bytes.toBytes("cf"),
// Bytes.toBytes("fault_level2_name"), CompareOp.EQUAL,
// Bytes.toBytes("电气问题"));
// scan1.setFilter(rowfilter);
// scan1.setRowPrefixFilter(Bytes.toBytes("A131420033-1007-9223370539574828268"));
ResultScanner scaner = htable.getScanner(scan1);
List list = new ArrayList();
Result result = null;
int j = 0;
System.out.println("start to scan original table and put this result into List" + dateformat.format(System.currentTimeMillis()));

htable1.setWriteBufferSize(6*1024*1024);
//htable1.setAutoFlush(false);

while (scaner.iterator().hasNext()) {


result = scaner.next();
Put put = new Put(result.getRow());
//put.setWriteToWAL(false);
for (int i = 0; i <= result.listCells().size() - 1; i++) {
put.add("cf".getBytes(), Bytes.toBytes(new String(result.listCells().get(i).getQualifier())), result
.getValue("cf".getBytes(), new String(result.listCells().get(i).getQualifier()).getBytes()));
}
/* j++;
htable1.put(put);
System.out.println("total number is " + j + " start to put these data into hbase");*/


list.add(put);

j++;

if(j % 500 == 0){
System.out.println("total number is " + j + " start to put these data into hbase" + list.size());

htable1.put(list);
list.clear();

}

htable1.put(list);
htable1.close();
htable.close();

System.out.println("Job finish" + dateformat.format(System.currentTimeMillis()));
}


}

### HBase 综合测试概述 HBase 是一个分布式的、面向列的开源数据库,基于 Hadoop 文件系统(HDFS)构建,适用于大规模数据存储实时读写访问。综合测试通常包括性能测试、功能验证、稳定性评估和容错能力检查等多个方面[^1]。 ```bash # 示例:使用 HBase 自带的性能测试工具 PerformanceEvaluation 进行随机读写测试 hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=100000 randomWrite 1 ``` 该命令启动一个包含 10 个样本的随机写入测试,用于评估集群写入吞吐量和响应延迟[^1]。 ### 功能性测试 功能性测试涵盖表创建、数据插入、获取、扫描、删除以及协处理器触发等操作。以下是一个通过 HBase Shell 验证基本 CRUD 操作的测试流程: ```shell # 创建测试表 create 'test_table', 'cf1' # 插入数据 put 'test_table', 'row1', 'cf1:col1', 'value1' # 获取单行数据 get 'test_table', 'row1' # 扫描全表 scan 'test_table' # 删除列 delete 'test_table', 'row1', 'cf1:col1' # 删除表前需先禁用 disable 'test_table' drop 'test_table' ``` 上述脚本可用于自动化回归测试中验证核心功能是否正常[^1]。 ### 性能基准测试 常用的性能测试工具包括 `Workload` 工具包(如 YCSB)和 HBase 内置的 `PerformanceEvaluation`。YCSB(Yahoo! Cloud Serving Benchmark)支持多种工作负载模式,例如: - Workload A:50% 读取 / 50% 更新(高更新频率) - Workload B:95% 读取 / 5% 更新(读密集型) - Workload C:100% 读取(只读场景) 集成 YCSB 到 HBase测试步骤如下: ```shell # 加载数据 ./bin/ycsb load hbase2 -P workloads/workloada -p table=test_ycsb -p columnfamily=family1 -p recordcount=1000000 # 执行测试 ./bin/ycsb run hbase2 -P workloads/workloada -p table=test_ycsb -p columnfamily=family1 -p operationcount=100000 ``` 结果将输出平均延迟、吞吐率及百分位延迟指标,可用于横向对比不同配置下的性能表现[^1]。 ### 容错高可用测试 为验证 HBase 的容错能力,可模拟 RegionServer 故障或 ZooKeeper 会话中断: ```bash # 手动停止某个 RegionServer 进程 ssh regionserver-host "sudo systemctl stop hbase-regionserver" ``` 观察主节点(Master)是否能在超时后重新分配受影响的 Region,并确认客户端请求在短暂中断后恢复正常。此过程验证了 Region 失败检测恢复机制的有效性[^1]。 ### 监控诊断 在测试过程中应启用 HBase 的 JMX 监控接口,收集关键指标如 MemStore Size、Block Cache 命中率、Compaction 队列长度等: ```java // 示例:通过 JMX 获取 RegionServer 的 BlockCache 命中率 ObjectName name = new ObjectName("hadoop:service=HBase,name=RegionServer,sub=BlockCache"); Double hitRatio = (Double) mbeanServer.getAttribute(name, "hitRatio"); ``` 这些指标有助于识别性能瓶颈,例如低缓存命中率可能提示需要调整 `hfile.block.cache.size` 参数[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tom_fans

谢谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值