HBase數(shù)據(jù)平臺簡介_第1頁
HBase數(shù)據(jù)平臺簡介_第2頁
HBase數(shù)據(jù)平臺簡介_第3頁
HBase數(shù)據(jù)平臺簡介_第4頁
HBase數(shù)據(jù)平臺簡介_第5頁
已閱讀5頁,還剩109頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

3.4.2HBase簡介,數(shù)據(jù)模型,架構,安

裝,shell操作,原理深入(讀寫流程),

機制(刷寫,合并,拆分,),API操作,協(xié)

處理器,RK設計原貝?。?,熱點,二級索引,

布隆過濾器

目錄

第一部分初識HBase

第1節(jié)HBase簡介

1.1HBase是什么

1.2HBase的特點

1.3HBase的應用

第2節(jié)IIBase數(shù)據(jù)模型

HBase邏輯架構

HBase物理存儲

第3節(jié)HBase整體架構

Zookeeper

IMaster(Master)

HRegionServer(RegionServer)

Region

第4節(jié)HBase集群安裝部署

第5節(jié)HBaseshell基本操作

3、查看表list

4、創(chuàng)建表操作create

5、添加數(shù)據(jù)操作put

6、查詢數(shù)據(jù)get

6.1通過rowkey進行查詢

6.2查看rowkey下面的某個列族的信息

6.3查看rowkey指定列族指定字段的值

6.4查看rowkey指定多個列族的信息

6.5指定rowkey與列值查詢

6.6指定rowkey與列值模糊查詢

6.7查詢所有數(shù)據(jù)scan

6.8列族查詢scan

6.9指定多個列族與按照數(shù)據(jù)值模糊查詢

6.10rowkey的范圍值查詢scan(非常重要)

6.11指定rowkey模糊查詢

7、更新數(shù)據(jù)put

7.1更新數(shù)據(jù)值

8、刪除數(shù)據(jù)和表delete

8.1指定rowkey以及列名進行刪除

8.2指定rowkey,列名以及字段值進行刪除

8.3刪除列族alter

8.4清空表數(shù)據(jù)truncate

8.5刪除表disable+drop

第二部分IIBase原理深入

第1節(jié)HBase讀數(shù)據(jù)流程

第2節(jié)HBase寫數(shù)據(jù)流程

第3節(jié)HBase的flush(刷寫)及compact(合并)機制

Flush機制

阻塞機制

Compact合并機制

第4節(jié)Region拆分機制

4.1拆分策略

1)ConstantSizeRegionSplitPolicy

2)IncreasingToUpperBoundRegionSplitPolicy

3)SteppingSplitPolicy

4)KeyPrefixRegionSplitPolicy

5)DelimitedKeyPrefixRegionSplitPolicy

6)DisabledRegionSplitPolicy

4.2RegionSplitPolicy的應用

1)通過hbase-site.xml全局統(tǒng)一配置(對hbase所有表生

效)

2)通過JavaAPI為單獨的表指定Region拆分策略

3)通過HBaseShell為單個表指定Region拆分策略

第5節(jié)HBase表的預分區(qū)(region)

5.1為何要預分區(qū)

第6節(jié)Region合并

6.1Region合并說明

6.2如何進行Region合并

通過Merge類冷合并Region

通過online_merge熱合并Region

第三部分HBaseAPI應用和優(yōu)化

第1節(jié)HBaseAPI客戶端操作

初始化及釋放資源方法

創(chuàng)建表:

插入數(shù)據(jù)

刪除數(shù)據(jù):

查詢某個列族數(shù)據(jù)

通過Scan全表掃描

通過startRowKey和endRowKey進行掃描

第2節(jié)Hbase協(xié)處理器

2.1協(xié)處理器概述

2.2協(xié)處理器類型

Observer

Endpoint

Endpoint?!跤猛?/p>

2.3協(xié)處理器Observer案例

第4節(jié)HBase表的RowKey設計

RowKey的基本介紹

RowKey□度原則

RowKey散列原則

RowKey唯一原則

RowKey排序原則

第5節(jié)HBase表的熱點

5.1什么是熱點

5.2熱點的解決方案

第6節(jié)HBase的二級索引

第7節(jié)布隆過濾器在hbase的應用

布隆過濾器應用

布隆過濾器的原理

BloomFilter案例

第一部分初識HBase

第1節(jié)HBase簡介

1.1HBase是什么

HBase基于Google的BigTable論文而來,是一個分布式海量列式非

關系型數(shù)據(jù)庫系統(tǒng),可以提供超大規(guī)模數(shù)據(jù)集的實時隨機讀寫。

接下來,通過一個場景初步認識HBase列存儲

如下MySQL存儲機制,空值字段浪費存儲空間

如果是列存儲的話,可以這么玩

rowkey:1name:小明

rowkey:1age:23

rowkey:1job:學生

rowkey:2name:小紅

rowkey:2salary:lOw

rowkey:2job:律師

列存儲的優(yōu)點:

1)減少存儲空間占用。

2)支持好多列

1.2HBase的特點

?海量存儲:底層基于HDFS存儲海量數(shù)據(jù)

?列式存儲:HBase表的數(shù)據(jù)是基于列族進行存儲的,一個列族包含

若干列

?極易擴展:底層依賴HDFS,當磁盤空間不足的時候,只需要動態(tài)增

加DataNode服務節(jié)點就可以

?高并發(fā):支持高并發(fā)的讀寫請求

?稀疏:稀疏主要是針對HBase列的靈活性,在列族中,你可以指定

任意多的列,在列數(shù)據(jù)為空的情況下,是不會占用存儲空間的。

?數(shù)據(jù)的多版本:HBase表中的數(shù)據(jù)可以有多個版本值,默認情況下

是根據(jù)版本號去區(qū)分,版本號就是插入數(shù)據(jù)的時間戳

?數(shù)據(jù)類型單一:所有的數(shù)據(jù)在HBase中是以字節(jié)數(shù)組進行存儲

1.3HBase的應用

?交通方面:船舶GPS信息,每天有上千萬左右的數(shù)據(jù)存儲。

?金融方面:消費信息、貸款信息、信用卡還款信息等

?電商方面:電商網(wǎng)站的交易信息、物流信息、游覽信息等

?電信方面:通話信息

總結:HBase適合海量明細數(shù)據(jù)的存儲,并且后期需要有很好的查詢性

能(單表超千萬、上億,且并發(fā)要求高)

第2節(jié)HBase數(shù)據(jù)模型

HBase的數(shù)據(jù)也是以表(有行有列)的形式存儲

HBase邏輯架構

HBase物理存儲

\\

概描

念述

na名

me空

sp間

ac類

e似

數(shù)

據(jù)

da

ta

ba

se

O

HB

as

e

?

hb

as

e

de

fa

ul

t

9

hb

as

e

HB

as

e

de

fa

ul

t

使

創(chuàng)

區(qū)

%系

bl型

e數(shù)

據(jù)

HB

as

e

9

數(shù)

據(jù)

(

TT

L

)

9

(

CO

MP

RE

SS

10

\

)

9

?

S

HB

as

e

Ro

w

_數(shù)

據(jù)

邏由

輯_

數(shù)

據(jù)

Ro

wK

ey

Co

lu

mn

T

?

數(shù)

據(jù)-

?

?

No

Su

ch

Co

lu

mn

Fa

mi

ly

Ex

ce

Pt

io

n

Ro

Ro

wk

wK

ey

ey

(

數(shù)

據(jù)

鍵串

)不

1

I

數(shù)

據(jù)

Ro

wK

ey

數(shù)

據(jù)

-據(jù)

Ro

wK

ey

Ro

wK

ey

O

使

T

經(jīng)

Ro

wK

ey

?

數(shù)

據(jù)

Co

lu合

mn

Fa

mi個

ly列

