HBase基礎知識大補

HBase 概念

HBase是一個分佈式的、面向列的開源數據庫,是Apache的Hadoop項目的子項目,是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。

HBase 特點

  • HBase位於Hadoop結構化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce為HBase提供了高性能的計算能力,Zookeeper為HBase提供了穩定服務和failover機制。
  • HBase 適合存儲半結構化或非結構化的數據,比如數據結構字段不夠確定或者雜亂無章很難按照一個概念去抽取的數據,所以,HBase支持動態添加列。
  • HBase的存儲效率比較高,為null的數據不會被存儲。既節省了空間又提高了讀性能。
  • Hase的表包含rowKey、列族和列,存儲數據的最小單元是單元格,單元格包含數據及其對應的寫入時間戳,新寫入數據時,附帶寫入時間戳,可以查詢到之前寫入的多個版本。
  • HBase是主從結構,hmaster作為主節點,hregionServer作為從節點。
  • 對於數據存儲事務的要求不像金融行業和財務系統這麼高,只要保證最終一致性就行。
  • 要求高可用性和支持海量數據以及很大的瞬間寫入量。

HBase 架構圖


HBase基礎知識大補

⑴Master

  • 為 RegionServer 分配 Region
  • 負責 RegionServer 的負載均衡
  • 發現失效的 RegionServer 並重新分配其上的 Region
  • HDFS 上的垃圾文件回收
  • 處理 Schema 更新請求(表的創建,刪除,修改,列簇的增加等等)

⑵ZooKeeper

  • 為 HBase 提供 Failover 機制,選舉 Master,避免單點 Master 單點故障問題
  • 存儲所有 Region 的尋址入口:-ROOT-表在哪臺服務器上。-ROOT-這張表的位置信息
  • 實時監控 RegionServer 的狀態,將 RegionServer 的上線和下線信息實時通知給 Master
  • 存儲 HBase 的 Schema,包括有哪些 Table,每個 Table 有哪些 Column Family

⑶RegionServer

  • 維護 Master 分配給它的 Region,處理對這些 Region 的 IO 請求
  • 負責 Split 在運行過程中變得過大的 Region,負責 Compact 操作
  • client 訪問 HBase 上數據的過程並不需要 master 參與,Master 僅維護 Table 和 Region 的元數據信息,負載很低。
  • .META. 存的是所有的 Region 的位置信息,那麼 RegioneServer 當中 Region 在進行分裂之後 的新產生的 Region,是由 Master 來決定發到哪個 RegioneServer

在沒有 Region 分裂的情況,Master 宕機一段時間是可以忍受的。


⑷HFile

  • HBase中KeyValue數據的存儲格式,HFile是Hadoop的 二進制格式文件
  • 實際上StoreFile就是對Hfile做了輕量級包裝,即StoreFile底層就是HFile。

⑸MemStore

  • 放在內存裡的
  • 保存修改的數據即keyValues
  • 當memStore的大小達到一個閥值(默認128MB)時,memStore會被flush到文 件,即生成一個快照。
  • 有一個線程來負責memStore的flush操作

⑹多個Region

  • Region 相當於一個數據分片
  • 採用了"Range分區",將 Key 的完整區間切割成一個個的"Key Range" ,每一個"Key Range"稱之為一個 Region 。每一個 Region 都有 起始 rowkey 和 結束 rowkey ,代表了它所存儲的 row 範圍。

將 HBase 中擁有數億行的一個大表,橫向切割成一個個"子表",這一個個"子表"就是 Region 。 Region 是 HBase 中負載均衡的基本單元,當一個 Region 增長到一定大小以後,會自動分裂成兩個

