hbaseV0.96 multiPut性能下降问题分析
来源:互联网 发布:修复软件 编辑:程序博客网 时间:2024/04/29 16:26
背景
现场反馈,基于hbase put(List<Put> puts)封装的multiPut服务性能很差,一次100条记录,每条记录1k作用,耗时6s左右。这个结果,确实与原先所内做的压测差距很大,先前测试大概100ms左右。比对了两次测试,代码一致,与该操作相关的数据库查询操作,均缓存化处理;不同的地方在于所内采用CDH4.6版本,其中hbase为V0.94,现场为CDH5.0.2,其中hbase为V0.96。
分析
Step1.开始怀疑是两边环境参数不一致,经比对后,影响到写操作的参数,基本一致。
Step2.从耗时时间来看,难道涉及到的元数据没被缓存住,直接查询数据库里?沿着这个思路,debug代码,第一次请求数据库,后面从缓存加载元数据。改假设证明不成立。
Step3.定位耗时代码。在代码中,用log4j记录可能耗时的操作,发现组织List<Put> puts操作,耗了6s作用,hbase 的put操作,只用了几十毫秒。
定位到问题,一切好办。走读了该段代码,没发现啥异样,数据序列化成bytes直接,构建Put对象,无其它。该段代码,未涉及到write-buffer/网络通信,
所以和通信/write-buffer问题可以排除。难道是序列化问题?Bytes.toBytes(String)有问题?
比对了下CDH460和CDH502版本客户端代码+服务器,发现该段代码,在CDH460上面跑快了将近20倍!基本可以肯定和Bytes.toBytes(String)相关。从Cloudera下载两个版本的HBase代码,提取Bytes代码,比对Bytes.toBytes代码
分析:hbase0.96版本,Bytes.toBytes(String) 慢点根源在于toBytes中的方法体内,使用了String.getBytes(Charset),它的编码处理,涉及到StringDecoder对象重新生成,字符串复制构造等,从而导致了096版本的toBytes(String) 相比非常慢。
处理
修改multiPut服务中的Bytes.toBytes(String)为hbaseV0.94的代码,问题解决。
public static byte[] toBytes(String s) {
try {
return s.getBytes(HConstants.UTF8_ENCODING);//String
} catch (UnsupportedEncodingException e) {
LOG.error("UTF-8 not supported?", e);
return null;
}
}
0 0
- hbaseV0.96 multiPut性能下降问题分析
- 问题分析报告--在压力场景下OS在某种硬件环境下的性能可能会下降90%的问题
- Linux操作系统时间相关函数性能下降原因分析
- 一个MySQL 5.7 分区表性能下降的案例分析
- 一个不起眼的问题导致性能的严重的下降
- 巧用数据库归档技术解决性能下降问题
- 巧用数据库归档技术解决性能下降问题
- jradius session lock引起的性能下降问题排查
- 数据库性能问题分析
- 性能问题分析
- 利用递归下降分析解决表达式求值问题之noj35
- 递归下降分析程序
- 递归下降分析法
- 递归下降分析子程序
- 递归下降分析法
- 递归下降分析
- 递归下降分析程序
- 实战分析一个性能问题
- iOS导航控制器常用函数与navigationBar常用属性
- 解决小米、红米及其他 Android 手机无法在 Mac 下进行真机调试
- 笔试面试那件小事(内存管理)
- 【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。
- 黑马程序员—银行业务调度系统学习总结
- hbaseV0.96 multiPut性能下降问题分析
- 利用NSUserDefaults实现小型数据的快速存取
- Hibernate错误 org.hibernate.MappingNotFoundException: resource: com/com/Person.hbm.xml not found
- 把本职做到101分
- 如果查看Oracle数据块和操作系统块大小
- hadoop-2.3.0-cdh5.1.0完全分布式集群配置HA配置
- sql查看表结构
- struts2在Linux CentOS下日期格式不正常的问题的解决方法
- 什么才叫工作到位?它害你有多深?