HBase扫描速度慢
问题 我正试图与菲尼克斯建立一个二级索引。创建索引需要几个小时。这似乎是由于HBase扫描速度慢,因为我注意到以下性能:HBase扫描速度慢,hbase,phoenix,Hbase,Phoenix,问题 我正试图与菲尼克斯建立一个二级索引。创建索引需要几个小时。这似乎是由于HBase扫描速度慢,因为我注意到以下性能: 我可能需要2个小时来扫描该表,而其他开发人员则报告需要几分钟来扫描更大的表(1亿行) HBase shell能够以大约每秒10.000的速度计算行数,这意味着需要3800(>1小时!)来计算此表中的所有行数 都使用HBase外壳和Java扫描程序 注意:GET(按rowkey)操作具有良好的性能(约0.5s) 上下文 3800万行/1000列/单列系列/96Go采用G
- 我可能需要2个小时来扫描该表,而其他开发人员则报告需要几分钟来扫描更大的表(1亿行)
- HBase shell能够以大约每秒10.000的速度计算行数,这意味着需要3800(>1小时!)来计算此表中的所有行数
上下文
- 3800万行/1000列/单列系列/96Go采用GZ压缩
- 集群有6个节点(126Go RAM,24个核心)和5个区域服务器
- Hortonworks数据平台2.2.0
故障排除 根据HBase手册(),以下是我已经检查过的内容: 1) 硬件
- IO(磁盘)
- NMon说磁盘的繁忙程度从来没有超过80%,最常见的是在0到20%之间
- Top表示HBase JVM没有交换(选中5个中的2个)
- IO(网络):每个节点的主动接口都位于同一个交换机上(所有第二个被动接口都插在不同的交换机上)
- GC暂停正常(大约每分钟暂停几毫秒)
- 堆看起来正常(在接近极限时峰值不会太长)
- CPU低得惊人:从未超过10%
- 线程:
- 活动线程(10“RpServe.reader=N”+一些其他线程)没有显示争用
- 大量停驻的线程不执行任何操作(60“DefaultRpcServer.handler=n”,约15个其他线程)
- 庞大的IPC客户端列表,没有任何线程状态
- 使用Hive+completebulkload进行批量加载
- 区域数目:
- 13个区域意味着每个RS有2到3个大区域,这是预期的
- 强制主要压缩后,扫描性能保持不变
- 区域大小相当均匀:11个区域为4,5Go(+/-0.5),2个区域为2,5Go
- 大多数配置保持不变
- HBase env仅指示JMX控制台的端口
- HBase站点对Phoenix的设置很少
- 一些在我看来还行的情妇
- hbase.hregion.memstore.block.multiplier
- hbase.hregion.memstore.flush.size:134217728字节(134Go)
- Xmx的Xmn比率:.2 Xmn最大值:512 Mb Xms:6144m
- hbase.regionserver.global.memstore.lowerLimit:0.38
- hbase.hstore.compactionTreshold:3
- hfile.block.cache.size:0.4(块缓存大小占堆的百分比)
- 最大HStoreFile(hbase.hregion.max.filesize):10go(10737418240)
- 客户端扫描程序缓存:100行zookeeper超时:30s
- 客户端最大键值大小:10mo
- hbase.regionserver.global.memstore.lowerLimit:0.38
- hbase.regionserver.global.memstore.upperLimit:0.40
- hs存储阻止存储文件:10
- hbase.hregion.memstore.mslab.enabled:
- 已启用hbase.hregion.majorcompaction.jitter:0.5
- 在不影响性能的情况下尝试了以下配置更改
- hbase-env.sh:尝试增加hbase_HEAPSIZE=6144(因为默认值为1000)
- hbase-site.xml:
- hbase.ipc.server.callqueue.read.ratio:0.9
- hbase.ipc.server.callqueue.scan.ratio:0.9
- 扫描时关闭blockcache(它正在搅动堆内存)
- 计算ur记录的大小,如果大于1MB,请增加hbase.scanner.timeout period scan.setCacheBlocks(false)
- scan.setCaching(x)x*记录大小短时间内获取的内容,确保接近1MB
- 一些必要的检查:确保正在扫描的表格的区域均匀分布在各个区域
(如果你做了一次大批量压缩)明白了:关键是要将“热”内容和“冷”内容分离成单独的列族。列族用于将列存储在单独的HFiles中,因此我们可以将一个列族用于索引(或经常读取)列,将另一个列族(因此文件)用于所有其他列 第一步:查看更小的列族扫描速度更快 我们只需丢弃冷内容来构建一个较小的列族(1655列->7列) 中等大小表格扫描的性能:
- [37.876.602行,1655列]扫描1000行需要39.4750
- [76.611.463行,7列]扫描1000行需要1.8620
- 扫描前1000行时,可以忽略总行数
- 由于从Hbase外壳扫描会在控制台中打印内容,因此会产生较大的行开销
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');
hadoop jar [hbase-server-jar] completebulkload /tmp/mytable mytable