- 问题描述
hbase scan数据缓慢,server端出现LeaseException。hbase写入缓慢。
- 问题原因
直接原因是:
而根本原因在于单个查询请求在server端处理时间过长,经过检查,发现是因为该scan带有一个会把绝大多数数据过滤掉的filter,导致hbase扫描了几百万条数据也没能拿到指定数量(scan的caching)的数据。
这和全表扫描还不一样。由于有查询缓存,即使是全表扫描,server端在拿到满足缓存需求的数据之后就会返回结果,实际上单个请求并不会扫描整张表。
- 相关影响
- 你能想象client端发出一个查询请求之后一分多钟没有收到response,用户体验非常的糟糕
- 一个请求会占用一个hbase的handler,假设handler数量是100,而client端同时发过来100个这样的带filter的查询请求,那么可以预见,所有的handler将会在这些查询进行中被hold住,导致其他请求(包括查询请求和写入请求)不能得到及时的处理,只能等待。实际上在发生这个问题的时候,最先发现的状况就是写入效率异常的慢。
- 解决方案
网上有些朋友给出的意见是增大hbase.regionserver.lease.period以减少LeaseException,这我是同意的。
还有的意见是减小hbase.rpc.timeout,这样client端就能很快得到反馈。这样用户体验确实好了一点,但并没有实际解决问题。。。server端的查询实际上还在跑啊!handler还是没有释放啊!况且一直抛timeout exception给client也不是办法,这个请求永远没有办法处理。
我们给出的解决方案是,用RandomRowFilter。
FilterList filterList = new FilterList(Operator.MUST_PASS_ONE); // RandomRowFilter must on the first of the FilterList filterList.addFilter(new RandomRowFilter(0.01F)); filterList.addFilter(...);//add other filters Scan scan = new Scan(); scan.setFilter(filterList);
它的原理很简单,hbase每扫描过一条记录,就会生成一个随机数,如果这个随机数小于某个阈值,就终止这次查询并返回已经查询到的结果。那么这个阈值如何定义呢?
Random random = new Random(); boolean filterOutRow = !(random.nextFloat() < chance);
这个chance就是阈值,也就是上面例子中的构造参数0.01F。因此你可以根据需要设定chance的大小,来控制扫描的最大记录数。
因此假设我们设chance=0.01F,在Scan的时候即使使用了一个很糟糕的filter,server端在扫描了100条记录(数字非确定,以下会说明)后就会终止,并返回当前扫描到的记录,如果需要继续进行查询,使用当前记录的rowkey作为startkey再发起一次查询请求即可。
但有几点需要注意:
- RandomRowFilter只是表达概率而不是确定值。比如设chance=0.01F,并不能保证一定会扫描100条记录就停止,而只是到100就停止的概率最大,但有可能只扫描一条记录,也有可能是一万条。但多次重复取平均值的话,肯定无限趋近于100。
- 带RandomRowFilter的查询返回的结果不一定是我们需要的结果。如果只是由于RandomRowFilter扫描终止,会把当前扫描到的那条记录也返回,无论这条记录是不是符合其他filter的要求。我们的做法是检查最后一条记录,看是否符合所有filter的条件。
相关推荐
综上所述,HBase性能优化是一个综合性的任务,涉及硬件配置、数据模型设计、查询策略、运维管理等多个方面。只有全方位考虑并实践这些策略,才能最大化发挥HBase的性能潜力,满足大数据时代下的高效率需求。
例如,启用bloomfilter过滤器,bloomfilter可以在查询时过滤掉不存在的行,这将显著提高查询性能;增加HBase堆内存,根据业务需求调整hbase-env.sh中的HBASE_HEAPSIZE设置;增加RPC调用数量,通过修改hbase-site.xml...
在HBase性能优化的过程中,表设计和RowKey的设计是至关重要的。预分区是表设计的一个重要环节,目的是避免因表的自动split导致的资源消耗和性能影响。预分区可以根据业务需求预先设定rowkey的范围,比如在例子中,...
在实际应用中,可能会涉及到更复杂的查询场景,如使用Filter进行数据筛选,或者利用HBase的Region Split特性优化存储和查询性能。对于过滤器,可以创建各种类型的Filter对象,如`PrefixFilter`、`RowFilter`等,并将...
"HBase性能优化" HBase是一种高性能的NoSQL数据库,广泛应用于大数据存储和处理领域。然而,HBase的性能优化是非常重要的,特别是在大规模数据集群环境中。以下是HBase性能优化的相关知识点: 启用LZO压缩 HBase...
在HBase中,性能优化是确保大数据平台高效运行的关键步骤。本文主要关注应用程序设计与开发层面的优化策略,包括表的设计、写表操作、读表操作以及数据计算。以下是具体的优化点: 1. **表的设计** - **Pre-...
【HBase 存储优化概述】 HBase 是一种基于 Hadoop 的分布式列式数据库,用于处理大规模半结构化数据。由于其对大数据的高效处理能力,尤其在亿级数据量的场景下,HBase 成为了大数据环境下的优选存储解决方案。在...
使用Hbase的`scan`命令可以查询Hbase表,通过指定过滤条件和范围来优化查询性能。若需将Hbase数据导出,可以通过Hive的Hbase外表,将Hbase数据关联到Hive表,然后执行SELECT ... INTO OUTFILE语句导出数据到文件。 ...
3. Bloom Filter:减少无效磁盘I/O,提高查询效率。 4. Coprocessor:在Region服务器端实现业务逻辑,减少网络传输。 六、HBase监控与故障恢复 1. 监控指标:包括内存使用、磁盘I/O、网络流量等,通过JMX和Hadoop ...
- **0.90.x版本**:2011年1月发布的0.90.0版本成为HBase应用的一个重要里程碑,该版本加入了众多新特性,如Bloom Filter等,显著提升了性能。 - **ZooKeeper集成**:0.20.0版本引入了ZooKeeper来管理BackupMaster...
* bloomfilter:根据应用需求,判断是否需要精确到 rowkey 或 column, bloomfilter 可以对 region 下的 hfile 进行查询优化。 2. rowkey 设计 rowkey 是 HBase 的 key-value 存储中的 key,通常使用用户要查询的...
HBase查询优化 在实际应用中,由于HBase的分布式特性,查询性能依赖于良好的Row Key设计。合理规划Row Key,可以提高数据访问速度和空间效率。此外,可以使用Scan操作进行范围查询,或通过Filter进行更复杂的过滤...
五、HBase优化与扩展 1. Region分裂与合并:随着数据增长,Region会自动分裂,保持大小均衡。必要时,可以手动合并Region。 2. RegionServer负载均衡:Master节点负责RegionServer间的负载均衡,调整Region分布以...
在使用HBase进行查询时,我们还需要关注性能优化。例如,通过合理设置RowKey,可以提高查询效率;利用Bloom Filter减少不必要的磁盘I/O;以及利用二级索引和Coprocessors进行复杂查询等。 总之,HBase的jar包是我们...
这个版本的HBase客户端已经对HBase 2.2.4进行了优化,确保了与服务端的兼容性和性能。 其次,hadoop-common-3.1.3.jar和hadoop-mapreduce-client-core-3.1.3.jar是Apache Hadoop的基础组件和MapReduce模块。Hadoop ...
3. 索引与查询:虽然HBase不是全索引数据库,但可以通过Secondary Index和Filter实现复杂查询。 4. 复制机制:支持多种复制策略,如同步复制、异步复制等,保证数据冗余和容错。 四、HBase 2.5.6版本的改进 在...
首先,本书将带你了解HBase的基本概念和功能,包括其分布式架构、表和行键的设计、列族的概念以及时间戳的使用。这些基础知识是理解HBase工作原理的关键,对于开发者来说,能够帮助他们在设计数据模型时做出合理的...
5. **过滤器和比较器**:通过使用`Filter`接口,开发者可以实现复杂的数据筛选逻辑,如基于特定条件的查询。同时,`Comparator`接口允许自定义列值的比较规则。 6. **安全性与权限**:Java-HBase开发包也支持HBase...