Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HBase扫描速度慢_Hbase_Phoenix - Fatal编程技术网

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

问题

我正试图与菲尼克斯建立一个二级索引。创建索引需要几个小时。这似乎是由于HBase扫描速度慢,因为我注意到以下性能:

  • 我可能需要2个小时来扫描该表,而其他开发人员则报告需要几分钟来扫描更大的表(1亿行)
  • HBase shell能够以大约每秒10.000的速度计算行数,这意味着需要3800(>1小时!)来计算此表中的所有行数
都使用HBase外壳和Java扫描程序

注意:GET(按rowkey)操作具有良好的性能(约0.5s)


上下文

  • 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(网络):每个节点的主动接口都位于同一个交换机上(所有第二个被动接口都插在不同的交换机上)
2) 虚拟机

  • GC暂停正常(大约每分钟暂停几毫秒)
  • 堆看起来正常(在接近极限时峰值不会太长)
  • CPU低得惊人:从未超过10%
  • 线程:
    • 活动线程(10“RpServe.reader=N”+一些其他线程)没有显示争用
    • 大量停驻的线程不执行任何操作(60“DefaultRpcServer.handler=n”,约15个其他线程)
    • 庞大的IPC客户端列表,没有任何线程状态
3) 资料

  • 使用Hive+completebulkload进行批量加载
  • 区域数目:
    • 13个区域意味着每个RS有2到3个大区域,这是预期的
    • 强制主要压缩后,扫描性能保持不变
    • 区域大小相当均匀:11个区域为4,5Go(+/-0.5),2个区域为2,5Go
4) HBase配置

  • 大多数配置保持不变

    • 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
5) 日志没有说什么有用的

cat hbase-hbase-master-cox.log | grep“2015-05-11.*错误”

cat hbase hbase regionserver-*.log | grep“2015-05-11.*错误”

不打印

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

2015-05-11 17:11:10544警告[B.DefaultRpcServer.handler=8,队列=2,端口=60020]shortcircuit.ShortCircuitCache:ShortCircuitCache(0x2aca5fca):由于InvalidToken异常,无法加载1074749724_BP-207731184-184.10.17.65-1423758745093

2015-05-11 17:09:12848警告[regionserver60020-smallCompactions-143754386533]hbase.HBaseConfiguration:Config选项“hbase.regionserver.lease.period”不推荐使用。相反,请使用“hbase.client.scanner.timeout.period”

  • 扫描时关闭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外壳扫描会在控制台中打印内容,因此会产生较大的行开销
第二步:生成多系列HTable

我们通过从Hive生成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