1. 程式人生 > >Hadoop之Hbase詳解

Hadoop之Hbase詳解

1、什麼是Hbase
  HBASE是一個高可靠性、高效能、面向列、可伸縮的分散式儲存系統,
  hbase是列式的分散式資料庫

  1.2、HBASE優勢:
    1)線性擴充套件,隨著資料量增多可以通過節點擴充套件進行支撐
    2)資料儲存在hdfs上,備份機制健全
    3)通過zookeeper協調查詢資料,訪問速度塊

  1.3、hbase叢集中的角色
    1、一個或者多個主節點,Hmaster
    2、多個從節點,HregionServer

  1.4、Row Key
    與nosql資料庫們一樣,row key是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:
      1.通過單個row key訪問
      2.通過row key的range(正則)
      3.全表掃描
    1.4.1Row key行鍵

      Row key可以是任意字串(最大長度 是 24KB,實際應用中長度一般為 10-100bytes),
    在HBASE內部,row key儲存為位元組陣列。儲存時,資料按照Row key的字典序(byte order)排序儲存。
    設計key時,要充分排序儲存這個特性,將經常一起讀取的行儲存放到一起。(位置相關性)
    1.4.2. Columns Family
      列簇 :HBASE表中的每個列,都歸屬於某個列族。列族是表的schema的一部 分(而列不是),必須在使用表
      之前定義。列名都以列族作為字首。例如 courses:history,courses:math都屬於courses 這個列族。
    1.4.3. Cell


      由{row key, columnFamily, version} 唯一確定的單元。cell中 的資料是沒有型別的,全部是位元組碼
      形式存貯。關鍵字:無型別、位元組碼
    1.4.4. Time Stamp
      HBASE 中通過rowkey和columns確定的為一個存貯單元稱為cell。每個 cell都儲存 著同一份資料的多個
      版本。版本通過時間戳來索引。時間戳的型別是 24位整型。時間戳可以由HBASE(在資料寫入時自動 )賦值
      ,此時時間戳是精確到毫秒 的當前系統時間。時間戳也可以由客戶顯式賦值。

  1.5. 命令
    名稱 命令表示式
      建立表 create '表名', '列族名1','列族名2','列族名N'
      檢視所有表 list
      描述表 describe ‘表名’
      判斷表存在 exists '表名'
      判斷是否禁用啟用表 is_enabled '表名' is_disabled ‘表名’
      新增記錄 put ‘表名’, ‘rowKey’, ‘列族 : 列‘ , '值'
      檢視記錄rowkey下的所有資料 get '表名' , 'rowKey'
      查看錶中的記錄總數 count '表名'
      獲取某個列族 get '表名','rowkey','列族'
      獲取某個列族的某個列 get '表名','rowkey','列族:列’
      刪除記錄 delete ‘表名’ ,‘行名’ , ‘列族:列'
      刪除整行 deleteall '表名','rowkey'

      刪除一張表 先要遮蔽該表,才能對該表進行刪除
      第一步 disable ‘表名’ ,第二步 drop '表名'
      清空表 truncate '表名'
      檢視所有記錄 scan "表名"
      檢視某個表某個列中所有資料 scan "表名" , {COLUMNS=>'列族名:列名'}
      更新記錄 就是重寫一遍,進行覆蓋,hbase沒有修改,都是追加

 

2、hbase依賴zookeeper
  1、 儲存Hmaster的地址和backup-master地址
    hmaster:
      a) 管理HregionServer
      b) 做增刪改查表的節點
      c) 管理HregionServer中的表分配
  2、 儲存表-ROOT-的地址
    hbase預設的根表,檢索表。
  3、 HRegionServer列表
    表的增刪改查資料。
    和hdfs互動,存取資料

3、Hbase原理
  3.1.寫流程
    1、 client向hregionserver傳送寫請求。
    2、 hregionserver將資料寫到hlog(write ahead log)。為了資料的持久化和恢復。
    3、 hregionserver將資料寫到記憶體(memstore)
    4、 反饋client寫成功。

  3.2、資料flush過程
    1、 當memstore資料達到閾值(預設是64M),將資料刷到硬碟,將記憶體中的資料刪除,同時刪除Hlog中的歷史資料。
    2、 並將資料儲存到hdfs中。
    3、 在hlog中做標記點。

  3.3.資料合併過程
    1、 當資料塊達到4塊,hmaster將資料塊載入到本地,進行合併
    2、 當合並的資料超過256M,進行拆分,將拆分後的region分配給不同的hregionserver管理
    3、 當hregionser宕機後,將hregionserver上的hlog拆分,然後分配給不同的hregionserver載入,修改.META.
    4、 注意:hlog會同步到hdfs

  3.4.hbase的讀流程
    1、 通過zookeeper和-ROOT- .META.表定位hregionserver。
    2、 資料從記憶體和硬碟合併後返回給client
    3、 資料塊會快取

  3.5.hmaster的職責
    1、管理使用者對Table的增、刪、改、查操作;
    2、記錄region在哪臺Hregion server上
    3、在Region Split後,負責新Region的分配;
    4、新機器加入時,管理HRegion Server的負載均衡,調整Region分佈
    5、在HRegion Server宕機後,負責失效HRegion Server 上的Regions遷移

  3.6.hregionserver的職責
    HRegion Server主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBASE中最核心的模組。
    HRegion Server管理了很多table的分割槽,也就是region。

  3.7.client職責
    Client
    HBASE Client使用HBASE的RPC機制與HMaster和RegionServer進行通訊
    管理類操作:Client與HMaster進行RPC;
    資料讀寫類操作:Client與HRegionServer進行RPC

  3.8.Hbase表結構:
    建表時,不需要限定表中
    欄位,只需要指定若干列族
    插入資料時候,列族中可以儲存任意多個
    列(kv,列名&列值)
    要查詢某個具體欄位的值,需要指定的
    座標:表名——>行鍵——>列族:列名——>版本——>


  Hmaster:不負責儲存表資料
    1、:負責管理regionserver的狀態
    2、:負責regionserver的負載均衡

  HBase的定址機制
    使用者資料表——>META表——>ROOT表——>ZooKeeper

    一個使用者的資料表會被切分很多的region
    會被儲存在很多的regionserver上

    Hlog記錄了當前資料的最新操作
    store是一個列族

4. MapReduce操作Hbase
  實現方法
    Hbase對MapReduce提供支援,它實現了TableMapper類和TableReducer類,我們只需要繼承這兩個類即可。
      1、寫個mapper繼承TableMapper<Text, IntWritable>
        引數:Text:mapper的輸出key型別; IntWritable:mapper的輸出value型別。
        其中的map方法如下:
        map(ImmutableBytesWritable key, Result value,Context context)
        引數:key:rowKey;value: Result ,一行資料; context上下文
      2、寫個reduce繼承TableReducer<Text, IntWritable, ImmutableBytesWritable>
        引數:Text:reducer的輸入key; IntWritable:reduce的輸入value;
        ImmutableBytesWritable:reduce輸出到hbase中的rowKey型別。
        其中的reduce方法如下:
        reduce(Text key, Iterable<IntWritable> values,Context context)
        引數: key:reduce的輸入key;values:reduce的輸入value;