2015-05-06 44 views
12

问题HBase的扫描速度慢

我试图建立与凤凰二级指标。索引创建需要几个小时。这似乎是因缓慢HBase的扫描,因为我注意到以下性能:

  • 我可能需要2个小时扫描表,而其他开发商报道几分钟较大的表(100百万行)。
  • HBase外壳可以计算大约一行。每秒10.000的速率,这意味着3800s(> 1小时!)来计算该表的所有行。

这两个都带有HBase shell和一个Java扫描器。

注意:GET(通过rowkey)操作可以获得良好的性能(大约0.5s)。


语境

  • 38个百万行/列1000 /单柱族/ 96Go与GZ压缩。
  • 集群有5个区域服务器的6个节点(126Go RAM,24个核心)。
  • Hortonworks数据平台2.2.0

故障排除

基于HBase的书(http://hbase.apache.org/book.html#performance),这里是我已经签:

1)硬件

  • IO(d ISK)
    • NMON说磁盘是永不占线的80%以上,而最常见的0至20%
    • 前说,HBase的JVM的不交换(选中2 5的RS)
  • IO (网络):在同一个交换机上的每个节点的主动接口架(所有第二无源接口被堵塞不同的交换机上)

2)JVM

  • GC暂停OK(几毫秒暂停每分钟左右)
  • 堆看起来不错(不见顶太长接近涨停)
  • CPU是令人惊讶LOW:从来没有超过10%
  • 主题:
    • 活动线程(10“RpServe.reader = N”+其他几个)不显示冲突
    • 很多停放线程无所作为(60“DefaultRpcServer。处理机= n”的,约15之外)
    • 没有任何线程状态

3)数据

  • 使用蜂房+ completebulkload装载散装。
  • IPC客户端的巨大的名单区域数量:
    • 13个区域意味着我们每个RS有2到3个大区域,这就是e xpected。
    • 强制重大压缩后扫描性能保持不变。
    • 区域大小相当均匀:4,5Go(+/- 0.5)为11个区域,2,5Go 2个区域

4)HBase的配置

  • 大多数配置保持不变。

    • HBase的ENV仅表示端口JMX控制台
    • HBase的现场有一些设置凤凰
  • 一些看起来OK我

    • hbase.hregion的则params的.memstore.block.multiplier
    • hbase.hregion.memstore.flush.size:134217728 bytes(134Go)
    • XMX的
    • XMN比:0.2 XMN最大值:512 MB X毫秒:6144米
    • hbase.regionserver.global.memstore.lowerLimit:0.38
    • hbase.hstore.compactionTreshold:3
    • hfile.block.cache .size:0.4(块缓存大小,堆%)
    • 最大HStoreFile(hbase.hregion.max.filesize):10走(10737418240)
    • 客户端扫描缓存:100行饲养员超时:30秒
    • 客户端最大keyvalue大小:10mo
    • hbase.regionserver.global.memstore.lowerLimit:0.38
    • hbase.regionserver.global.memstore.upperLimit:0.40
    • hstore阻断storefiles: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

5)日志说什么有用的

猫HBase的-H base-master-cox.log | grep“2015-05-11。* ERROR”

cat hbase-hbase-regionserver - *。log | grep的 “2015年5月11日* ERROR”

打印什么

打印警告显示非相关的错误

2015年5月11日17:11:10544警告[B.DefaultRpcServer.handler = 8 ,queue = 2,port = 60020] shortcircuit.ShortCircuitCache:ShortCircuitCache(0x2aca5fca):由于InvalidToken异常,无法加载1074749724_BP-2077371184-184.10.17.65-1423758745093。

2015-05-11 17:09:12,848 WARN [regionserver60020-smallCompactions-1430754386533] hbase.HBaseConfiguration:配置选项“hbase.regionserver.lease.period”已弃用。相反,使用“hbase.client.scanner.timeout.period”

回答

2
  • 在扫描的时间关断

    blockcache(它被搅动乌尔堆存储器)

  • 图出最新乌尔记录的大小,如果其> 1 MB,请增加hbase.scanner.timeout period scan.setCacheBlocks(false);

  • scan.setCaching(x)x *记录大小在一个短片中获取的内容,确保它接近1 MB。

  • 一些必要的检查:确保被扫描的Tabled的区域在各个区域之间均匀分布。

(如果妳做了大容量负荷运行一旦主要压实)

+0

感谢。我已经尝试过你没有影响的建议(关闭块缓存,将缓存设置为10.000.000,验证记录由最小2k列组成(小于30个字符),所以平均值为60Ko)。我有11个地区,9个是4.5Go,2个是2.5Go。 – Martin

3

明白了:关键是要分开“冷”内容纳入单独列族“热”的内容。列系列用于将列存储在单独的HFile中,因此我们可以将一个列族用于索引(或频繁读取)列,对于所有其他列可以使用另一个列族(因此是文件)。

第一步:看到小柱家人快扫描

我们简单地放弃冷的内容建立一个更小的列族(1655列 - > 7列)。

性能上中等大小的表扫描:

  • [37.876.602行,列1655]扫描1000行了39.4750
  • [76.611.463行,7列]扫描1000行耗时1。8620

备注:

    为我们扫描第1000行可以忽略
  • 行的总数
  • 有大排从HBase的shell会在控制台
  • 内容扫描的开销

第二步:生成多户HTable

我们通过从Hive生成HFile来执行批量加载。虽然医生说we can't generate one multi family table,可以分别产生HFiles:

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