Hbase高級特性及其優化分析

一、Hbase中的常見屬性

       VERSIONS:指版本數

       MIN_VERSIONS=> '0':最小版本數

       TTL=> 'FOREVER':版本存活時間

              假設versions=10,mini_version=4

              到達TTL時間後,version-mini_version=6,最老的6個版本的值會被清空

             

              create't2', {NAME => 'f1', VERSIONS => 1000,MIN_VERSIONS => '1000',TTL =>'31536000'}

             

       BLOOMFILTER=> 'ROW':布隆過濾器

                     -》NONE:不使用布隆過濾器

                     -》ROW:行級布隆過濾器

                     -》ROWCOL:行列布隆過濾器

                     進行storefile文件檢索的時候:

                     ROW:會對當前的storefile進行判斷,判斷是否有我需要的rowkey,

                                   如果有就讀,沒有就跳過

                     ROWCOL:會對當前的storefile進行判斷,判斷是否有我需要的rowkey+列標籤的組合,

                                   如果有就讀,沒有就跳過

                                   這種消耗的資源較大

       BLOCKSIZE=> '65536':數據塊的大小,如果你的數據塊越小,索引就越大

                                                 佔用的內存就越高,速度會更快

                     create't3', {NAME => 'f1', BLOCKSIZE => '65536'}

       BLOCKCACHE=> 'true':緩存,默認就是true

                            建議:在企業中,對於不常使用的列簇,關閉緩存

       IN_MEMORY=> 'false':緩存中的級別,設置成TRUE,將優先緩存該列簇

                            緩存清理的算法:LRU

                           

二、hbase中實現預分區

       設計分區時按照rowkey的前綴

       -》第一種:創建了5個分區

              create'split1', 'f1', SPLITS => ['100', '200', '300', '400']

              put'split1','001000000_2016','f1:name','111'           會放到第一個分區中

              put'split1','501000000_2016','f1:name','222'           會放到第五個分區中

       -》第二種

              create'split2', 'f1', SPLITS_FILE => '/opt/datas/splits.txt'

       -》第三種(默認創建15個分區,一般不使用)

              create'split3', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

       -》第四種:Java client

              byte[][]splitKeys = {

                     Bytes.toBytes("100"),

                     Bytes.toBytes("200"),

                     Bytes.toBytes("300")

              };

三、hbase中的優化

       -》hbase中的壓縮

              -》時間換取空間

              -》Hadoop是否支持需要壓縮類型

                     snappy安裝:將壓縮包放到並解壓/opt/modules/hadoop-2.5.0/lib/native

                     bin/hadoopchecknative

              -》檢測hbase當前是否支持壓縮

                     bin/hbaseorg.apache.hadoop.hbase.util.CompressionTest /home/beifeng/snappy.txt snappy

              -》修改配置支持壓縮

                     拷貝hadoop/lib下的native下的所有so文件和hadoop-snappy-0.0.1-SNAPSHOT.jar到hbase/lib下面

                     cp../hadoop-2.5.0/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar lib/

                     cp../hadoop-2.5.0/lib/native/* lib/

                     如果有多臺regionserver,要將文件拷貝到每一臺regionserver上

                     重啓集羣,測試

                     如果繼續報錯:

                     cp../hadoop-2.5.0/lib/native/* ../jdk1.7.0_67/jre/lib/amd64/

                     重啓測試

                     2016-12-1919:10:48,830 INFO  [main]compress.CodecPool: Got brand-new decompressor [.snappy]

SUCCESS

              -》創建表測試

                     create'snappytest',{NAME=>'F1',COMPRESSION => 'SNAPPY'},{NAME=>'F2'}

      

       -》垃圾回收參數調優

              -》JVM:

                     新生代:空間比較小,主要存儲新生成的對象,生存週期比較短

                                   Eden、survivor

                     老年代:空間表較大、主要存儲應用程序中生命週期較長的對象

                     永生代:永久保存的區域,存儲meta和class的信息

                                   元空間(本地內存)

                            GC:

                            ParrallelNew Collector 垃圾回收策略

                            特點:速度比較快,但是不適用與大數據量,GC停頓

                            並行標記回收器(ConcurrentMark-Sweep Collector):

                            特點:速度相對較慢,適用於大數據量的回收,避免GC停頓

                           

                     exportHBASE_REGIONSERVER_OPTS=”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC-XX:UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc-XX:+PrintGCDetails -XX:+PrintGCTimeStamps-Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log”

                    

                     調優:將上述配置放入conf/hbase-env.sh文件

      

       -》hbase中內存的調優

              -》memstore

                     閾值:128M

                       <property>

                            <name>hbase.hregion.memstore.flush.size</name>

                            <value>134217728</value>

                       </property>

                     正常情況:關閉自動溢寫

                                     在業務量較低時,手動觸發flush

              -》cache

                     在注重讀響應時間的應用場景下,可以將 BlockCache設置大些,Memstore設置小些,以加大緩存的命中率。

                        <name>hbase.regionserver.global.memstore.upperLimit</name>

                            <value>0.4</value>

                            <name>hfile.block.cache.size</name>

                            <value>0.4</value>

                     按照以下百分比分配給Single、Multi、InMemory使用:0.25、0.50和0.25。

                    

              -》本地memstore緩存

                     內存的孔洞過多,需要進行垃圾回收,造成業務停頓

                     <name>hbase.hregion.memstore.mslab.enabled</name>

                     <value>true</value>

                     缺點:容易造成資源的浪費

              -》compact:用於文件的合併和清除被刪除的數據

                     -》minor compaction:小文件(滿足一定的條件)的合併,輕量級,頻繁執行

                                                        它不會刪除被標記爲“刪除”的數據和以過期的數據

                     -》major compaction

                            把所有的storefile合併成一個單一的storefile文件,

                            在文件合併期間系統會刪除標記爲"刪除"標記的數據和過期失效的數據,

                            同時會block所有客戶端對該操作所屬的region的請求直到合併完畢,

                            最後刪除已合併的storefile文件。

                                <name>hbase.hregion.majorcompaction</name>

                                   <value>604800000</value>

                            改成0就是關閉

                           

                            企業中手動觸發:major_compact

              -》split

                     最好關閉自動拆分,採用手動拆分方式:split

                        <name>hbase.hregion.max.filesize</name>

                            <value>10737418240</value>

                            建議改成100G

四、hbase表的遷移

       -》hadoop數據遷移類似

       -》hdfs

       -》表的遷移

              -》將數據遷移-》hadoop distcp 

                            bin/hdfsfsck /

                            bin/hbasehbck

              -》元數據的恢復

                           

       實驗步驟:

       -》第一步:將t5表遷移到另一個hdfs集羣

              在遷移之前要進行flush操作 (原路徑 目標路徑)

              bin/Hadoopdistcp hftp://192.168.134.191:50070/hbase/data/default/t5 hdfs://192.168.134.140:8020/distcp/

       -》第二步:刪除t5表

       -》第三步:t5表遷移回來

              bin/Hadoopdistcp hftp://192.168.134.140:50070/distcp/t5hdfs://192.168.134.191:8020/hbase/data/default/

       -》第四步:查詢hbase表

              list可以查詢,無法操作

              ERROR:Unknown table t5!

       -》第五步:元數據恢復

              bin/hbasehbck  -fixAssignments –fixMeta

五、索引的介紹

 

       rowkey:110_20161211

                 110_20161212

                 110_20161213

                 110_20170213

                

       需求1:查找某個用戶某一時間段內的通話記錄

       需求2:查詢某一時間段內所有用戶的通話記錄

      

       索引表方式實現:

              源  表:110_20161211

              索引表:20161211_110      value:對應源表中的rowkey:110_20161211

             

       需求:通過某一列的值來查詢另一列的值

              name,age:查詢所有今年18歲的用戶的姓名

             

              傳統思路:1-查詢所有18歲的用戶的rowkey

                              2-根據rowkey查詢name

      

       索引實現:rowkey:18

                       info:rowkey:18歲對應的rowkey

                      

       索引表同步的問題:

              -》第一種(效率低):在客戶端執行,對源表操作時,同時對索引表進行操作

              -》第二種:編寫協處理器

                                   在server端運行在客戶端同步的邏輯,但是中小型企業不會自己編寫

              -》其他框架:第三方工具

                     -》Phoenix:底層就是協處理器

                     -》solr

                     -》elasticsearch

              協處理器類型:

                     observer:觀察者類,類似於RDBMS中的觸發器

                     endpoint:終端類,類似於存儲過程

六、hbase與其他框架的集成

       -》Hive

       -》sqoop

       -》flume

       -》hue

      

-》sqoop與hbase集成(使用的是cdh版本的)

       用於hdfs與RDBMS之間的導入導出

       -》配置conf/sqoop-env.sh

       原始

新配置

              exportHADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0

 

              #Setpath to where hadoop-*-core.jar is available

              exportHADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0

 

              #setthe path to where bin/hbase is available

              exportHBASE_HOME=/opt/modules/hbase-0.98.6-hadoop2

 

              #Setthe path to where bin/hive is available

              #exportHIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6

 

              #Setthe path for where zookeper config dir is

              exportZOOCFGDIR=/opt/modules/zookeeper-3.4.5/conf

       導入:

              bin/sqoopimport \

              --connect\

              jdbc:MySQL://hadoop-senior01.ibeifeng.com:3306/test\

              --usernameroot \

              --password123456 \

              --tablemy_user \

              --hbase-create-table\

              --hbase-tabletest \

              --hbase-row-keyid \

              --column-familyinfo \

              -m1

在HBase中查詢:

       導出:沒有導出

       怎麼實現用sqoop導出hbase的數據?

       搭橋:hive

              hive與hbase集成

                     |

                     將hbase表中的數據存儲到另一張hive表中

                     |

                     通過hdfs導出

                           

-》hue集成

       -》啓動hbase的thrift

              bin/hbase-daemon.shstart thrift

       —》修改hue.ini配置文件(/opt/cdh-5.3.6/hue-3.7.0-cdh5.3.6/desktop/conf/)

         hbase_clusters=(Cluster|hadoop-senior01.ibeifeng.com:9090)

         # HBase configuration directory, wherehbase-site.xml is located.

        hbase_conf_dir=/opt/modules/hbase-0.98.6-hadoop2/conf

       -》啓動hue

              hue:build/env/bin/supervisor

hadoop-senior01.ibeifeng.com:8888

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章