使用MR编程hbase和hbase调优-布隆过滤器

使用MR编程操纵hbase
======================================

    1、TableInputFormat输入K,V格式
        ImmutableBytesWritable    //相当于textInputFormat中的偏移量
        Result            //真实数据


        使用conf设置table配置文件
            conf.set(TableInputFormat.INPUT_TABLE,"ns1:t1");    //指定表名
            //还需手动添加
            conf.set("hbase.zookeeper.quorum","s102:2181,s103:2181");    //指定zk连接地址

    2、TableOutputFormat输出K,V格式
        ignore        //当指定value时,此项可忽略,建议使用NullWritable
        Put || Delete    //hbase的put或delete


        使用conf设置table配置文件
            conf.set(TableOutputFormat.OUTPUT_TABLE,"ns1:wc");    //指定表名              
            //还需手动添加                                                                  
            conf.set("hbase.zookeeper.quorum","s102:2181,s103:2181");    //指定zk连接地址




布隆过滤器
=============================
    是hbase的文件格式,以k/v形式存储,k/v均是字节数组

    HFile包括以下内容:
        读取或写入压缩块的存储空间。 
        每个块所指定的I/O操作的压缩编解码器
        临时的key存储
        临时的value存储
        hfile索引,存在于内存,占用空间约为(56+AvgKeySize)*NumBlocks.
        性能优化建议
    ****    最小块大小,推荐在 8KB to 1MB之间
            顺序读写推荐大块,但不便于随机访问(因为需要解压更多的数据)
            小块便于随机读写,但是需要占用更多内存,但是创建起来更慢(因为块多,每次压缩都需要flush操作)
            由于压缩缓存,最小块大小应该在20KB-30KB.


    hfile中的索引,在每次加载region的时候会加载到内存

    region:文件夹/cf:文件夹 --------> HFile

    在进行查询时,会将cf文件夹中所有的hfile索引进行LSM树遍历查找(近似于二分查找),
    所以在查找的时候会遍历所有的索引

    布隆过滤器为了解决此问题,可以立刻判断此文件没有制定的rowKey。帮助过滤掉一些不需要扫描的文件
    比块索引粒度粗

    所以hbase在定位rowKey的时候,首先通过布隆过滤器排除一些肯定不存在的hfile
                     然后在剩下可能存在hfile的文件中通过块索引遍历数据。


    布隆过滤器配置:BLOOMFILTER
        NONE        //不适用,不占用
        ROW        //推荐只扫描行级别的操作,占用资源不大
        ROWCOL        //推荐扫描行+列级别操作,占用资源稍大


    alter 'ns1:t1', NAME => f1, BLOOMFILTER => ROWCOL



HBase调优:
=================================
    1、调整新生代堆内存大小
        export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

    2、配置减少垃圾回收产生的内存碎片
        hbase.hregion.memstore.mslab.enabled ===> true    

    3、采用压缩    //只能在空表采用压缩
        alter 'ns1:t1', NAME => 'f1', COMPRESSION => 'LZ4'

    4、优化拆分和合并:
        split:避免切割风暴        //region默认10G,当所有表同时增长到指定阈值,就会同时进行切割
                        //极大影响集群性能
                        //解决方案:1、设置超大值,进行手动切分
                                2、进行预切割
               
               避免热点数据:        //rowKey设计原则:在集群范围分散,在区域范围连续
                                       1、组合键
                                2、调整组合键权重
                                3、进行盐析:随机加盐x    hash加盐-  手动设计前缀:在集群范围分散,在区域范围连续
                                4、数字比较,使用MAX_VALUE-num 进行倒排
                                5、格式化数字串    DecimalFormat
               手动移动区域:



                    
        merge:merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME' 

    5、负载均衡:    //超过半数region由一个regionServer管辖,导致压力过大

        close_region    //关闭区域
        assign        //注册区域
        unassign    //注销当前regionserver,并在其他节点重新注册

        balancer    //均衡器,unassign所有的region并重新注册


    6、API
        1、关闭自动刷写
            table.setAutoFlush(false, false);

        2、设置扫描缓存 || 批次
            scan.setCaching()

        3、限定扫描范围        //避免全表扫描

        4、关闭resultScanner    //影响性能问题
            rs.close()

        5、扫描设置快缓存    //默认true
            将扫描结果缓存到客户端以便下次使用

        6、设置过滤器:        
            RowFilter
            FamilyFilter
            QualifierFilter
            ValueFilter

            SingleColumnValueFilter

            FilterList

        7、put设置禁止写入WAL    //不推荐    WAL的生命周期
            put.setDurability(Durability.SKIP_WAL);

    7、配置
        1、增加处理线程
            hbase.regionserver.handler.count

        2、增加堆内存:hbase-env.sh
            export HBASE_HEAPSIZE=1G    //默认1G
            
        3、调整快缓存大小
            hfile.block.cache.size=0.4    //堆内存的40%

        4、调整memstore大小
            hbase.regionserver.global.memstore.size            //最大memstore,默认堆内存40%
            hbase.regionserver.global.memstore.size.lower.limit    //最小memstore,默认最大memstore的95%

        

            
        






    

        

猜你喜欢

转载自www.cnblogs.com/zyde/p/9015827.html