HBase 優點

  • rowkey設計:高位用散列,長度不宜過長,可以適當地把需要檢索的條件拼接在rowkey裡。查詢時儘量用get,scan時要指定start/end key。
  • 列族的設計:列族儘量少,且不同列族的數據量要儘量均勻。
  • 列族儘量少是因為列族對應的底層存儲的一個文件目錄,文件目錄少有助於提高文件檢索速度。
  • 數據量要均勻是因為,當一個cf量大到一定程度,memstore會刷盤,而刷盤這個動作不是隻針對單個cf,而是整個服務器,這個時候如果另一個cf的數據量很小那也會跟著刷盤,這就造成了會有大量小文件生成,HDFS是最忌諱小文件的,同時小文件的過多也會影響檢索的效率,需要從多個文件中檢索目標。
  • 預分區:在寫比較頻繁的場景下,數據增長太快,split的次數也會增多,額外的資源消耗也會增大,另外數據分佈不均勻會造成熱點問題,這些都是需要預分區的原因。

Hbase 數據操作命令四種類型

  • get:查詢操作
  • put:插入操作
  • delete:刪除操作
  • scan:掃描所有記錄

Hbase讀流程


HBase基礎知識大補


⑴HRegionServer 保存著 meta 表以及表數據,要訪問表數據。

  • Client 先去訪問zookeeper。
  • 從 zookeeper 裡面獲取 meta 表所在的位置信息,即找到這個 meta 表在哪個HRegionServer 上保存著。

⑵Client 通過剛才獲取到的 IP 訪問對應的HRegionServer,獲取到 Meta 表中存放的元數據。

⑶Client 通過元數據中存儲的信息。

  • 訪問對應的 HRegionServer
  • 掃描所在HRegionServer 的 Memstore 和 Storefile 來查詢數據。

⑷ HRegionServer 把查詢到的數據響應給 Client。

HBase 應用場景及實例

  • 單表數據量超過千萬,而且併發量很大;
  • 數據分析需求較弱,或者不需要那麼實時靈活。

實例1:網絡爬蟲從網絡上抓取新頁面

將頁面內容存儲到 HBase 中,爬蟲可以插入和更新 HBase 裡的內容;然後,用戶可以利用 MapReduce 在整張表上計算並生成索引,為網絡搜索做準備;接著,用戶發起搜索請求;最後,搜索引擎查詢建立好的索引列表, 獲取文檔索引後,再從 HBase 中獲取所需的文檔內容,最後將搜索結果提交給用戶。

實例2:實時個性化推薦服務

廣告推薦結果存儲在 HBase 中,廣告相關的用戶建模數據也存儲在 HBase 中,用戶模型多種多樣,可以用於多種不同場景,如針對特定用戶投放什麼廣告,用戶在電商門戶網站上購物時是否實時報價等

HBase 重要概念及代碼實例

  • 表 Table。 表由行和列組成。
  • 行 Row。每行都由 Row Key 來標識。
  • 列族 ColumnFamily。表由列族組成。
  • 列限定符 Qualifier。也就是列,每個列族由多個列組成。列可以動態創建
  • 單元格。通過行,列族和列限定符定位一個單元格
  • 時間戳

Configuration conf = HBaseConfiguration.create();

Connection cn = ConnectionFactory.createConnection(conf);

Admin admin = cn.getAdmin();

String columnFamily= "score";

String columnQualifier = "math";

String row = "Andy";

//Create

TableName tableName = TableName.valueOf("test_table");

ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.of(columnFamily);

TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(family).build();

admin.createTable(desc);

//插入

Table table = cn.getTable(tableName);

Put put = new Put(row.getBytes());

put.addColumn(columnFamily.getBytes(), columnQualifier.getBytes(), "100".getBytes());

table.put(put);

table.close();


//查詢

table = cn.getTable(tableName);

Get get = new Get(row.getBytes());

get.addColumn(columnFamily.getBytes(), columnQualifier.getBytes());

Result result = table.get(get);

table.close();

System.out.println(new String(result.getValue(columnFamily.getBytes(), columnQualifier.getBytes())));

說明

  • 創建表的時候需要指定表的名字,以及所有的列族。
  • 插入數據到HBase時,需要指定表,行鍵,列族,列限定符,以及單元格的數據。
  • 查找時,需要指定表和行鍵,也可以指定列族和列限定符。


分享到:


相關文章: