4-HBase

定義:
  HBase是一個分佈式的、面向列的開源數據庫,該技術來源於 Fay Chang 所撰寫的Google論文「Bigtable:一個結構化數據的分佈式存儲系統」。就像Bigtable利用了Google文件系統(File System)所提
  供的分佈式數據存儲同樣,HBase在Hadoop之上提供了相似於Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不一樣於通常的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另外一個不
  同的是HBase基於列的而不是基於行的模式。
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
********************************************************************HBase********************************************************************************************* —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 1、HBase特色 —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— Hbase是一個面向列的分佈式存儲系統。 1)存儲量大 :能夠存儲很大的數據量,而關係型數據庫是有瓶頸的(一個表能夠有數十億行,上百萬列) 2)面向列 : 每行都有一個可排序的主鍵(rowkey),和任意多的列,列能夠根據須要動態的增長,同一張表中能夠有不少大相徑庭的列 3) 稀疏 : 對於空的列(null ) 不佔用存儲空間的,表能夠設計的很是稀疏 4)數據多版本 :每一個數據能夠有多個版本存儲,默認狀況下版本號自動分配的,通常來講就是插入時間戳。 5)數據類型單一:在Hbase中數據都是字符串,沒有類型 ———————————————————————————————————————————————————————————————————— 2、基本概念 ———————————————————————————————————————————————————————————————————— 推薦概念理解網址:https://blog.csdn.net/devcy/article/details/79790113 1)表空間(namespace) :相似於mysql中數據庫的概念(database) 2) 表(table) 3) 行(row) 3) 列(Column) 4) 單元格(cell): 都是由時間戳,具體的值組成(能夠看下列的模型) 5) 行鍵(rowkey) ①全部的行是按照rowkey的字典序進行排序的,字典序是按照二進制逐字節進行比較的 (就是每一個key的第一位進行比較,而後第二位進行比較,而後第三位,例如:100比20小) ②行鍵老是惟一的,而且只出現一次,行鍵能夠是任意的字節 支持64kb 6) 列簇:(column family):由若干個列構成一個列簇 注意:①列簇在建表的時候就須要定義好,而且不能頻繁修改,數量也不要太多 ②空的列(null ) 不佔用存儲空間的,表能夠設計的很是稀疏 ———————————————————————————————————————————————————————————————————— 3、組件 ———————————————————————————————————————————————————————————————————— HBase的服務器體系結構聽從簡單的主從服務器架構,它由HRegion Server集羣 + HBase Master集羣服務器 + ZK集羣組成 。 主節點Hmaster在整個集羣當中只有一個在運行,從節點HRegionServer有很 多個在運行。即只有一個機器上面跑的進程是Hmaster,不少機器上面跑的進程是HRegionServer, ZK在HBase和Hadoop HA中同樣,都是保存元數據的。 Hadoop HA : ①保存鏡像文件和編輯日誌 ②保證集羣中只有一個NN HBase: ①存儲HBase的-ROOT-表和.META.表 ②保證HBase Master集羣只有一個HBase Master 區別:①NN中有鏡像文件和編輯日誌,因此DN中的心跳檢測發送給NN。可是HBase Master沒有元數據,因此心跳檢測有ZK代替! ②Hadoop HA中起到共享存儲系統,可是在HBase中,倒是起到HBase Master 和 HRegion Server的中介做用!! Zookeeper: ①保證任什麼時候候,集羣中只有一個HMaster(HBase沒有單點故障!!!能夠同時啓動多個,可是ZK得保證每時刻只有一個HMaster運行); ②存儲HBase的-ROOT-表和.META.表: -ROOT-表:記錄了全部.META.表的元數據信息,-ROOT-表只有一個Region --->意思是-ROOT-表只有一張 .META.表:記錄了Hbase中全部表的全部HRegion的元數據信息(位置信息等),.META.表能夠有多個Region ----->意思是-META-表能夠有多張 因此說-ROOT保存的是多張.META表的元數據信息 ③實時監控HRegion Server的信息(心跳檢測),並實時通知給HMaster; 注:HBase沒有單點故障!!!能夠同時啓動多個,可是ZK得保證每時刻只有一個HMaster運行 HMaster:

      ①爲HRegionServer分配HRegion
      ②管理HRegionServer的負載均衡(合併的storeFile文件向其餘HRegion Server遷移)
      ③在HRegionServer停機後,負責失效HRegionServer上
         HRegion遷移工做。java

      ④在Region Split後,負責新Region的分配
      ⑤HDFS上的垃圾文件回收(storeFile合併、切分都在HDFS上進行)mysql

        注:HMaster須要知道HRegionServer的信息,這些信息都有Zookeeper提供!

  HRegion Server:

        ①監控維護Region,處理對這些HRegion的響應,請求;
        ②負責切分在運行過程當中變得過大的HRegion。

    HLog

        HLog:用來作災難恢復使用,HLog記錄本臺region server上全部HRegion數據的全部變動,一旦region server 宕機,就能夠從log中進行恢復。

        注:每一個HRegion Server只有一個HLog

    HRegion:(結合圖來看)

        注意:
            ①一張表由多個HRegion組成,根據rowkey劃分 :

                eg:分爲三個HRegion,那麼他們的存儲rowkey值會是(0000-2999)(3000-5999)(6000-8999),分佈在不一樣的HRegion Server

            ②HRegion由多個store組成,每一個store對應一個列族:

                eg:好比一張表有十個列族,那麼HRegion會有十個store

        ③store有一個memstore(緩存區)和多個HFile文件組成:git

 
 

          eg:對寫數據時,會先寫進memstore,memstore達到閾值時,溢寫成文件StoreFile。github

 
 

          HRegion會將大量的熱數據、訪問頻次最高的數據存儲到MemStore中,這樣用戶在讀寫數據的時候不須要從磁盤中進行操做,
          直接在內存中既能夠讀取到數據,正由於MemStore這個重要角色的存在,Hbase才能支持隨機,高速讀取的功能sql

 
 

        ④MemStore內存中的數據寫到文件後就是StoreFile,StoreFile底層是以HFile的格式保存(二進制)shell

 
 

        ⑤當多個StoreFile文件達到必定的大小後,會觸發Compact合併操做,合併爲一個StoreFile

        ⑥當Storefile大小超過必定閾值(256M)後,會把當前的HRegion分割爲兩個(Split),並由Hmaster分配到相應的HRegionServer,實現負載均衡!!

          注:每一個HRegionServer至關於一個DN,但有些DN沒有HRegionServer。
            因此HMaster將分割後的StoreFile文件數據移到HRegionServer(HDFS)上,這過程必需要實現負載均衡數據庫

 
 

          注:HBase是經過DFS client把數據寫到HDFS上apache

————————————————————————————————————————————————————————————————————

4、HBase讀寫流程
————————————————————————————————————————————————————————————————————

    寫數據流程:
            1,Client先訪問zookeeper的root表,而後訪問meta表,從meta表獲取相應HRegion信息
            2,經過HRegion信息,找到相應的regionserver

            3,把數據操做、真實數據分別寫到HLog和MemStore上一份

            4,MemStore達到一個閾值後則把數據刷成一個StoreFile文件。(若MemStore中的數據有丟失,則能夠HRegionServer上的HLog上恢復)
            
       5,當多個StoreFile文件達到必定的大小後,會觸發Compact合併操做,合併爲一個StoreFile,(這裏同時進行版本的合併和數據刪除。)

            6,當Storefile大小超過必定閾值後,HRegionServer會把當前的Region分割爲兩個(Split),並由Hmaster分配到相應的HRegionServer,實現負載均衡

            注:HFile是HBase中真正實際數據的存儲格式,HFile是二進制格式文件,StoreFile就是對HFile進行了封裝(其實就是一個東西)

    HBase讀數據流程


            1,Client先訪問zookeeper的root表,而後訪問meta表,從meta表獲取相應HRegion信息
            2,找到這個HRegion對應的regionserver

            3,查找對應的HRegion
            5,先從MemStore找數據,若是沒有,再到StoreFile上讀(爲了讀取的效率)。

    注意:


        ①Client訪問hbase上數據時並不須要Hmaster參與,數據的讀寫也只是訪問RegioneServer。
        ②HMaster僅僅維護這table和Region的元數據信息,負載很低。
 
        ③HBase是經過DFS client把數據寫到HDFS上
 
        ④HFile是HBase中真正實際數據的存儲格式,HFile是二進制格式文件,StoreFile就是對HFile進行了封裝(其實就是一個東西)
        ⑤MemStore溢寫文件成StoreFile,和對StoreFile進行合併都是在HDFS上進行的
————————————————————————————————————————————————————————————————————
4、Hbase尋址過程
————————————————————————————————————————————————————————————————————
     HBase 有兩張特殊表(都在ZK上):
        .META.:記錄了用戶全部表拆分出來的的 Region 映射信息,.META.能夠有多個 Regoin(rowkey段)
        -ROOT-:記錄了.META.表的 Region 信息,至關於給META表的內容作了一次索引

    Client 訪問用戶數據前須要首先訪問 ZooKeeper,找到-ROOT-表的 Region 所在的位置,然 後訪問-ROOT-表,
    接着訪問.META.表,從META表中找到RowKey段所在的HRegion Server的位置信息,最後才能找到用戶數據的位置去訪問,
    中間須要屢次 網絡操做,不過 client 端會作 cache 緩存。
————————————————————————————————————————————————————————————————————

4、基本命令
————————————————————————————————————————————————————————————————————

    
        bin/hbase shell                    //進入shell

    
        list_namespace                    //列出全部命名空間
        list_namespace_tables 'hbase'                //列出命名空間hbase中的全部表

        create_namespace 'test'                //建立命名空間
        drop_namespace 'test'                //刪除命名空間


        create 'test:t1', 'f1', 'f2', 'f3'                //在命名空間test中建立表t1,有三個列族:‘f1 , 'f2' , 'f3'    

        disable 'test:t1'            
         drop 'test:t1'                    //刪除表必須先禁用


        put 'test:t1','1001','f1:name','tiantian'            //添加數據
        put 'test:t1','1001','f1:age','98'
        put 'test:t1','1001','f1:age','98'
        put 'test:t1','1001','f1:age','98'

        
        get 'test:t1','1001'                       //獲得key=1001全部列
        get 'test:t1','1001','f1'                //獲得key=1001列族下的全部列
        get 'test:t1','1001','f1:name'                //查詢key=1001的名字
        get 'test:t1','1001',{COLUMN=>'info:age',VERSIONS=>2}     //獲得兩個版本的年齡


        count 'test:t1'                    //表的記錄數

        delete 'test:t1','1001','f1:name'                //刪除1001的name數據


        scan 'test:t1'                    //Scan 相似於mysql中的select * 可是在實際開發中不建議使用。若是使用請買好車票
        scan 'test:t1',{COLUMNS =>'f1:name'}            //指定列族掃描


        注:①若是沒有指定命名空間,默認是defult命名空間
            
                   get 't1','1001'                 //獲得defult下key=1001全部列    

             ②當輸入create、get、put等關鍵字中回車,會顯示相關命令的實例。    

————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————
5、HBase API
————————————————————————————————————————————————————————————————————
    注:Hbase和Hive、MR同樣都有本身的API實現,能夠用java去實現增刪查改。
————————————————————————————————————————————————————————————————————
6、Rowkey的設計原則
————————————————————————————————————————————————————————————————————

    ①RowKey惟一原則:必須在設計上保證其惟一性。

    ②RowKey長度原則:通常設計成定長。建議是越短越好

    ③RowKey散列原則:

            若是用時間戳作rowkey,那麼HRegion多是(0-6)(6-12)(12-18)(18-24);
            那麼產生的結果是(12-18)(18-24)的數據不少,

            因此通常把時間戳倒過來,20180213-->31208102

    熱點問題:

        1、加鹽:是在rowkey的前面分配隨機數,當給rowkey隨機前綴後,它就能分佈到不一樣的region中
        2、哈希:將rowkey轉化爲hash值,除以集羣個數,就能避免熱點問題
        3、反轉:時間戳反轉過來,避免熱點問題
————————————————————————————————————————————————————————————————————
7、Hbase Filter
————————————————————————————————————————————————————————————————————

    就至關於過濾器,理解爲sql語句的過濾條件 where 對查詢出來的結果進行過濾,操做Hbase的過濾器能夠經過shell的方式完成

    1 RowFilter:篩選出匹配的全部行
    2 ValueFilter:按照具體的值來篩選單元格
    3 ColumnPrefixFilter 按照列的前綴來查找單元格

    需求: 1 找到訪問的網站www.umeng.com的記錄
        scan 'ns1:phoneLog',FILTER=>"ValueFilter(=,'binary:www.umeng.com')"

    注:Filter的重要性會愈來愈低,因爲phoenix,畢竟sql是公用的。
————————————————————————————————————————————————————————————————————
8、Hbase的優化
————————————————————————————————————————————————————————————————————
    
    1、配置MemStore緩存區的大小

    2、配置文件合併 compact閾值

    3、配置文件拆分的閾值與split

    4、還有其餘的諸如垃圾回收機制
————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
********************************************************************HBase集成MapReduce***************************************************************************
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
1、Hbase與MapReduce集成
————————————————————————————————————————————————————————————————————
    ————————————————————————————————————————————————————————————————
    ①系統集成
    ————————————————————————————————————————————————————————————————
        ————————————————————————————————————————————————————————————
        1)安裝配置
        ————————————————————————————————————————————————————————————
            Hbase與MapRedcue內部已經作好了集成,直接調用便可

            集成的模式: 

                答:Hbase中讀取數據,則能夠做爲map的輸入, 將數據寫到hbase中,Hbase就能夠做爲reduce的輸入

            步驟:
                ①把HBase集成的jar包加載到hadoop的classpath路徑中(不然會報ClassNotFoundException)

                    vi /etc/profile:
                    export HBASE_HOME=/opt/app/hbase-1.3.1
                    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`$HBASE_HOME/bin/hbase mapredcp`

                ②查看集成的示例命令

                    hadoop jar  /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar     //須要將hadoop_home/bin追加到path

                          CellCounter: Count cells in HBase table.
                          WALPlayer: Replay WAL files.
                          completebulkload: Complete a bulk data load.
                          copytable: Export a table from local cluster to peer cluster.
                          export: Write table data to HDFS.
                          exportsnapshot: Export the specific snapshot to a given FileSystem.
                          import: Import data written by Export.
                          importtsv: Import data in TSV format.
                          rowcounter: Count rows in HBase table.
        ————————————————————————————————————————————————————————————
        2)集成實例(必須在HMaster上運行)
        ————————————————————————————————————————————————————————————
            ①測試統計行數命令(rowcounter)

                hadoop jar  /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar rowcounter test:t1

                注:會自動的統計test:t1表的行數
        
            ②測試導入命令(importcsv)

                1)create 'test:t1','f1','f2'                        //建立一個表,表中含有兩個列族(f1,f2)

                2)  建立一個1.csv

                    1,tiantian,shankou,92
                    2,xuewei,jingbian,89

                3)  hdfs dfs -put  ./1.csv   /                        //上傳文件到hdfs上

                4)

                    hadoop jar /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar 
                    importtsv -Dimporttsv.separator=,                 //文件中的分隔符
                    -Dimporttsv.columns=HBASE_ROW_KEY,            
                    f1:name,
                    f2:location,
                    f2:age 
                    test:t1 
                    /1.csv

                5)測試:scan 'test:t1'
    ————————————————————————————————————————————————————————————————
    ②java集成Hbase與MapReduce
    ————————————————————————————————————————————————————————————————
              系統集成其實就是運行hbase自帶的jar包

              因此咱們其實也能夠寫MR程序,打包成jar,只不過Map和Reduce繼承的TableMapper和TableReducer

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
******************************************************************** Hbase整合hive**********************************************************************************
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

    Hbase:負責存儲和讀取,沒有分析數據的能力,
    hive:對數據進行分析是hive的基本功能,    

    ①原理:
        內部表: 在hive中建立表,在建立的時候hbase同時建立,而且數據保存在hbase中

        外部表: 在hbase中已經存在了一張表,hive建立外部表對hbase中表進行映射,數據仍是存在hbase中


    ②配置過程省略;

        eg:    CREATE TABLE hbase_table_1(key int, value string) 
            STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
            WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")                //rowkey-------------->key
            TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");        //列族cf1中的列val----->value
                                                    
            注:hive:hbase_table_1     ------->    hbase: xyz        (兩張表的映射)


    ③當導入數據時,首先建立一個普通的表,導入數據,以後使用查詢的方式,導入關聯表中

        load data local inpath '/data/test.txt' into table hbase_table_2;
        insert overwrite table hbase_table_1 select key ,value from hbase_table_2;

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
********************************************************************Phoenix 與Hbase的集成**************************************************************************
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

        安裝步驟省略:

        phoenix : 利用相似於sql語句對hbase進行增刪查改。 

        語法:http://forcedotcom.github.io/phoenix/

————————————————————————————————————————————————————————————————————

          
    
相關文章
相關標籤/搜索