问题
我正在尝试与Phoenix建立二级索引。索引创建需要几个小时。这似乎是由于HBase扫描速度慢,因为我注意到以下性能:
使用HBase shell和Java扫描程序。
注意:GET(通过rowkey)操作实现了良好的性能(约0.5秒)。
上下文
疑难解答
基于HBase书籍(http://hbase.apache.org/book.html#performance),这是我已经检查的内容:
1)硬件
2)JVM
3)数据
4)HBase配置
大多数配置保持不变。
对我来说看起来不错的一些参数
尝试了以下配置更改而不会对性能产生任何影响
5)日志没有任何用处
cat hbase-hbase-master-cox.log | grep" 2015-05-11。*错误"
cat hbase-hbase-regionserver - * .log | grep" 2015-05-11。*错误"
什么都不打印
打印WARN显示无相关错误
2015-05-11 17:11:10,544 WARN [B.DefaultRpcServer.handler = 8,queue = 2,port = 60020] shortcircuit.ShortCircuitCache:ShortCircuitCache(0x2aca5fca):无法加载1074749724_BP-2077371184-184.10.17.65 -1423758745093由于InvalidToken异常。
2015-05-11 17:09:12,848 WARN [regionserver60020-smallCompactions-1430754386533] hbase.HBaseConfiguration:Config option" hbase.regionserver.lease.period"已弃用。相反,请使用" hbase.client.scanner.timeout.period"
答案 0 :(得分:3)
知道了:关键是将“热门”内容与“冷”内容分成不同的列族。列族用于在不同的HFile中存储列,因此我们可以将一个列族用于索引(或频繁读取)列,并将另一列列族(因此文件)用于所有其他列。
第一步:查看较小的列系列扫描速度更快
我们只是丢弃冷含量来构建一个较小的列系列(1655列 - > 7列)。
中型桌面扫描的表现:
备注:
第二步:生成多家庭HTable
我们通过从Hive生成HFile来进行批量加载。虽然文档说we can't generate one multi family table,但可以单独生成HFile:
create table mytable_f1 (UUID string, source_col1, source_col2)
...
TBLPROPERTIES('hfile.family.path' = 'tmp/mytable/**f1**');
create table mytable_f1 (UUID string, source_col3, source_col4)
...
TBLPROPERTIES('hfile.family.path' = 'tmp/mytable/f2');
然后像往常一样简单地调用import命令:
hadoop jar [hbase-server-jar] completebulkload /tmp/mytable mytable
答案 1 :(得分:2)
扫描时的TurnOff blockcache(它正在搅拌你的堆内存)
弄清楚你的记录大小是什么,如果它的> 1 MB,请增加hbase.scanner.timeout期间scan.setCacheBlocks(false);
scan.setCaching(x)x *记录大小在一个短片中获取的内容,确保它接近1 MB。
进行一些必要的检查:确保正在扫描的Tabled的区域在各个区域中均匀分布。
(如果你已完成批量加载,则运行一次主要压缩)