背景
现场反馈,基于hbase put(List<Put> puts)封装的multiPut服务性能很差,一次100条记录,每条记录1k作用,耗时6s左右。这个结果,确实与原先所内做的压测差距很大,先前测试大概100ms左右。比对了两次测试,代码一致,与该操作相关的数据库查询操作,均缓存化处理;不同的地方在于所内采用CDH4.6版本,其中hbase为V0.94,现场为CDH5.0.2,其中hbase为V0.96。
分析
分析: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;
}
}