(族

列郁

族以

,[苗

態(tài)

O

?

1

O

HB

as

e

*

o

lib

as

e

Co列

lu是

mn可

Qu以

al隨

if意

ie定

r義

數(shù)

1

O

I

!

in

fo

na

me

in

fo

ag

Ti于

me標

st識

am數(shù)

P據(jù)

(的

時不

間同

戳版

-A

版(

ve

)rs

io

n

)

o

統(tǒng)

9

數(shù)

據(jù)

?

?

rib

as

e

數(shù)

據(jù)

11

數(shù)

據(jù)

O

(

Ce

11

)

Re

gi

on

Re

gi

on

(

區(qū)

)組

I

Re

gi

on

(

ro

wk

ey

)

O

Re

gi

on

Re

gi

on

Se

ve

r

?

數(shù)

據(jù)

?

HB

as

e

Re

gi

on

第3節(jié)HBase整體架構

Zookeeper

實現(xiàn)了HMaster的高可用

?保存了HBase的元數(shù)據(jù)信息,是所有HBase表的尋址入口

對HMaster和IIRegionServer實現(xiàn)了監(jiān)控

HMaster(Master)

為IIRegionServer分配Region

?維護整個集群的負載均衡

維護集群的元數(shù)據(jù)信息

發(fā)現(xiàn)失效的Region,并將失效的Region分配到正常的HRegionServer

HRegionServer(RegionServer)

負責管理Region

接受客戶端的讀寫數(shù)據(jù)請求

切分在運行過程中變大的Region

Region

每個HRegion由多個Store構成,

每個Store保存一個列族(ColumnsFamily),表有幾個列族,則有

幾個Store,

每個Store由一個MemStore和多個StoreFile組成,MemStore是

Store在內存中的內容,寫到文件后就是StoreFile。StoreFile底層

是以HFile的格式保存。

第4節(jié)HBase集群安裝部署

(1)下載安裝包

http://archive,apache,org/dist/hbase/1.3.1/

hbase-1.3.l-bin.tar.gz

(2)規(guī)劃安裝目錄

/opt/lagou/servers/

(3)上傳安裝包到服務器

(4)解壓安裝包到指定的規(guī)劃目錄

tar-zxvfhbase-1.3.l-bin.tar.gz-C/opt/lagou/servers

(5)修改配置文件

需要把hadoop中的配置core-site,xml、hdfs-site.xml拷口到

hbase安裝目錄下的conf文件夾中

In-s/opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml

/opt/lagou/servers/hbase-1.3.1/conf/core-site.xml

In-s/opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml

/opt/lagou/servers/hbase-1.3.1/conf/hdfs-site.xml

修改conf目錄下配置文件

修改hbase-env.sh

#添加java環(huán)境變量

exportJAVA110ME=/opt/1agou/servers/jdk1.8.0231

#指定使用外部的zk集群

exportHBASEMANAGES-ZK=FALSE

修改hbase-site.xml

<configuration>

<!—指定hbase在HDFS上存儲的路徑—>

<property>

<name>hbase.rootdir</name>

<value>hdfs://linuxl21:9000/hbase</value>

</property>

<!一指定hbase是分布式的一>

<property>

<name>hbase.cluster.distributed</name>

<va]ue>true</value>

</property>

<!—指定zk的地址,多個用分割一〉

<property>

<name>hbase.zookeeper.quorum</name>

<value>linux121:2181,linux122:2181,linuxl23:2181</value>

</property>

</configuraion>

修改regionservers文件

#指定regionserver節(jié)點

linuxl21

linuxl22

linuxl23

hbase的conf目錄下創(chuàng)建文件backup-masters(StandbyMaster)

linuxl22

(6)配置hbase的環(huán)境變量

exportHBASEHOME=/opt/lagou/servers/hbase-1.3.1

exportPATH=$PATH:$HBASEHOME/bin

(7)分發(fā)hbase目錄和環(huán)境變量到其他節(jié)點

rsync-script/opt./lagou/servers/hbase-1.3.1/

rsync-script/etc/profile

(8)讓所有節(jié)點的hbase環(huán)境變量生效

在所有節(jié)點執(zhí)行source/etc/profile

HBase集群的啟動和停止

前提條件:先啟動hadoop和zk集群

啟動HBase:start-hbase.sh

停止HBase:stop-hbase.sh

HBase集群的web管理界面

啟動好DBase集群之后,可以訪問地址:HMaster的主機名:16010

第5節(jié)HBaseshell基本操作

1、進入Hbase客戶端命令操作界面

hbaseshell

2、查看幫助命令

hbase(main):001:0>help

3、查看表list

hbase(main):006:0>list

4、創(chuàng)建表操作create

創(chuàng)建一張lagou表,包含base_info、extra_info兩個列族

hbase(main):001:0>create'lagou','baseinfo','extrainfo'

或者(Hbase建表必須指定列族信息)

create'lagou',{NAME=>'base_info',VERSIONS=>'3'},{NAME=>

'extra_info'.VERSIONS=>'3'}

VERSIONS是指此單元格內的數(shù)據(jù)可以保留最近的3個版本

5、添加數(shù)據(jù)操作put

向lagou表中插入信息,rowkey為rkl,列族base_info中添加

name列標示符,值為wang

hbase(main):001:0>put*lagou*,1rkl*,1baseinfo:name*,1wang1

向lagou表中插入信息,rowkey為rkl,列族base_info中添加age

列標示符,值為30

hbase(main):001:0>put1lagou*,1rkl*,1baseinfo:agef,30

向lagou表中插入信息,rowkey為rkl,列族extra_info中添加

address列標示符,值為shanghai

hbase(main):001:0>put1lagou1,'rkl',1extra_info:address1,

1shanghai*

6、查詢數(shù)據(jù)get

6.1通過rowkey進行查詢

獲取表中rowkey為rkl的所有信息

hbase(main):001:0>get1lagou*,1rkl,

6.2查看rowkey下面的某個列族的信息

獲取lagou表中rowkey為rkl,base_info列族的所有信息

hbase(main):001:0>get1lagou1,'rkl',rbaseinfo,

6.3查看rowkey指定列族指定字段的值

獲取表中rowkey為rkl,base_info列族的name、age列標示符的信

hbase(main):008:0>get1lagou','rkl1,'base_info:name’,

'base_info:age'

6.4查看rowkey指定多個列族的信息

獲取lagou表中rowkey為rkl,base_info,extra_info列族的信息

hbase(main):010:0>get*lagou1,1rkl1,'baseinfo',1extra_info1

或者

hbase(main):Oil:0>getflagou1,1rkl1,{COLUMN=>「base_info',

'extra_info']}

或者

hbase(main):012:0>get1lagou*,'rkl',{COLUMN=>[!base_info:name*,

1extra,info:address1]}

6.5指定rowkey與列值查詢

獲取表中rowkey為rkl,cell的值為wang的信息

hbase(main):001:0>get1lagou*,*rkl*,{FILTER=>MValueFilter(=,

'binary:wang')"}

6.6指定rowkey與列值模糊查詢

獲取表中rowkey為rkl,列標示符中含有a的信息

hbase(main):001:0>get'lagou','rkl',{FILTER=>

"(QualifierFilter(=,'substring:a'))"}

6.7查詢所有數(shù)據(jù)scan

查詢lagou表中的所有信息

hbase(main):000:0>scan'lagou'

6.8列族查詢scan

查詢表中列族為base_info的信息

hbase(main):001:0>scan'lagou',{COLUMNS=>'base_info'}

hbase(main):002:0>scan'lagou',{COLUMNS=>'base_info',RAW=>

true,VERSIONS=>3}

##Scan時可以設置是否開啟Raw模式,開啟Raw模式會返回包括已添加刪除標

記但是未實際刪除的數(shù)據(jù)

##VERSIONS指定查詢的最大版本數(shù)

6.9指定多個列族與按照數(shù)據(jù)值模糊查詢

查詢lagou表中列族為base_info和extra_info且列標示符中含有

a字符的信息

hbase(main):001:0>scan'lagou',{COLUMNS=>['base_info',

'extra_info'],FILTER=>"(QualifierFilter(=,'substring:a'))"}

6.10rowkey的范圍值查詢scan(非常重要)

?查詢lagou表中列族為base_info,rk范圍是[rkl,rk3)的數(shù)據(jù)

(rowkey底層存儲是字典序)

?按rowkey順序存儲。

hbase(main):001:0>scan'lagou',{COLUMNS=>'base_info',STARTROW=>

'rkl',ENDROW=>'rk3'}

6.11指定rowkey模糊查詢

查詢lagou表中rowkey以rk字符開頭的

hbase(main):001:0>scan'lagou',{FILTER=>"PrefixFilter('rk')"}

7、更新數(shù)據(jù)put

更新操作同插入操作一模一樣,只不過有數(shù)據(jù)就更新,沒數(shù)據(jù)就添加

7.1更新數(shù)據(jù)值

把lagou表中rowkey為rkl的base_info列族下的列name修改為

liang

hbase(main):030:0>put'lagou','rkl','base_info:name','liang'

8、刪除數(shù)據(jù)和表delete

8.1指定rowkey以及列名進行刪除

刪除lagou表rowkey為rkl,列標示符為base_info:name的數(shù)據(jù)

hbase(main):002:0>delete*lagou1,‘rkl',1baseinfo:name,

8.2指定rowkey,列名以及字段值進行刪除

刪除lagou表rowkey為rkl,列標示符為base_info:name的數(shù)據(jù)

hbase(main):033:0>delete'lagou','rkl','base_info:name','liang'

8.3刪除列族alter

刪除base_info列族

hbase(main):035:0>alter'lagou','delete'=>'baseinfo'

8.4清空表數(shù)據(jù)truncate

刪除lagou表數(shù)據(jù)

hbase(main):001:0>truncate1lagou1

8.5刪除表disable+drop

刪除lagou表

#先disable再drop

hbase(main):036:0>disable1lagou1

hbase(main):037:0>drop1lagou,

#如果不進行disable,直接drop會報錯

ERROR:Tableuserisenabled.Disableitfirst.

第二部分HBase原理深入

第1節(jié)HBase讀數(shù)據(jù)流程

HBase讀操作

1)首先從zk找到meta表的region位置,然后讀取meta表中的數(shù)

據(jù),meta表中存儲了用戶表的region信息

2)根據(jù)要查詢的namespace、表名和rowkey信息。找到寫入數(shù)據(jù)對應

的region信息

3)找到這個region對應的regionServer,然后發(fā)送請求

4)查找對應的region

5)先從memstore查找數(shù)據(jù),如果沒有,再從BlockCache上讀取

HBase上Regionserver的內存分為兩個部分

?一部分作為Memstore,主要用來寫;

?另夕I'一部分作為BlockCache,主要用于讀數(shù)據(jù);

6)如果BlockCache中也沒有找到,再到StoreFile上進行讀取

從storeFile中讀取到數(shù)據(jù)之后,不是直接把結果數(shù)據(jù)返回給客戶

端,而是把數(shù)據(jù)先寫入到BlockCache中,目的是為了加快后續(xù)的查

詢;然后在返回結果給客戶端。

第2節(jié)HBase寫數(shù)據(jù)流程

HBase寫操作

1)首先從zk找到meta表的region位置,然后讀取meta表中的數(shù)

據(jù),meta表中存儲了用戶表的region信息

2)根據(jù)namespace、表名和rowkey信息。找到寫入數(shù)據(jù)對應的

region信息

3)找到這個region對應的regionServer,然后發(fā)送請求

4)把數(shù)據(jù)分別寫到HLog(writeaheadlog)和memstore各一份

5)memstore達到閾值后把數(shù)據(jù)刷到磁盤,生成storeFile文件

6)刪除HLog中的歷史數(shù)據(jù)

第3節(jié)HBase的flush(刷寫)及compact(合并)機

Flush機制

(1)當memstore的大小超過這個值的時候,會flush到磁盤,默認為

128M

<property>

<name>hbase.hregion.memstore,flush.size</name>

<value>134217728</value>

</property>

(2)當memstore中的數(shù)據(jù)時間超過1小時,會flush到磁盤

<property>

<name>hbase.regionserver,optionalcacheflushinterval</name>

<value>3600000</value>

</property>

(3)UregionServer的全局memstore的大小,超過該大小會觸發(fā)

flush到磁盤的操作,默認是堆大小的40%

<property>

<name>hbase.regionserver,global.memstore.size</name>

<value>0.4</value>

</property>

(4)手動flush

flushtabieName

阻塞機制

以上介紹的是Store中memstore數(shù)據(jù)刷寫磁盤的標準,但是Hbase中

是周期性的檢查是否滿足以上標準滿足則進行刷寫,但是如果在下次

檢查到來之前,數(shù)據(jù)瘋狂寫入Memstore中,會出現(xiàn)什么問題呢?

會觸發(fā)阻塞機制,此時無法寫入數(shù)據(jù)到呢mstore,數(shù)據(jù)無法寫入

Hbase集群。

■memstore中數(shù)據(jù)達到512MB

計算公式:

hbase.hregion.memstore,flush.size*hbase.hregion.memstore..bio

ck.multiplier

hbase.hregion.memstore,flush.size刷寫的閥值,默認是

134217728,即128MB。

hbase.hregion.memstore,block,multiplier一個倍數(shù),默認是4。

?RegionServer全部memstore達到規(guī)定值

hbase.regionserver,global,memstore,size,lower,limit是0.95,

hbase.regionserver,global,memstore,size是0.4,

堆內存總共是16G,

觸發(fā)刷寫的閾值是:6.08GB觸發(fā)阻塞的閾值是:6.4GB

Compact合并機制

在hbase中主要存在兩種類型的compac合并

?minorcompact小合并

O在將Store中多個HFile(StoreFile)合并為一個HFile

這個過程中,刪除和更新的數(shù)據(jù)僅僅只是做了標記,并沒有物理移除,這種合

并的觸發(fā)頻率很高。

Ominorcompact文件選擇標準由以下幾個參數(shù)共同決定:

。一待合并文件數(shù)據(jù)必須大于等于下面這個值一>

<property>

<name>hbase.hstore.compaction.min</name>

<value>3</value>

</property>

<!一待合并文件數(shù)據(jù)必須小于等于下面這個值一〉

<property>

<name>hbase.hstore.compaction.max</name>

<value>10</value>

</property>

<!--默認值為128nl,表示文件大小,小于該值的storefile一定會加?到minor

compaction的storefile

—>

<property>

<name>hbase.hstore.compaction,min.size</name>

<value>134217728</value>

</property>

<!--默認值為LONG.MAX__VALUE,表示文件大小,大于該值的storefile一定會被minor

compaction排除一>

<property>

<name>hbase.hstore.compaction,max.size</name>

<value>9223372036854775807</value>

</property>

觸發(fā)條件

?memstoreflush

在進行memstoreflush前后都會進行判斷是否觸發(fā)compact

?定期檢查線程

周期性檢查是否需要進行compaction操作,由參數(shù):

hbase.server.thread,wakefrequency決定,默認值是10000

milIseconds

?majorcompact大合并

O合并Store中所有的IIFi1e為一個HFile

這個過程有刪除標記的數(shù)據(jù)會被真正移除,同時超過單元格

maxVersion的版本記錄也會被刪除。合并頻率比較低,默認7天執(zhí)行

一次,并且性能消耗非常大,建議生產關閉(設置為0),在應用空閑

時間手動觸發(fā)。一般可以是手動控制進行合并,防止出現(xiàn)在業(yè)務高峰

期。

?majorcompaction觸發(fā)時間條件

。一默認值為7天進行一次大合并,一>

<property>

<name>hbase.hregion.majorcompaction</name>

<value>604800000</value>

</property>

?手動觸發(fā)

##使用majorcompact命令

major_compacttabieName

第4節(jié)Region拆分機制

Region中存儲的是大量的rowkey數(shù)據(jù),當Region中的數(shù)據(jù)條數(shù)過多

的時候,直接影響查詢效率.當Region過大的時候.HBase會拆分

Region,這也是Hbase的一個優(yōu)點

4.1拆分策略

HBase的RegionSplit策略一共有以下幾種:

1)ConstantSizeRegionSplitPolicy

0.94版本前默認切分策略

當region大小大于某個閾值(hbase.hregion.max.filesize=10G)之后就會觸發(fā)

切分,一個region等分為2個region。

但是在生產線上這種切分策略卻有相當大的弊端:切分策略對于大表和小表沒

有明顯的區(qū)分。閾值(hbase.hregion.max.filesize)設置較大對大表比較友

好,但是小表就有可能不會觸發(fā)分裂,極端情況下可能就1個,這對業(yè)務來說

并不是什么好事。如果設置較小則對小表友好,但一個大表就會在整個集群產

生大量的region,這對于集群的管理、資源使用、failover來說都不是一件好

事。

2)Increasing!oUpperBoundRegionSplitPolicy

0.94版本?2.0版本默認切分策略

切分策略稍微有點復雜,總體看和ConstantSizeRegionSplitPolicy思路相

同,一個region大小大于設置閾值就會觸發(fā)切分。但是這個閾值并不像

ConstantSizeRegionSplitPolicy是一個固定的值,而是會在一定條件下不斷

調整,調整規(guī)則和region所屬表在當前regionserver上的region個數(shù)有關

系.

regionsplit的計算公式是:

regioncount*3*128M*2,當region達到該size的時候進行split

例如:

第一次split:1*3*256=256MB

第二次split:2*3*256=2048MB

第三次split:3'3*2566912MB

第四次split:4"3*25616384MB>10GB,因此取較小的值10GB

后面每次split的size都是10GB了

3)SteppingSplitPolicy

2.0版本默認切分策略

這種切分策略的切分閾值又發(fā)生了變化,相比

IncreasingToUpperBoundRegionSplitPolicy簡單了一些,依然和待分裂

region所屬表在當前

regionserver上的region個數(shù)有關系,如果region個數(shù)等于1,

切分閾值為flushsize*2,否則為MaxRegionFileSize。

這種切分策略對于大集群中的大表、小表會比

IncreasingToUpperBoundRegionSplitPolicy更加友好,小表不會再產生大量

的小region,而是適可而止。

4)KeyPrefixRegionSplitPo1icy

根據(jù)rowKey的前綴對數(shù)據(jù)進行分組,這里是指定rowKey的前多少位作為前

綴,比如rowKey都是16位的,指定前5位是前綴,那么前5位相同的rowKey

在進行regionsplit的時候會分到相同的region中。

5)DelimitedKeyPrefixRegionSplitPolicy

保證相同前綴的數(shù)據(jù)在同一個region中,例如rowKey的格式為:

userid_eventtype_eventid,指定的delimiter為_,則split的的時候會確

保userid相同的數(shù)據(jù)在同一個region中。

6)DisabledRegionSplitPolicy

不啟用自動拆分,需要指定手動拆分

4.2RegionSplitPolicy的應用

Region拆分策略可以全局統(tǒng)一配置,也可以為單獨的表指定拆分策

略。

1)通過hbase-site.xml全局統(tǒng)一配置(對hbase所有表生效)

<property>

<name>hbase.regionserver,region,split.policy</name>

<value>org.apache,hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPo

licy</value>

</property>

2)通過JavaAPI為單獨的表指定Region拆分策略

HTab1eDescriptortableDesc=newHTableDescriptor(^testl'1);

tableDesc.setValue(HTableDescriptor.SPLIT_POLICY,

IncreasingToUpperBoundRegionSplitPolicy.class.getName());

tableDesc.addFamily(newHCo]umnDescriptor(Bytes.toBytes(Mcf1M)));

admin.createTable(tableDesc);

3)通過HBaseShell為單個表指定Region拆分策略

hbase>create,test2,,{METADATA=>{fSPLIT_POLICY(=>

1org.apache,hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSpl

itPolicy1}},{NAME=>*cfl

第5節(jié)HBase表的預分區(qū)(region)

5.1為何要預分區(qū)

當一個table剛被創(chuàng)建的時候,Hbase默認的分配一個region給

table。也就是說這個時候,所有的讀寫請求都會訪問到同一個

regionServer的同一個region中,這個時候就達不到負載均衡的效果

了,集群中的其他regionServer就可能會處于比較空閑的狀態(tài)。解決

這個問題可以用pre-splitting,在創(chuàng)建table的時候就配置好,生成

多個regiono

?增加數(shù)據(jù)讀寫效率

?負載均衡,防止數(shù)據(jù)傾斜

?方便集群容災調度region

每一個region維護著startRow與endRowKey,如果加入的數(shù)據(jù)符合某

個region維護的rowKey范圍,則該數(shù)據(jù)交給這個region維

5.2手動指定預分區(qū)

create'person','infol','info2',SPLITS=>['1000','2000','3000']

也可以把分區(qū)規(guī)則創(chuàng)建于文件中

vimsplit,txt

文件內容

aaa

bbb

ccc

ddd

執(zhí)行

createfstudent1!info*,SPLITSFILE=>Vroot/hbase/split.txt

第6節(jié)Region合并

6.1Region合并說明

Region的合并不是為了性能,而是出于維護的目的。

6.2如何進行Region合并

通過Merge類冷合并Region

?需要先關閉hbase集群

需求:需要把student表中的2個region數(shù)據(jù)進行合并:

?student,,1593244870695.10c2df60e567e73523a633f20866b4b5.

?student,1000,1593244870695.0a4c3ff30a98f79ff6cle4cc927b3d0d

這里通過org.apache,hadoop.hbase.util.Merge類來實現(xiàn),不需要進

入hbaseshell,直接執(zhí)行(需要先關閉hbase集群):

hbaseorg.apache,hadoop.hbase.util.Mergestudent\

student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59.\

student,aaa,1595256696737.ld53d6clce0clbed269bl6b6514131d0.

通過online_merge熱合并Region

不需要關閉hbase集群,在線進行合并

與冷合并不同的是,onlinemerge的傳參是Region的hash值,而Region的

hash值就是Region名稱的最后那段在兩個.之間的字符串部分。

需求:需要把lagou_s表中的2個region數(shù)據(jù)進行合并:

student,,1587392159085.9ca8689901008946793b8d5fa5898e06.\

student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.

需要進入hbaseshell:

merge_region

'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'

成功后觀察界面

第三部分HBaseAPI應用和優(yōu)化

第1節(jié)HBaseAPI客戶端操作

創(chuàng)建Maven工程,添加依賴

<dependencies>

<dopendency>

<groupld>org.apache.hbase</groupld>

<artifactld>hbase-client</artifactld>

<version>l.3.K/version>

</dependency>

<dependency>

<groupld>junit</groupld>

<artifactld>junit</artifactld>

<version>4.12</version>

<scope>test</scope>

〈/dependency〉

<dopendency>

<groupld>org.testng</groupld>

<artifactld>testng</artifactld>

<version>6.14.3</version>

<scope>test</scope>

</dependency>

</dependencies>

初始化及釋放資源方法

packagecom.1agou.hbase.client;

importorg.apache,hadoop.conf.Configuration;

importorg.apache,hadoop.hbase.*;

importorg.apache,hadoop.hbase.client.*;

importorg.apache,hadoop.hbase.util.Bytes;

importorg.junit.After;

importorg.junit.Before;

importjava.io.lOException;

publicclassHbaseClientDemo{

Configurationconf=null;

Connectionconn=null;

?Before

publicvoidinit()throwslOException{

〃獲取一個配置文件對象

conf=HBaseConfiguration.create();

conf,set("hbase.zookeeper,quorumHlinuxl21,linuxl22M);

conf,set("hbase.zookeeper,property.clientPort","2181”);

〃通過conf獲取到hbase集群的連接

conn=ConnectionFactory.createConnection(conf);

)

〃釋放連接

?After

publicvoidrealseO{

if(conn!=null){

try{

conn,close();

)catch(lOExceptione){

e.printStackTrace();

)

)

)

}

創(chuàng)建表:

〃創(chuàng)建一張hbase表

?Test

publicvoidcreateTableOthrowslOException{

〃獲取HbaseAdmin對象用來創(chuàng)建表

IIBaseAdminadmin=(HBaseAdmin)conn.getAdminO;

〃創(chuàng)建Htabledesc描述器,表描述器

finalHTableDescriptorworker=new

HTableDescriptor(TableName.valueOf(Mworker°));

〃指定列族

worker.addFamily(newIIColumnDescriptor(Minfo**));

admin.createTable(worker);

System,out.printIn(Hworker表創(chuàng)建成功!!");

}

插入數(shù)據(jù)

〃插入一條數(shù)據(jù)

?Test

publicvoidputDataOthrowslOException{

〃需要獲取一個table對象

finalTableworker=conn.getTable(TableName.valueOf("worker**));

〃準備put對象

finalPutput=newPut(Bytes.toBytes("110"));//指定rowkey

put.addColumn(Bytes.toBytes(Hinfo,r),Bytes.toBytes(naddr,f),

Bytes.toBytes(,fbeijingM));

〃插入數(shù)據(jù),參數(shù)類型是put

worker,put(put);

〃準備list〈puts〉,可以執(zhí)行批量插入

〃關閉table對象

worker,close();

System,out.printin("插入數(shù)據(jù)到worker表成功!!w);

}

刪除數(shù)據(jù):

//刪除一條數(shù)據(jù)

?Test

publicvoiddeleteDataOthrowslOException{

〃需要獲取一個table對象

finalTableworker=conn.getTable(TableName.valueOf(^worker**));

〃準備delete對象,傳入rowkey

finalDeletedelete=newDelete(Bytes.toBytes(^^110^^));

〃執(zhí)行刪除

worker,delete(delete);

〃關閉table對象

worker,close0;

System,out.printIn("刪除數(shù)據(jù)成功!!");

查詢某個列族數(shù)據(jù)

〃查詢數(shù)據(jù)

?Test

publicvoidgetDataOthrowslOException(

〃準備table對象

finalTableworker=conn.getTable(TabieName.valueOf(,fworkerM));

〃準備get對象,傳入rowkey

finalGetget=newGet(Bytes.toBytes(,,110n));

〃指定查詢某個列族或者列

get.addFamily(Bytes.toBytes("info"));

〃執(zhí)行查詢

finalResultresult=worker,get(get);

〃獲取到result中所有cell對象

finalCell[]cells=result.rawCells();

〃遍歷打印

for(Cellcell:cells){

finalStringrowkey=Bytes.toString(CellUtil.cloneRow(cell));

finalStringf=Bytes.toString(CellUtil.cloneFamily(cell));

finalStringcolumn=

Bytes.toString(CellUtil.cloneQualifier(cell));

finalStringvalue=Bytes.toString(CellUtil.cloneValue(cel1));

System.out.println(Mrowkey->"+rowkey+”-;cf->"+f+"-

column—>"+column+“-;value->n+value);

}

worker,close();

通過Scan全表掃描

〃全表掃描

?Test

publicvoidscanDataOthrowslOException{

〃準備table對象

finalTableworkerconn.getTable(TableName.valueOf(^worker"));

〃準備scan對象

finalScanscan=newScan();

〃執(zhí)行掃描

finalResultScannerresultScanner=worker.getScanner(scan);

for(Resultresult:resultScanner){

〃獲取到result中所有cell對象

finalCell[]cells=result.rawCells();

〃遍歷打印

for(Cellcell:cells){

finalStringrowkey=Bytes.toString(CellUtil.cloneRow(cel1));

finalStringf=Bytes.toString(CellUtil.cloneFamily(cell));

finalStringcolumn=

Bytes.toString(Cell(Jtil.cloneQualifier(cell));

finalStringvalue=Bytes.toString(CellUti1.cloneValue(cel1));

System,out.printin(Mrowkey-->"+rowkey+”--;cf-->"+f+

column--->"+column+0-;value—>M+value);

)

}

worker.closeO;

}

log4j:WARNNoappenderscouldbefoundforlogger(org.apache.hadoop.security.Groups)

log4j:WARNPleaseinitializethelog4jsystemproperly.

Iog4j:WARNSeehttD://logging?aD/log4j/I?2/faa.html#noconfigformoreinfo.

rowkey-->110--;cf-->info—;column—>addr--;value-->beijing

通過startRowKey和endRo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論