HBase核心知識點總結

1、HBase介紹shell

1、基本概念數據庫

HBase是一種Hadoop數據庫,常常被描述爲一種稀疏的,分佈式的,持久化的,多維有序映射,它基於行鍵、列鍵和時間戳創建索引,是一個能夠隨機訪問的存儲和檢索數據的平臺。HBase不限制存儲的數據的種類,容許動態的、靈活的數據模型,不用SQL語言,也不強調數據之間的關係。HBase被設計成在一個服務器集羣上運行,能夠相應地橫向擴展。數組

2、HBase使用場景和成功案例緩存

  • 互聯網搜索問題:爬蟲收集網頁,存儲到BigTable裏,MapReduce計算做業掃描全表生成搜索索引,從BigTable中查詢搜索結果,展現給用戶。
  • 抓取增量數據:例如,抓取監控指標,抓取用戶交互數據,遙測技術,定向投放廣告等
  • 內容服務
  • 信息交互

3、HBase Shell命令行交互:服務器

啓動Shell    $ hbase shellapp

列出全部的表   hbase >  listeclipse

建立名爲mytable的表,含有一個列族hb    hbase > create ' mytable' , 'hb'異步

 在‘mytable’表的'first'行中的‘hb:data’列對應的數據單元中插入字節數組‘hello HBase’分佈式

  hbase > put  'mytable' , 'first' , 'hb:data' , 'hello HBase' oop

讀取mytable表 ‘first’行的內容   hbase > get 'mytable' , 'first' 

讀取mytable表全部的內容      hbase > scan ‘mytable' 

 

2、入門

1、API

和數據操做有關的HBase API有5個,分別是 Get(讀),Put(寫),Delete(刪),Scan(掃描)和Increment(列值遞增)

2、操做表

首先要建立一個configuration對象

   Configuration conf = HBaseConfiguration.create();

使用eclipse時的話還必須將配置文件添加進來。
   conf.addResource(new Path("E:\\share\\hbase-site.xml"));

     conf.addResource(new Path("E:\\share\\core-site.xml"));

    conf.addResource(new Path("E:\\share\\hdfs-site.xml"));

   使用鏈接池建立一張表。

   HTablePool pool = new HTablePool(conf,1);
   HTableInterface usersTable = pool.getTable("users");

3、寫操做

  用來存儲數據的命令是put,往表裏存儲數據,須要建立Put實例。並制定要加入的行

  Put put = new Put(byte[]  row) ;

  Put的add方法用來添加數據,分別設定列族,限定符以及單元格的指

  put.add(byte[] family , byte[] qualifier , byte[] value) ; 

  最後提交命令給表

  usersTable.put(put);

  usersTable.close();

  修改數據,只需從新提交一次最新的數據便可。

HBase寫操做的工做機制:

   

 

 

  HBase每次執行寫操做都會寫入兩個地方:預寫式日誌(write-ahead log,也稱HLog)和MemStore(寫入緩衝區),以保證數據持久化,只有當這兩個地方的變化信息都寫入並確認後,才認爲寫動做完成。MemStore是內存裏的寫入緩衝區,HBase中數據在永久寫入硬盤以前在這裏累積,當MemStore填滿後,其中的數據會刷寫到硬盤,生成一個HFile。

4、讀操做

 建立一個Get命令實例,包含要查詢的行

Get get = new Get(byte[]  row) ;

執行addColumn()或addFamily()能夠設置限制條件。

將get實例提交到表會返回一個包含數據的Result實例,實例中包含行中全部列族的全部列。

Result  r = usersTable.get(get) ;

能夠對result實例檢索特定的值

byte[] b = r.getValue(byte[] family , byte[] qualifier) ;

工做機制:

 

 

BlockCache用來保存從HFile中讀入內存的頻繁訪問的數據,避免硬盤讀,每一個列族都有本身的BlockCache。從HBase中讀出一行,首先會檢查MemStore等待修改的隊列,而後檢查BlockCache看包含該行的Block是否最近被訪問過,最後訪問硬盤上的對應HFile。

5、刪除操做

建立一個Delete實例,指定要刪除的行。

Delete delete = new Delete(byte[]  row) ;

能夠經過deleteFamily()和deleteColumn()方法指定刪除行的一部分。

6表掃描操做

Scan scan = new Scan() 能夠指定起始行和結束行。

setStartRow() , setStopRow() , setFilter()方法能夠用來限制返回的數據。

addColumn()和addFamily()方法還能夠指定列和列族。

HBase模式的數據模型包括:

表:HBase用表來組織數據。

行:在表裏,數據按行存儲,行由行鍵惟一標識。行鍵沒有數據類型,爲字節數組byte[]。

列族:行裏的數據按照列族分組,列族必須事先定義而且不輕易修改。表中每行擁有相同的列族。

列限定符:列族裏的數據經過列限定符或列來定位,列限定符沒必要事先定義。

單元:存儲在單元裏的數據稱爲單元值,值是字節數組。單元由行鍵,列族或列限定符一塊兒肯定。

時間版本:單元值有時間版本,是一個long類型。

一個HBase數據座標的例子:

 

 

HBase能夠看作是一個鍵值數據庫。HBase的設計是面向半結構化數據的,數據記錄可能包含不一致的列,不肯定大小等。

 

 

3、分佈式的HBase、HDFS和MapReduce

1、分佈式模式的HBase

HBase將表會切分紅小的數據單位叫region,分配到多臺服務器。託管region的服務器叫作RegionServer。通常狀況下,RgionServer和HDFS DataNode並列配置在同一物理硬件上,RegionServer本質上是HDFS客戶端,在上面存儲訪問數據,HMaster分配region給RegionServer,每一個RegionServer託管多個region。

 

 

HBase中的兩個特殊的表,-ROOT-和.META.,用來查找各類表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向託管待查找的region的RegionServer。

一次客戶端查找過程的3層分佈式B+樹以下圖:

 

 

HBase頂層結構圖:

 

 

zookeeper負責跟蹤region服務器,保存root region的地址。

Client負責與zookeeper子集羣以及HRegionServer聯繫。

HMaster負責在啓動HBase時,把全部的region分配到每一個HRegion Server上,也包括-ROOT-和.META.表。

HRegionServer負責打開region,並建立對應的HRegion實例。HRegion被打開後,它爲每一個表的HColumnFamily建立一個Store實例。每一個Store實例包含一個或多個StoreFile實例,它們是實際數據存儲文件HFile的輕量級封裝。每一個Store有其對應的一個MemStore,一個HRegionServer共享一個HLog實例。

一次基本的流程:

a、 客戶端經過zookeeper獲取含有-ROOT-的region服務器名。

b、 經過含有-ROOT-的region服務器查詢含有.META.表中對應的region服務器名。

c、  查詢.META.服務器獲取客戶端查詢的行鍵數據所在的region服務器名。

d、 經過行鍵數據所在的region服務器獲取數據。

 

HFile結構圖:

 

 

Trailer有指向其餘塊的指針,Index塊記錄Data和Meta塊的偏移量,Data和Meta塊存儲數據。默認大小是64KB。每一個塊包含一個Magic頭部和必定數量的序列化的KeyValue實例。

 

KeyValue格式:

 

 

該結構以兩個分別表示鍵長度和值長度的定長數字開始,鍵包含了行鍵,列族名和列限定符,時間戳等。

 

預寫日誌WAL:

每次更新都會寫入日誌,只有寫入成功纔會通知客戶端操做成功,而後服務器能夠按需自由地批量處理或聚合內存中的數據。

編輯流在memstore和WAL之間分流的過程:

 

 

處理過程:客戶端經過RPC調用將KeyValue對象實例發送到含有匹配region的HRegionServer。接着這些實例被髮送到管理相應行的HRegion實例,數據被寫入到WAL,而後被放入到實際擁有記錄的存儲文件的MemStore中。當memstore中的數據達到必定的大小之後,數據會異步地連續寫入到文件系統中,WAL能保證這一過程的數據不會丟失。

 

2、HBase和MapReduce

從MapReduce應用訪問HBase有3種方式:

