溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HBase核心知識點有哪些

發(fā)布時間:2021-11-23 11:37:57 來源:億速云 閱讀:132 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)HBase核心知識點有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、HBase介紹

1、基本概念

HBase是一種Hadoop數(shù)據(jù)庫,經(jīng)常被描述為一種稀疏的,分布式的,持久化的,多維有序映射,它基于行鍵、列鍵和時間戳建立索引,是一個可以隨機訪問的存儲和檢索數(shù)據(jù)的平臺。HBase不限制存儲的數(shù)據(jù)的種類,允許動態(tài)的、靈活的數(shù)據(jù)模型,不用SQL語言,也不強調(diào)數(shù)據(jù)之間的關(guān)系。HBase被設(shè)計成在一個服務(wù)器集群上運行,可以相應(yīng)地橫向擴展。

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

  • 互聯(lián)網(wǎng)搜索問題:爬蟲收集網(wǎng)頁,存儲到BigTable里,MapReduce計算作業(yè)掃描全表生成搜索索引,從BigTable中查詢搜索結(jié)果,展示給用戶。

  • 抓取增量數(shù)據(jù):例如,抓取監(jiān)控指標(biāo),抓取用戶交互數(shù)據(jù),遙測技術(shù),定向投放廣告等

  • 內(nèi)容服務(wù)

  • 信息交互

3、HBase Shell命令行交互:

啟動Shell    $ hbase shell

列出所有的表   hbase >  list

創(chuàng)建名為mytable的表,含有一個列族hb    hbase > create ' mytable' , 'hb'

 在‘mytable’表的'first'行中的‘hb:data’列對應(yīng)的數(shù)據(jù)單元中插入字節(jié)數(shù)組‘hello HBase’

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

讀取mytable表 ‘first’行的內(nèi)容   hbase > get 'mytable' , 'first' 

讀取mytable表所有的內(nèi)容      hbase > scan ‘mytable' 

二、入門

1、API

和數(shù)據(jù)操作有關(guān)的HBase API有5個,分別是 Get(讀),Put(寫),Delete(刪),Scan(掃描)和Increment(列值遞增)

2、操作表

首先要創(chuàng)建一個configuration對象

   Configuration conf = HBaseConfiguration.create();

使用eclipse時的話還必須將配置文件添加進(jìn)來。
   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"));

   使用連接池創(chuàng)建一張表。

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

3、寫操作

  用來存儲數(shù)據(jù)的命令是put,往表里存儲數(shù)據(jù),需要創(chuàng)建Put實例。并制定要加入的行

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

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

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

  最后提交命令給表

  usersTable.put(put);

  usersTable.close();

  修改數(shù)據(jù),只需重新提交一次最新的數(shù)據(jù)即可。

HBase寫操作的工作機制:

   HBase核心知識點有哪些

  HBase每次執(zhí)行寫操作都會寫入兩個地方:預(yù)寫式日志(write-ahead log,也稱HLog)和MemStore(寫入緩沖區(qū)),以保證數(shù)據(jù)持久化,只有當(dāng)這兩個地方的變化信息都寫入并確認(rèn)后,才認(rèn)為寫動作完成。MemStore是內(nèi)存里的寫入緩沖區(qū),HBase中數(shù)據(jù)在永久寫入硬盤之前在這里累積,當(dāng)MemStore填滿后,其中的數(shù)據(jù)會刷寫到硬盤,生成一個HFile。

4、讀操作

 創(chuàng)建一個Get命令實例,包含要查詢的行

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

執(zhí)行addColumn()或addFamily()可以設(shè)置限制條件。

將get實例提交到表會返回一個包含數(shù)據(jù)的Result實例,實例中包含行中所有列族的所有列。

Result  r = usersTable.get(get) ;

可以對result實例檢索特定的值

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

工作機制:

 HBase核心知識點有哪些

BlockCache用來保存從HFile中讀入內(nèi)存的頻繁訪問的數(shù)據(jù),避免硬盤讀,每個列族都有自己的BlockCache。從HBase中讀出一行,首先會檢查MemStore等待修改的隊列,然后檢查BlockCache看包含該行的Block是否最近被訪問過,最后訪問硬盤上的對應(yīng)HFile。

5、刪除操作

創(chuàng)建一個Delete實例,指定要刪除的行。

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

可以通過deleteFamily()和deleteColumn()方法指定刪除行的一部分。

6表掃描操作

Scan scan = new Scan() 可以指定起始行和結(jié)束行。

setStartRow() , setStopRow() , setFilter()方法可以用來限制返回的數(shù)據(jù)。

addColumn()和addFamily()方法還可以指定列和列族。

HBase模式的數(shù)據(jù)模型包括:

表:HBase用表來組織數(shù)據(jù)。

行:在表里,數(shù)據(jù)按行存儲,行由行鍵唯一標(biāo)識。行鍵沒有數(shù)據(jù)類型,為字節(jié)數(shù)組byte[]。

列族:行里的數(shù)據(jù)按照列族分組,列族必須事先定義并且不輕易修改。表中每行擁有相同的列族。

列限定符:列族里的數(shù)據(jù)通過列限定符或列來定位,列限定符不必事先定義。

單元:存儲在單元里的數(shù)據(jù)稱為單元值,值是字節(jié)數(shù)組。單元由行鍵,列族或列限定符一起確定。

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

一個HBase數(shù)據(jù)坐標(biāo)的例子:

 HBase核心知識點有哪些

HBase可以看做是一個鍵值數(shù)據(jù)庫。HBase的設(shè)計是面向半結(jié)構(gòu)化數(shù)據(jù)的,數(shù)據(jù)記錄可能包含不一致的列,不確定大小等。

三、分布式的HBase、HDFS和MapReduce

1、分布式模式的HBase

HBase將表會切分成小的數(shù)據(jù)單位叫region,分配到多臺服務(wù)器。托管region的服務(wù)器叫做RegionServer。一般情況下,RgionServer和HDFS DataNode并列配置在同一物理硬件上,RegionServer本質(zhì)上是HDFS客戶端,在上面存儲訪問數(shù)據(jù),HMaster分配region給RegionServer,每個RegionServer托管多個region。

 HBase核心知識點有哪些

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

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

 HBase核心知識點有哪些

HBase頂層結(jié)構(gòu)圖:

 HBase核心知識點有哪些

zookeeper負(fù)責(zé)跟蹤region服務(wù)器,保存root region的地址。

Client負(fù)責(zé)與zookeeper子集群以及HRegionServer聯(lián)系。

HMaster負(fù)責(zé)在啟動HBase時,把所有的region分配到每個HRegion Server上,也包括-ROOT-和.META.表。

HRegionServer負(fù)責(zé)打開region,并創(chuàng)建對應(yīng)的HRegion實例。HRegion被打開后,它為每個表的HColumnFamily創(chuàng)建一個Store實例。每個Store實例包含一個或多個StoreFile實例,它們是實際數(shù)據(jù)存儲文件HFile的輕量級封裝。每個Store有其對應(yīng)的一個MemStore,一個HRegionServer共享一個HLog實例。

一次基本的流程:

a、 客戶端通過zookeeper獲取含有-ROOT-的region服務(wù)器名。

b、 通過含有-ROOT-的region服務(wù)器查詢含有.META.表中對應(yīng)的region服務(wù)器名。

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

d、 通過行鍵數(shù)據(jù)所在的region服務(wù)器獲取數(shù)據(jù)。

HFile結(jié)構(gòu)圖:

 HBase核心知識點有哪些

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

KeyValue格式:

 HBase核心知識點有哪些

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

預(yù)寫日志W(wǎng)AL:

每次更新都會寫入日志,只有寫入成功才會通知客戶端操作成功,然后服務(wù)器可以按需自由地批量處理或聚合內(nèi)存中的數(shù)據(jù)。

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

 HBase核心知識點有哪些

處理過程:客戶端通過RPC調(diào)用將KeyValue對象實例發(fā)送到含有匹配region的HRegionServer。接著這些實例被發(fā)送到管理相應(yīng)行的HRegion實例,數(shù)據(jù)被寫入到WAL,然后被放入到實際擁有記錄的存儲文件的MemStore中。當(dāng)memstore中的數(shù)據(jù)達(dá)到一定的大小以后,數(shù)據(jù)會異步地連續(xù)寫入到文件系統(tǒng)中,WAL能保證這一過程的數(shù)據(jù)不會丟失。

2、HBase和MapReduce

從MapReduce應(yīng)用訪問HBase有3種方式:

作業(yè)開始時可以用HBase作為數(shù)據(jù)源,作業(yè)結(jié)束時可以用HBase接收數(shù)據(jù),任務(wù)過程中用HBase共享資源。

  • 使用HBase作為數(shù)據(jù)源

階段map

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

};

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

創(chuàng)建實例掃描表中所有的行

Scan scan = new Scan();

scan.addColumn(…);

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

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

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

  • 使用HBase接收數(shù)據(jù)

reduce階段

protected void reduce(

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

};

把reducer填入到作業(yè)配置中,

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

3、HBase實現(xiàn)可靠性和可用性

HDFS作為底層存儲,為集群里的所有RegionServer提供單一命名空間,一個RegionServer讀寫數(shù)據(jù)可以為其它所有RegionServer讀寫。如果一個RegionServer出現(xiàn)故障,任何其他RegionServer都可以從底層文件系統(tǒng)讀取數(shù)據(jù),基于保存在HDFS里的HFile開始提供服務(wù)。接管這個RegionServerz服務(wù)的region。

四、優(yōu)化HBase

1、隨機讀密集型

優(yōu)化方向:高效利用緩存和更好的索引

  •  增加緩存使用的堆的百分比,通過參數(shù) hfile.block.cache.size 配置。

  • 減少MemStore占用的百分比,通過hbase.regionserver.global.memstore.lowerLimit和hbase.regionserver.global.memstore.upperLimit來調(diào)節(jié)。

  • 使用更小的數(shù)據(jù)塊,使索引的粒度更細(xì)。

  • 打開布隆過濾器,以減少為查找指定行的Key Value對象而讀取的HFile的數(shù)量。

  • 設(shè)置激進(jìn)緩存,可以提升隨機讀性能。

  • 關(guān)閉沒有被用到隨機讀的列族,提升緩存命中率。

2、順序讀密集型

優(yōu)化方向:減少使用緩存。

  • 增大數(shù)據(jù)塊的大小,使每次硬盤尋道時間取出的數(shù)據(jù)更多。

  • 設(shè)置較高的掃描器緩存值,以便在執(zhí)行大規(guī)模順序讀時每次RPC請求掃描器可以取回更多行。 參數(shù) hbase.client.scanner.caching 定義了在掃描器上調(diào)用next方法時取回的行的數(shù)量。

  • 關(guān)閉數(shù)據(jù)塊的緩存,避免翻騰緩存的次數(shù)太多。通過Scan.setCacheBlocks(false)設(shè)置。

  • 關(guān)閉表的緩存,以便在每次掃描時不再翻騰緩存。

  • 3、寫密集型

優(yōu)化方向:不要太頻繁刷寫,合并或者拆分。

  • 調(diào)高底層存儲文件(HStoreFile)的最大大小,region越大意味著在寫的時候拆分越少。通過參數(shù) hbase.hregion.max.filesize設(shè)置。

  • 增大MemStore的大小,通過參數(shù)hbase.hregion.memstore.flush.size調(diào)節(jié)。刷寫到HDFS的數(shù)據(jù)越多,生產(chǎn)的HFile越大,會在寫的時候減少生成文件的數(shù)量,從而減少合并的次數(shù)。

  • 在每臺RegionServer上增加分配給MemStore的堆比例。把upperLimit設(shè)為能夠容納每個region的MemStore乘以每個RegionServer上預(yù)期region的數(shù)量。

  • 垃圾回收優(yōu)化,在hbase-env.sh文件里設(shè)置,可以設(shè)置初始值為:-Xmx8g  -Xms8g  -Xmn128m  -XX:+UseParNewGC  -XX:+UseConcMarkSweepGC

   -XX:CMSInitiatingOccupancyFraction=70

  • 打開MemStore-Local Allocation Buffer這個特性,有助于防止堆的碎片化。 通過參數(shù)hbase.hregion.memstore.mslab.enabled設(shè)置

4、混合型

優(yōu)化方向:需要反復(fù)嘗試各種組合,然后運行測試,得到最佳結(jié)果。

影響性能的因素還包括:

  • 壓縮:可以減少集群上的IO壓力

  • 好的行鍵設(shè)計

  • 在預(yù)期集群負(fù)載最小的時候手工處理大合并

  • 優(yōu)化RegionServer處理程序計數(shù)

感謝各位的閱讀!關(guān)于“HBase核心知識點有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI