HBase相關

Hbase 是一個分佈式的,可擴展的,大數據存儲數據庫。一種構建在HDFS上的分佈式、面向列的存儲系統。redis

原理

特色:列存儲

  • 特色:
    • :一個表能夠有上億行,上百列 (Hbase的每一個Region的列都不多)
    • 面向列:面向列表(簇:Columnfamily)的存儲和權限控制,列(簇)獨立檢索
    • 稀疏:對於空(NULL)的列,並不佔用存儲空間。所以,表能夠設計的很是稀疏。
    • 無模式:每一行都有一個能夠排序的主鍵和任意多的列,列能夠根據須要動態增長,同一張表中不一樣的行能夠有大相徑庭的列。
    • 數據多版本:每一個單元的數據能夠有多個數據版本,默認狀況下,版本號自動分配,版本號就是單元格插入的時間戳。
    • 數據類型單一:Hbase中的數據都是字符串,沒有類型。

整體架構

輸入圖片說明

組成

  • client:包含了訪問HBase的接口,並維護cache來加快對HBase的訪問。
  • ZK:master和RegionServer啓動時會向Zookeeper註冊(服務發現)
    • 保證任什麼時候候,集羣只有一個mater。
    • 存儲全部Region的尋址入口
    • 實時監控Region Server的上線和下線信息,並通知給master。服務發現
    • 存儲HBase的Schema和table元數據。

輸入圖片說明

  • Hmaster:
    • 管理用戶對Table的增刪改查,爲Region Server 分配region
    • 負責Region Server的負載均衡
    • 發現失效的Region Server 並從新分配其上的region
    • HDFS上的垃圾文件回收
    • 處理schema更新請求
    • 在Region Split後,負責新Region的分配
  • Region Server:
    • 維護master分配給他的region,除了這些region的I/O請求
    • 負責切分在運行過程當中變得過大的region。
    • client 先從master和zk中獲取Region Server的地址。而後讀寫直接經過Region Server獲取
  • HRegion
    • table在行方向上分割爲多個Region。Region 是HBase中分佈存儲和負載均衡的最小單元,不一樣的Region能夠分片在不一樣的Region Server上,但同一個Region是不會拆分到多個Server上。
      • Client 要獲取完整的一個Row數據,必須經過 row、column、timestamp 的負載均衡從不一樣的 Region Server 中的Region中獲取具體數據,而後組裝
    • 每一個region由一下信息標識:
      • key:<表名,startRowKey,建立時間>
      • 由目錄表 (-ROOT和.META) 記錄該region的endRowkey。
  • Store
    • 每一個Region有一個或多個store組成。
    • Hbase會把數據放在一個store裏面,即爲每一個ColumnFamily見一個store。有幾個columnFamily就有幾個Store
  • MemStore
    • 保存數據的key-Values,存放在內存中
    • 當memStore大小達到一個閾值(默認64MB),Hbase會由一個線程將memStore會被flush到文件StoreFile,生成一個快照。
  • StoreFile:memStore內存中的數據寫到文件後就是StoreFile,StoreFile底層是以HFile的格式保存。
  • HLog(WAL log:write ahead log):用來作災難恢復使用,Hlog記錄數據的全部變動,一旦Region Server 宕機,就能夠從log中進行恢復。相似與:redis的 AOF
    • HLog文件就是一個普通的Hadoop Sequence File。
      • Sequence File 的value是key時HLogKey對象(?),其中記錄了寫入數據的歸屬信息。除了table和region名字外,還同時包括sequence number和timestamp,timestamp是寫入時間,sequence number的起始值爲0,或者是最近一次寫入文件系統的sequence number。Sequence File的value是HBase的Key-Value對象,對應HFile中的KeyValue
  • LogFlusher:sync()將數據刷新到SequenceFileLogWriter實現
  • LogRoller

HRegion 定位與spilit

輸入圖片說明

  • -ROOT-表.META.表(這兩個表也是存放在Region上)數據庫

    • Region元數據唄存儲在.META.表中,隨着Region增多,.META.表中的數據也會增大,並分裂成多個新的Region。爲了定位 .META.表中每一個Region的位置(存放在哪一個.META.表中),把Region在哪一個.META.表的元數據存放在-ROOT-表中,最後由Zookeeper記錄-ROOT-表的位置信息。
    • -ROOT-表永遠不會被分割,它只有一個Region,這樣能夠保證最多隻須要三次跳轉就能夠定位任意一個Region。
    • client會將查詢的位置信息保存緩存起來,緩存不會主動失效,所以若是client上的緩存所有失效,則須要進行6次網絡來回,才能定位到正確的region,其中三次用來發現 緩存失效,另外三次用來獲取位置信息。
  • 邏輯:數組

    • 經過zk裏面的文件/hbase/rs獲得 -ROOT-表的位置。-ROOT-表只有一個region
    • 經過 -ROOT表 查找Region在哪一個**.META.表**中。
    • 經過 .META.表查找到索要的用戶表region的位置。
  • Compact &&Split緩存

輸入圖片說明

邏輯存儲

  • 傳統關係型數據庫記錄日誌數據:

輸入圖片說明

  • Hbase面向列的存放方式:舊數據不會被覆蓋,只會添加

輸入圖片說明

  • 邏輯結構:
    • Row key:是byte array(最大長度爲64KB),做爲每條記錄的主鍵
      • 經過單個Row key訪問
      • 經過Row key的range全表掃描
      • Row key能夠任意字符串(最大長度是64K,實際應用中長度通常位10~100bytes),在Hbase內部Row key保存位字節數組。
    • Column Family:列簇,擁有一個名字,包含一個或者多個相關列
      • 每一個Column family是存放在HDFS上的單獨文件,空值不會被保存。
    • Column:列,屬於某個columnfamily,familyName:columnName,每條記錄可動態添加
      • Hbase經過Row 和 Column肯定一個單元存儲Cell。每一個Cell都保存着同一份數據的多個版本。版本經過時間戳索引來索引,時間戳的類型是64位整型
    • Version Number:類型位Long,默認值是系統的時間戳,可有用戶自定義
    • Value(Cell):Byte Array。
      • {row key,column(=<family>+<label>),version} 惟一去頂的單元。Cell裏面沒有類型,所有是字節碼形式存儲。

物理存儲

  • HFileHBase的基礎文件格式,全部的HBase都存放在HFile上面。若是說StoreFile是HBase數據存儲的最小邏輯單位。那麼HFile就至關於一個Linux的文件系統,映射物理磁盤和邏輯數據的最小單位。網絡

    • 輸入圖片說明

      • Trailer:指針指向其它數據塊的起始點。
      • File Info:記錄了文件的一些meta信息。
      • Data Block:是hbase io的基礎單元,爲了提升效率,HRegionServer中有基於LRU的block cache機制。
      • 每一個Data塊的大小能夠建立一個Table的時候經過參數指定(默認塊大小64K),大號的Block有利於順序scan,小號的Block有利於隨機查詢
      • 每一個Data塊除了開頭的Magic之外就是一個個KeyValue對拼接而成,Magic內容就是一些隨機數字,目的是防數據損壞。
    • 輸入圖片說明

      • 開始2個固定長度:表示key和value的長度
      • key:[RowKey的長度]-[Rowkey]-[ColumnFamily的長度]-[ColumnFamily]-[Qualifier]-[TimeStamp]-[key Type].key Type:在Put/Delete
  • HLog File:HBase的WAL(write ahead log)的存儲個數,物理上是Hadoop的Sequence File。在處理插入和刪除過程,用來記錄操做內容的日誌,只有日誌寫入成功,纔會通知客戶端操做成功架構

    • 輸入圖片說明
      • Sequence File的key是HLogKey的對象,HLogKey記錄了寫入數據的歸屬信息,除了table和Region名字外,同時還包括sequence number和timestamp,
        • sequence number起始值爲0,或者最近一次存入文件系統中的sequence number
        • timestamp 是寫入時間。

讀寫

  • 寫入:
    • Client經過zookeeper的調度,
      • RowKey存在:查詢到RowKey對應的-ROOT-和.META.的表,查詢到對應RegionServer信息。向RegionServer發送PUT寫請求,將put寫入WriteBuffer,若是是批量提交,寫滿緩存後自動提交。
      • RowKey不存在:直接經過Hmaster負載到對應的Region中
    • RegionServer中數據寫入Region的MemStore,知道MemStore達到預設的閾值。
    • MemStore中的數據被Flush成一個StoreFile
    • 隨着StoreFile文件的不斷增多,當數量增加到必定的閾值後,觸發Compact操做,將多個StoreFile合併成一個StoreFile,同時進行版本合併和數據刪除。
    • StroeFiles經過不端的Compact合併操做,會造成愈來愈大的StoreFile。
    • 當個StroeFile大小超過過必定閾值後,觸發Split操做,把當前Region Split成2個新的Region。父Region會下線,新的Split出2個Region會被Hmaster分配到對應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。

輸入圖片說明

  • 讀取:
    • Client訪問Zookeeper,查找**-ROOT-表和.META.表**信息
    • 從**.META.表**中查詢存放目標數據的Region信息,從而找到對應的RegionServer
    • 從RegionServer獲取須要查找的數據。
    • RegionServer的內存分爲MemStore和BlockCache兩部分,MemStore主要用於寫數據,BlockCache主要用於讀數據。讀請求想到MemStore中查數據,查不到就到BlockCache中查,在查不到就會到StoreFile讀,並把讀的結果放入BlockCache。

安裝

使用

相關文章
相關標籤/搜索