做業開始時能夠用HBase做爲數據源,做業結束時能夠用HBase接收數據,任務過程當中用HBase共享資源。

  • 使用HBase做爲數據源

階段map

protected void map(ImmutableBytesWritable rowkey,Result result,Context context){

};

從HBase表中讀取的做業以[rowkey:scan result]格式接收[k1,v1]鍵值對,對應的類型是ImmutableBytesWritable和Result。

建立實例掃描表中全部的行

Scan scan = new Scan();

scan.addColumn(…);

接下來在MapReduce中使用Scan實例。

TableMapReduceUtil.initTableMapperJob(tablename,scan,map.class,

輸出鍵的類型.class,輸出值的類型.class,job);

  • 使用HBase接收數據

reduce階段

protected void reduce(

ImmutableBytesWritable rowkey,Iterable<put>values,Context context){

};

把reducer填入到做業配置中,

TableMapReduceUtil.initTableReducerJob(tablename,reduce.class,job);

 

3、HBase實現可靠性和可用性

HDFS做爲底層存儲,爲集羣裏的全部RegionServer提供單一命名空間,一個RegionServer讀寫數據能夠爲其它全部RegionServer讀寫。若是一個RegionServer出現故障,任何其餘RegionServer均可以從底層文件系統讀取數據,基於保存在HDFS裏的HFile開始提供服務。接管這個RegionServerz服務的region。

 

4、優化HBase

1、隨機讀密集型

優化方向:高效利用緩存和更好的索引

  •  增長緩存使用的堆的百分比,經過參數 hfile.block.cache.size 配置。
  • 減小MemStore佔用的百分比,經過hbase.regionserver.global.memstore.lowerLimit和hbase.regionserver.global.memstore.upperLimit來調節。
  • 使用更小的數據塊,使索引的粒度更細。
  • 打開布隆過濾器,以減小爲查找指定行的Key Value對象而讀取的HFile的數量。
  • 設置激進緩存,能夠提高隨機讀性能。
  • 關閉沒有被用到隨機讀的列族,提高緩存命中率。

2、順序讀密集型

優化方向:減小使用緩存。

  • 增大數據塊的大小,使每次硬盤尋道時間取出的數據更多。
  • 設置較高的掃描器緩存值,以便在執行大規模順序讀時每次RPC請求掃描器能夠取回更多行。 參數 hbase.client.scanner.caching 定義了在掃描器上調用next方法時取回的行的數量。
  • 關閉數據塊的緩存,避免翻騰緩存的次數太多。經過Scan.setCacheBlocks(false)設置。
  • 關閉表的緩存,以便在每次掃描時再也不翻騰緩存。
  • 3、寫密集型

優化方向:不要太頻繁刷寫,合併或者拆分。

  • 調高底層存儲文件(HStoreFile)的最大大小,region越大意味着在寫的時候拆分越少。經過參數 hbase.hregion.max.filesize設置。
  • 增大MemStore的大小,經過參數hbase.hregion.memstore.flush.size調節。刷寫到HDFS的數據越多,生產的HFile越大,會在寫的時候減小生成文件的數量,從而減小合併的次數。
  • 在每臺RegionServer上增長分配給MemStore的堆比例。把upperLimit設爲可以容納每一個region的MemStore乘以每一個RegionServer上預期region的數量。
  • 垃圾回收優化,在hbase-env.sh文件裏設置,能夠設置初始值爲:-Xmx8g  -Xms8g  -Xmn128m  -XX:+UseParNewGC  -XX:+UseConcMarkSweepGC

   -XX:CMSInitiatingOccupancyFraction=70

  • 打開MemStore-Local Allocation Buffer這個特性,有助於防止堆的碎片化。 經過參數hbase.hregion.memstore.mslab.enabled設置

4、混合型

優化方向:須要反覆嘗試各類組合,而後運行測試,獲得最佳結果。

 

影響性能的因素還包括:

  • 壓縮:能夠減小集羣上的IO壓力
  • 好的行鍵設計
  • 在預期集羣負載最小的時候手工處理大合併
  • 優化RegionServer處理程序計數
相關文章
相關標籤/搜索