Hbase的优化总结

来源:互联网 发布:手机smali转换java 编辑:程序博客网 时间:2024/04/28 15:50

Hbase的优化总结

 

上面这张图不是一太清晰,我后面给个单独的连接

 这里的HBase的优化主要从三个大的维度来进行分析

1、系统硬件

       采用普通的PC Server即可,Master要求高一点(比如8 CPU,48G内存,SAS raid),Regionserver(如8CPU,24G内存,1T*12 SATA JBOD)

      对于存储regionserver节点采用JBOD,master采用sas raid1+0

     数据的存储在hdfs中本身考虑到了冗余,一般情况下replication设置为3,所以不用做raid;需要考虑的是每个节点的可用的存储空间的大小,所以这里用磁盘簇的方式。

      网卡千兆的,做网卡bond,并且管理网段和请求网段分开,对于大的混合集群来说,可以设计多个vlan。

2、客户端client

       a、 scan cache:顺序读的场景中,比如mapreduce做计算,可以设置在regionserver中的一次缓存的数量,可以加快scan的进度,

       不过考虑到regionserver的内存限制,需要注意regionserver并发线程的控制。

      b、在插入数据时,最好用批量插入操作,效率会更高一些。

      c、auto flush最好disable掉

            对于client来说,有一个writebuffer的缓冲,buffer满了之后,自动的发送数据到regionserver端

             可以在某个时间点,手动调用flush的操作进行flush数据

             调用close操作,会隐含调用flush操作

3、regionserver    

           a、对于插入操作,不要集中在一个region中插入,需要考虑rowkey的设计(rowkey如果是顺序设计的,这样会集中插入到一个region中),以及最好预先创建好split region

            b、对于查询操作时,又分为两种情况,一种是顺序读,一种是随机读。

                    顺序读,最好rowkey是连续的设计的,这样可以从一个region中批量读数据;并且关闭block cache(客户端调用setBlockCache(false))。

                    随机读,打开block cache(设置cache合理大小,hfile.block.cache.size);采用booleam filter,提供随机查询的效率。

                  当然HFile块的大小设计很重要,随机读的情况下,可以设置小一点,顺序读的情况下,设计大一下。

             c、对于compact&split操作,建议禁止major compact(hbase.hregion.majorcompaction设为0),该为手动方式,每天不忙的时候进行。

                    设置单个region的合理的大小(hbase.hregion.max.filesize),超过这个值,就自动进行split操作。

              d、手动进行balancer操作

              e、内存大小的相关考虑

                        1) 对于region column family 的buffer,设置合理的checkpoint百分比,减少硬盘IO的操作;对buffer memstore设计合理大小,防止内存溢出。

                                           主要有这三个参数,hbase.regionserver.global.memstore.upperLimit,hbase.regionserver.global.memstore.lowerLimit,memstore.flush .size

                         2)regionserver JVM参数设置

                                      设置最大合理内存大小

                                      垃圾回收策略,并发CMS的设置,比如-XX:CMSInitiatingOccupancyFraction=70,memstore limit 40%,block cache 20%,

                                            防止promted fail(new区S区域放不下,放到旧生代,而旧生代空间不足),防止CMS的同时  ,对象迁移到旧生代,而旧生代空间不足。  

                                             为了避免CMS带来的碎片,可以考虑采用MSLAB

                           3) block cache,创建表时,设置该表对应的块是cache的,通过LRU算法淘汰;不过块中的数据索引dataIndex是放在内存中的。

                f、HFile的设置

                           1)可以压缩存储,减少磁盘和网络IO,有GZIP、LZO、Snappy,一般采用LZO或者Snappy。

                           2)对于HFile中块的大小设置,可以根据顺序读和随机读的比重,来考虑(顺序读,块设置大,随机读,块设置小一点)     

                 g、regionserver并发处理线程handler的的数量(payload大,建议handler数量小一些,反之,建议handler数量大一些)

                 h、可以把一些操作,放在regionserver端执行,避免来回数据交互(filter,coprocessor,count) 

 

相关参数设置参考

  client
              Scan Caching(默认是1条,设置成20条)
              Scan Attribute Selection
             Close ResultScanners
              AutoFlush(默认是true,设置成false)
              Bloom Filter
   
regionserver
    内存 

       JVM(CMS GC,24G heap,-XX:CMSInitiatingOccupancyFraction=70)
        hbase.regionserver.global.memstore.upperLimit(默认0.4)
        hbase.regionserver.global.memstore.lowerLimit(默认0.3)
        hbase.hregion.memstore.flush.size(64M,如果region的数量不多,可以设置的大一些,假如有1000个region*200M)
         hbase.hregion.memstore.block.multiplier(默认是2)
         hfile.block.cache.size(默认是0.2,场景中是读多写少,建议开大一些,0.4)
         hbase.hregion.memstore.mslab.enabled
    文件大小
         hbase.hregion.max.filesize(默认256M,实际环境中为1G,每天手动split,compact)
         hbase.hstore.blockingStoreFiles(默认7),通常情况下,一个storeFile大概在200M的样子,当进行major compact时,会合并成一个
    线程设置
          hbase.regionserver.handler.count(默认是10,设置成100,和内存大小有关系)