1. 程式人生 > >使用MR編程hbase和hbase調優-布隆過濾器

使用MR編程hbase和hbase調優-布隆過濾器

style zook 存儲空間 del 使用 字節數 permsize 判斷 enabled

使用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%

使用MR編程hbase和hbase調優-布隆過濾器