`

优化hbase的查询提升读写速率优化案例及性能提升的几种方法

阅读更多

在初期,我们采用的逻辑是:将A表中的数据读取一行,根据其中的某个字段去组织一个GET,然后立刻提交,从B表取得要查询的字段的值,组织成一个PUT,并提交到A表。那么这么做的话,
1.完全发挥不出hbase的效率的原因是什么?
--------------------------------
2.使用bloomfilter和mapfile_index_interval如何提升性能?
3.如何设置hbase的内存?
4.如何增大RPC的数量?
扩展:

5.为什么HBase是基于列模式的存储?





1.优化案例


环境:suse  8G内存,8核,12T磁盘
          hbase master 占一台,其他7台作为hbase的region server
注意:此处不讨论hadoop

情景
          我们有7亿的数据,需要做查询操作,需要从1.7亿的表中查找一个字段,并写入到7亿数据的表中。
          这里为了描述方便,将7亿数据的表称为:A表,1.7亿数据的表称为B表。

          在初期,我们采用的逻辑是:将A表中的数据读取一行,根据其中的某个字段去组织一个GET,然后
          立刻提交,从B表取得要查询的字段的值,组织成一个PUT,并提交到A表。
          那么这么做的话,完全发挥不出hbase的效率,因为每个get之间它的key不一定连续,或者说是在同一范围
          而hbase的服务端会根据每个请求去加载数据到内存,由于请求的块分散,那么数据在内存中的替换过多的频繁。
          很有可能和直接读取磁盘数据差不多。
          并且采用这种逻辑去处理数据,需要花费时间太多。差不多是10W行读写数据需要40分钟。这对于A表的更新操作
          完全是不能接受的。

          之后,通过读数据的读取操作进行封装,组织成一个ArrayList 当到一定程度的时候采取提交。这里还有一个情况就是
          有些数据查询不到,那么需要去连接数据库去申请一个自动分配的值,并立刻提交,因为后面可能有请求这个数据。
          这就需要分开处理。
          在组织GET 列表的时候需要先查询,注意,不要采用table.get去取一个cell的值并判断是否为null来处理。
          而是用table.exist(get) 去查询,这是在server-side跑的,效率要高很多。
          对于查询不到的值立刻申请值并写入A表。
          对于查询的到的,那么就可前面说的组织get 加入到GET列表中,到一定程度再去一次提交,在取到值之后,
          在根据将循环数据的记录,将这些组织成put,数量和GET列表一样,不要去具体指定,在循环一次后直接table.put

          其他参数修改方面,写的都很多,这里就不提了。

处理速度(取至其中一台服务器中跑的任务):
2011-12-30 17:10:03 Start Write Lines:1700000
2011-12-30 17:14:10 Writed Lines:1700000
2011-12-30 17:14:11 Start Write Lines:1800000
2011-12-30 17:18:21 Writed Lines:1800000
2011-12-30 17:18:22 Start Write Lines:1900000
2011-12-30 17:22:29 Writed Lines:1900000
2011-12-30 17:22:29 Start Write Lines:2000000
2011-12-30 17:26:37 Writed Lines:2000000
2011-12-30 17:26:37 Start Write Lines:2100000

大约是查询,写入速度是4分钟处理10W行数据。

也就是4000/s的速率,较之前的处理方式提升了一个量级





性能提升方法

1、使用bloomfilter和mapfile_index_interval
  
Bloomfilter(开启/未开启=1/0)
  
mapfile_index_interval
Exists(0-10000)/ms
Get(10001 - 20000)/ms
0
128
22460
23715
0
0
11897
11416
0
64
13692
14034
1
128
3275
3686
1
64
2961
3010
1
0
3339
3498



测试环境为:单机,规模为10万条数据。随机在10000条数据中有99条存在的情况下。
结论:开启bloomfilter比没开启要快3、4倍。而适当的减少mapfile_index_interval可以提升性能

 

注意:在1.9.3版本的hbase中,bloomfilter是不支持的,存在一个bug,可以通过如下的修改加以改正:
    (1)、在方法org.apache.hadoop.hbase.regionserver.HStore.createReaders()中,找到如下行
    BloomFilterMapFile.Reader reader = file.getReader(fs, false, false);
    将其改成
    BloomFilterMapFile.Reader reader = file.getReader(fs, this.family.isBloomfilter(), false);
    (2)、在方法org.apache.hadoop.hbase.HColumnDescriptor.toString()中,找到如下的代码行
      if (key != null && key.toUpperCase().equals(BLOOMFILTER)) {
        // Don't emit bloomfilter.  Its not working.
        continue;
      }
    将其注释掉

2、hbase对于内存有特别的嗜好,在硬件允许的情况下配足够多的内存给它。
    通过修改hbase-env.sh中的
    export HBASE_HEAPSIZE=3000 #这里默认为1000m

3、修改java虚拟机属性
    (1)、在环境允许的情况下换64位的虚拟机
    (2)、替换掉默认的垃圾回收器,因为默认的垃圾回收器在多线程环境下会有更多的wait等待
    export HBASE_OPTS="-server -XX:NewSize=6m -XX:MaxNewSize=6m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"

4、增大RPC数量
    通过修改hbase-site.xml中的    
    hbase.regionserver.handler.count属性,可以适当的放大。默认值为10有点小

5、做程序开发是注意的地方
    (1)、需要判断所求的数据行是否存在时,尽量不要用HTable.exists(final byte [] row) 而用HTable.exists(final byte [] row, final byte[] column)等带列族的方法替代。
    (2)、不要使用HTable.get(final byte [] row, final byte [] column) == null来判断所求的数据存在,而是用HTable.exists(final byte [] row, final byte[] column)替代
    (3)、HTable.close()方法少用.因为我遇到过一些很令人费解的错误

6、记住HBase是基于列模式的存储,如果一个列族能搞定就不要把它分开成两个,关系数据库的那套在这里很不实用.分成多个列来存储会浪费更多的空间,除非你认为现在的硬盘和白菜一个价。

7、如果数据量没有达到TB级别或者没有上亿条记录,很难发挥HBase的优势,建议换关系数据库或别的存储技术。

 

 

 

 

http://blog.sina.com.cn/s/blog_68674da70102v6q0.html

分享到:
评论

相关推荐

    HBase性能优化方法总结

    本文将深入探讨HBase性能优化的各种策略,旨在帮助你提升数据操作的效率。 一、硬件优化 1. **磁盘选择**:HBase对I/O性能要求较高,因此推荐使用SSD硬盘,以减少读写延迟。 2. **内存配置**:合理分配HBase的堆...

    基于Hbase的大数据查询优化

    因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费资源较大,查询效率较低。类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了...

    HBase最佳实践-读性能优化策略

    根据这些场景,可以针对客户端优化、服务器端优化、列族设计优化以及HDFS相关优化四个方面进行具体的性能提升。 在客户端优化方面,首先需要考虑的是scan缓存设置是否合理。scan缓存是客户端在进行scan操作时用来...

    HBase写性能优化策略

    但是对于那些能够接受部分数据丢失,而更关心数据写入吞吐量的业务场景,可以考虑关闭WAL同步写入,以获得2到3倍的性能提升。如果业务场景对数据的完整性和一致性有较高要求,但是可以接受WAL的异步写入,这也能带来...

    hbase性能优化

    除了上述提到的优化方法,HBase的性能优化还可以涉及更多的方面,如合理调整HBase配置、分区和负载均衡策略、压缩和存储优化、监控和诊断等。在HBase集群中,还可能通过调整HMaster和HRegionServer的相关参数来...

    hbase用于查询客户端工具

    HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。HBase以其高吞吐量、低延迟和水平扩展能力而闻名,常用于存储非结构化和半结构化数据。在HBase...

    Hadoop2.7.1+Hbase1.2.1集群环境搭建(7)hbase 性能优化

    性能优化是提升HBase集群效率的关键,主要涉及以下几个方面: 1. **硬件优化**:增加内存、使用SSD硬盘、提高网络带宽,这些都可以显著提升HBase的性能。 2. **表设计**:合理设计RowKey,避免热点问题;预分区表...

    hbase分页查询实现.pdf

    HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java语言实现HBase的分页...

    Hbase性能优化百科全书(csdn)————程序.pdf

    在HBase性能优化的过程中,表设计和...综上所述,HBase的性能优化是一个涉及表设计、RowKey策略、内存管理、读写优化等多个层面的综合过程,需要根据业务特性和硬件资源灵活调整,以实现最佳的数据存储和处理性能。

    HBase的性能优化

    "HBase性能优化" HBase是一种高性能的NoSQL数据库,广泛应用于大数据存储和处理领域。然而,HBase的性能优化是非常重要的,特别是在大规模数据集群环境中。以下是HBase性能优化的相关知识点: 启用LZO压缩 HBase...

    Cloudera-HBase最佳实践及优化.zip

    《Cloudera-HBase最佳实践及优化》是针对大数据存储和处理领域中HBase的一份重要参考资料,由Cloudera公司权威发布。这份文档详细介绍了如何有效地使用和优化HBase,以实现更高效、稳定的数据管理。以下是其中涵盖的...

    HBase最佳实践-读性能优化策略-3——HBase服务器端优化.pdf

    在HBase这样的分布式列式数据库中,读性能的优化至关重要,因为它直接影响到应用程序的响应速度和用户体验。本文主要探讨了HBase服务器端的读性能优化策略,这些策略可以帮助解决读延迟大、资源消耗高和负载不均衡等...

    HBase性能深度分析

    同时,compaction机制在文件数量超出“hbase.hstore.compactionThreshold”阈值时(默认3)启动,合并多个小文件,减少文件碎片,提升读写性能。 #### 结论与启示 通过对HBase数据插入性能的深度分析与实验验证,...

    hbase查询分页分页

    - 可能还包括性能优化,如缓存部分查询结果,减少对HBase的压力。 总的来说,HBase的分页查询涉及到对数据分布和查询策略的理解,以及在代码层面上的巧妙设计。掌握好这些技巧,能帮助我们在处理大规模数据时,更...

    HBase案例分析

    此外,对于特定查询场景,可能还需要结合HBase与其他大数据工具(如Spark、Hive等)进行集成,提升整体性能。 总结,HBase作为一款强大的分布式数据库,为大数据环境下的实时存储和查询提供了有力支持。通过深入...

Global site tag (gtag.js) - Google Analytics