HBase數(shù)據(jù)平臺(tái)簡(jiǎn)介_(kāi)第1頁(yè)
HBase數(shù)據(jù)平臺(tái)簡(jiǎn)介_(kāi)第2頁(yè)
HBase數(shù)據(jù)平臺(tái)簡(jiǎn)介_(kāi)第3頁(yè)
HBase數(shù)據(jù)平臺(tái)簡(jiǎn)介_(kāi)第4頁(yè)
HBase數(shù)據(jù)平臺(tái)簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩109頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

3.4.2HBase簡(jiǎn)介,數(shù)據(jù)模型,架構(gòu),安

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

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

處理器,RK設(shè)計(jì)原貝?。?,熱點(diǎn),二級(jí)索引,

布隆過(guò)濾器

目錄

第一部分初識(shí)HBase

第1節(jié)HBase簡(jiǎn)介

1.1HBase是什么

1.2HBase的特點(diǎn)

1.3HBase的應(yīng)用

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

HBase邏輯架構(gòu)

HBase物理存儲(chǔ)

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

Zookeeper

IMaster(Master)

HRegionServer(RegionServer)

Region

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

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

3、查看表list

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

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

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

6.1通過(guò)rowkey進(jìn)行查詢(xún)

6.2查看rowkey下面的某個(gè)列族的信息

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

6.4查看rowkey指定多個(gè)列族的信息

6.5指定rowkey與列值查詢(xún)

6.6指定rowkey與列值模糊查詢(xún)

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

6.8列族查詢(xún)scan

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

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

6.11指定rowkey模糊查詢(xún)

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

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

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

8.1指定rowkey以及列名進(jìn)行刪除

8.2指定rowkey,列名以及字段值進(jìn)行刪除

8.3刪除列族alter

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

8.5刪除表disable+drop

第二部分IIBase原理深入

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

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

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

Flush機(jī)制

阻塞機(jī)制

Compact合并機(jī)制

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

4.1拆分策略

1)ConstantSizeRegionSplitPolicy

2)IncreasingToUpperBoundRegionSplitPolicy

3)SteppingSplitPolicy

4)KeyPrefixRegionSplitPolicy

5)DelimitedKeyPrefixRegionSplitPolicy

6)DisabledRegionSplitPolicy

4.2RegionSplitPolicy的應(yīng)用

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

效)

2)通過(guò)JavaAPI為單獨(dú)的表指定Region拆分策略

3)通過(guò)HBaseShell為單個(gè)表指定Region拆分策略

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

5.1為何要預(yù)分區(qū)

第6節(jié)Region合并

6.1Region合并說(shuō)明

6.2如何進(jìn)行Region合并

通過(guò)Merge類(lèi)冷合并Region

通過(guò)online_merge熱合并Region

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

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

初始化及釋放資源方法

創(chuàng)建表:

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

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

查詢(xún)某個(gè)列族數(shù)據(jù)

通過(guò)Scan全表掃描

通過(guò)startRowKey和endRowKey進(jìn)行掃描

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

2.1協(xié)處理器概述

2.2協(xié)處理器類(lèi)型

Observer

Endpoint

Endpoint常□用途

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

第4節(jié)HBase表的RowKey設(shè)計(jì)

RowKey的基本介紹

RowKey□度原則

RowKey散列原則

RowKey唯一原則

RowKey排序原則

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

5.1什么是熱點(diǎn)

5.2熱點(diǎn)的解決方案

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

第7節(jié)布隆過(guò)濾器在hbase的應(yīng)用

布隆過(guò)濾器應(yīng)用

布隆過(guò)濾器的原理

BloomFilter案例

第一部分初識(shí)HBase

第1節(jié)HBase簡(jiǎn)介

1.1HBase是什么

HBase基于Google的BigTable論文而來(lái),是一個(gè)分布式海量列式非

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

接下來(lái),通過(guò)一個(gè)場(chǎng)景初步認(rèn)識(shí)HBase列存儲(chǔ)

如下MySQL存儲(chǔ)機(jī)制,空值字段浪費(fèi)存儲(chǔ)空間

如果是列存儲(chǔ)的話,可以這么玩

rowkey:1name:小明

rowkey:1age:23

rowkey:1job:學(xué)生

rowkey:2name:小紅

rowkey:2salary:lOw

rowkey:2job:律師

列存儲(chǔ)的優(yōu)點(diǎn):

1)減少存儲(chǔ)空間占用。

2)支持好多列

1.2HBase的特點(diǎn)

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

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

若干列

?極易擴(kuò)展:底層依賴(lài)HDFS,當(dāng)磁盤(pán)空間不足的時(shí)候,只需要?jiǎng)討B(tài)增

加DataNode服務(wù)節(jié)點(diǎn)就可以

?高并發(fā):支持高并發(fā)的讀寫(xiě)請(qǐng)求

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

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

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

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

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

1.3HBase的應(yīng)用

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

?金融方面:消費(fèi)信息、貸款信息、信用卡還款信息等

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

?電信方面:通話信息

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

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

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

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

HBase邏輯架構(gòu)

HBase物理存儲(chǔ)

\\

概描

念述

na名

me空

sp間

ac類(lèi)

e似

關(guān)

數(shù)

據(jù)

庫(kù)

da

ta

ba

se

個(gè)

個(gè)

O

HB

as

e

個(gè)

?

hb

as

e

de

fa

ul

t

9

hb

as

e

HB

as

e

內(nèi)

de

fa

ul

t

認(rèn)

使

個(gè)

創(chuàng)

時(shí)

個(gè)

區(qū)

類(lèi)

關(guān)

%系

bl型

e數(shù)

據(jù)

庫(kù)

HB

as

e

時(shí)

9

數(shù)

據(jù)

時(shí)

時(shí)

(

TT

L

)

9

(

CO

MP

RE

SS

10

\

)

9

?

S

HB

as

e

Ro

w

_數(shù)

據(jù)

邏由

輯_

數(shù)

個(gè)

據(jù)

Ro

wK

ey

個(gè)

Co

lu

mn

個(gè)

T

個(gè)

過(guò)

來(lái)

關(guān)

?

數(shù)

據(jù)-

?

個(gè)

?

報(bào)

錯(cuò)

No

Su

ch

Co

lu

mn

Fa

mi

ly

Ex

ce

Pt

io

n

Ro

Ro

wk

wK

ey

ey

(

數(shù)

據(jù)

鍵串

)不

復(fù)

1

標(biāo)

識(shí)

I

數(shù)

據(jù)

Ro

wK

ey

儲(chǔ)

數(shù)

據(jù)

時(shí)

-據(jù)

Ro

wK

ey

進(jìn)

Ro

wK

ey

設(shè)

計(jì)

O

使

T

經(jīng)

Ro

wK

ey

?

會(huì)

數(shù)

據(jù)

個(gè)

Co

lu合

mn

Fa

mi個(gè)

ly列

(族

列郁

族以

,[苗

態(tài)

個(gè)

O

關(guān)

?

個(gè)

1

個(gè)

內(nèi)

會(huì)

O

HB

as

e

會(huì)

臺(tái)

機(jī)

說(shuō)

個(gè)

*

o

lib

as

e

Co列

lu是

mn可

Qu以

al隨

if意

ie定

r義

個(gè)

數(shù)

1

O

賴(lài)

I

稱(chēng)

!

in

fo

na

me

in

fo

ag

Ti于

me標(biāo)

st識(shí)

am數(shù)

P據(jù)

(的

時(shí)不

間同

戳版

-A

版(

ve

)rs

io

n

)

o

時(shí)

認(rèn)

統(tǒng)

9

數(shù)

據(jù)

時(shí)

?

?

rib

as

e

認(rèn)

會(huì)

個(gè)

數(shù)

據(jù)

個(gè)

11

儲(chǔ)

個(gè)

數(shù)

據(jù)

O

個(gè)

稱(chēng)

個(gè)

(

Ce

11

)

Re

gi

on

Re

gi

個(gè)

on

(

區(qū)

)組

I

Re

gi

on

(

ro

wk

ey

)

O

Re

gi

on

Re

gi

on

Se

ve

r

?

當(dāng)

數(shù)

據(jù)

時(shí)

?

HB

as

e

會(huì)

Re

gi

on

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

Zookeeper

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

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

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

HMaster(Master)

為IIRegionServer分配Region

?維護(hù)整個(gè)集群的負(fù)載均衡

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

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

HRegionServer(RegionServer)

負(fù)責(zé)管理Region

接受客戶端的讀寫(xiě)數(shù)據(jù)請(qǐng)求

切分在運(yùn)行過(guò)程中變大的Region

Region

每個(gè)HRegion由多個(gè)Store構(gòu)成,

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

幾個(gè)Store,

每個(gè)Store由一個(gè)MemStore和多個(gè)StoreFile組成,MemStore是

Store在內(nèi)存中的內(nèi)容,寫(xiě)到文件后就是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)上傳安裝包到服務(wù)器

(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上存儲(chǔ)的路徑—>

<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的地址,多個(gè)用分割一〉

<property>

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

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

</property>

</configuraion>

修改regionservers文件

#指定regionserver節(jié)點(diǎn)

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é)點(diǎn)

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

rsync-script/etc/profile

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

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

HBase集群的啟動(dòng)和停止

前提條件:先啟動(dòng)hadoop和zk集群

啟動(dòng)HBase:start-hbase.sh

停止HBase:stop-hbase.sh

HBase集群的web管理界面

啟動(dòng)好DBase集群之后,可以訪問(wèn)地址:HMaster的主機(jī)名:16010

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

1、進(jìn)入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兩個(gè)列族

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

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

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

'extra_info'.VERSIONS=>'3'}

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

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

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

name列標(biāo)示符,值為wang

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

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

列標(biāo)示符,值為30

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

向lagou表中插入信息,rowkey為rkl,列族e(cuò)xtra_info中添加

address列標(biāo)示符,值為shanghai

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

1shanghai*

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

6.1通過(guò)rowkey進(jìn)行查詢(xún)

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

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

6.2查看rowkey下面的某個(gè)列族的信息

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

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

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

獲取表中rowkey為rkl,base_info列族的name、age列標(biāo)示符的信

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

'base_info:age'

6.4查看rowkey指定多個(gè)列族的信息

獲取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與列值查詢(xún)

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

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

'binary:wang')"}

6.6指定rowkey與列值模糊查詢(xún)

獲取表中rowkey為rkl,列標(biāo)示符中含有a的信息

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

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

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

查詢(xún)lagou表中的所有信息

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

6.8列族查詢(xún)scan

查詢(xún)表中列族為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時(shí)可以設(shè)置是否開(kāi)啟Raw模式,開(kāi)啟Raw模式會(huì)返回包括已添加刪除標(biāo)

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

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

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

查詢(xún)lagou表中列族為base_info和extra_info且列標(biāo)示符中含有

a字符的信息

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

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

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

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

(rowkey底層存儲(chǔ)是字典序)

?按rowkey順序存儲(chǔ)。

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

'rkl',ENDROW=>'rk3'}

6.11指定rowkey模糊查詢(xún)

查詢(xún)lagou表中rowkey以rk字符開(kāi)頭的

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

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

更新操作同插入操作一模一樣,只不過(guò)有數(shù)據(jù)就更新,沒(méi)數(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以及列名進(jìn)行刪除

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

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

8.2指定rowkey,列名以及字段值進(jìn)行刪除

刪除lagou表rowkey為rkl,列標(biāo)示符為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,

#如果不進(jìn)行disable,直接drop會(huì)報(bào)錯(cuò)

ERROR:Tableuserisenabled.Disableitfirst.

第二部分HBase原理深入

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

HBase讀操作

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

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

2)根據(jù)要查詢(xún)的namespace、表名和rowkey信息。找到寫(xiě)入數(shù)據(jù)對(duì)應(yīng)

的region信息

3)找到這個(gè)region對(duì)應(yīng)的regionServer,然后發(fā)送請(qǐng)求

4)查找對(duì)應(yīng)的region

5)先從memstore查找數(shù)據(jù),如果沒(méi)有,再?gòu)腂lockCache上讀取

HBase上Regionserver的內(nèi)存分為兩個(gè)部分

?一部分作為Memstore,主要用來(lái)寫(xiě);

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

6)如果BlockCache中也沒(méi)有找到,再到StoreFile上進(jìn)行讀取

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

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

詢(xún);然后在返回結(jié)果給客戶端。

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

HBase寫(xiě)操作

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

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

2)根據(jù)namespace、表名和rowkey信息。找到寫(xiě)入數(shù)據(jù)對(duì)應(yīng)的

region信息

3)找到這個(gè)region對(duì)應(yīng)的regionServer,然后發(fā)送請(qǐng)求

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

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

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

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

Flush機(jī)制

(1)當(dāng)memstore的大小超過(guò)這個(gè)值的時(shí)候,會(huì)flush到磁盤(pán),默認(rèn)為

128M

<property>

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

<value>134217728</value>

</property>

(2)當(dāng)memstore中的數(shù)據(jù)時(shí)間超過(guò)1小時(shí),會(huì)flush到磁盤(pán)

<property>

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

<value>3600000</value>

</property>

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

flush到磁盤(pán)的操作,默認(rèn)是堆大小的40%

<property>

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

<value>0.4</value>

</property>

(4)手動(dòng)flush

flushtabieName

阻塞機(jī)制

以上介紹的是Store中memstore數(shù)據(jù)刷寫(xiě)磁盤(pán)的標(biāo)準(zhǔn),但是Hbase中

是周期性的檢查是否滿足以上標(biāo)準(zhǔn)滿足則進(jìn)行刷寫(xiě),但是如果在下次

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

會(huì)觸發(fā)阻塞機(jī)制,此時(shí)無(wú)法寫(xiě)入數(shù)據(jù)到呢mstore,數(shù)據(jù)無(wú)法寫(xiě)入

Hbase集群。

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

計(jì)算公式:

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

ck.multiplier

hbase.hregion.memstore,flush.size刷寫(xiě)的閥值,默認(rèn)是

134217728,即128MB。

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

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

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

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

堆內(nèi)存總共是16G,

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

Compact合并機(jī)制

在hbase中主要存在兩種類(lèi)型的compac合并

?minorcompact小合并

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

這個(gè)過(guò)程中,刪除和更新的數(shù)據(jù)僅僅只是做了標(biāo)記,并沒(méi)有物理移除,這種合

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

Ominorcompact文件選擇標(biāo)準(zhǔn)由以下幾個(gè)參數(shù)共同決定:

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

<property>

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

<value>3</value>

</property>

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

<property>

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

<value>10</value>

</property>

<!--默認(rèn)值為128nl,表示文件大小,小于該值的storefile一定會(huì)加?到minor

compaction的storefile

—>

<property>

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

<value>134217728</value>

</property>

<!--默認(rèn)值為L(zhǎng)ONG.MAX__VALUE,表示文件大小,大于該值的storefile一定會(huì)被minor

compaction排除一>

<property>

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

<value>9223372036854775807</value>

</property>

觸發(fā)條件

?memstoreflush

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

?定期檢查線程

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

hbase.server.thread,wakefrequency決定,默認(rèn)值是10000

milIseconds

?majorcompact大合并

O合并Store中所有的IIFi1e為一個(gè)HFile

這個(gè)過(guò)程有刪除標(biāo)記的數(shù)據(jù)會(huì)被真正移除,同時(shí)超過(guò)單元格

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

一次,并且性能消耗非常大,建議生產(chǎn)關(guān)閉(設(shè)置為0),在應(yīng)用空閑

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

期。

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

。一默認(rèn)值為7天進(jìn)行一次大合并,一>

<property>

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

<value>604800000</value>

</property>

?手動(dòng)觸發(fā)

##使用majorcompact命令

major_compacttabieName

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

Region中存儲(chǔ)的是大量的rowkey數(shù)據(jù),當(dāng)Region中的數(shù)據(jù)條數(shù)過(guò)多

的時(shí)候,直接影響查詢(xún)效率.當(dāng)Region過(guò)大的時(shí)候.HBase會(huì)拆分

Region,這也是Hbase的一個(gè)優(yōu)點(diǎn)

4.1拆分策略

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

1)ConstantSizeRegionSplitPolicy

0.94版本前默認(rèn)切分策略

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

切分,一個(gè)region等分為2個(gè)region。

但是在生產(chǎn)線上這種切分策略卻有相當(dāng)大的弊端:切分策略對(duì)于大表和小表沒(méi)

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

好,但是小表就有可能不會(huì)觸發(fā)分裂,極端情況下可能就1個(gè),這對(duì)業(yè)務(wù)來(lái)說(shuō)

并不是什么好事。如果設(shè)置較小則對(duì)小表友好,但一個(gè)大表就會(huì)在整個(gè)集群產(chǎn)

生大量的region,這對(duì)于集群的管理、資源使用、failover來(lái)說(shuō)都不是一件好

事。

2)Increasing!oUpperBoundRegionSplitPolicy

0.94版本?2.0版本默認(rèn)切分策略

切分策略稍微有點(diǎn)復(fù)雜,總體看和ConstantSizeRegionSplitPolicy思路相

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

ConstantSizeRegionSplitPolicy是一個(gè)固定的值,而是會(huì)在一定條件下不斷

調(diào)整,調(diào)整規(guī)則和region所屬表在當(dāng)前regionserver上的region個(gè)數(shù)有關(guān)

系.

regionsplit的計(jì)算公式是:

regioncount*3*128M*2,當(dāng)region達(dá)到該size的時(shí)候進(jìn)行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版本默認(rèn)切分策略

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

IncreasingToUpperBoundRegionSplitPolicy簡(jiǎn)單了一些,依然和待分裂

region所屬表在當(dāng)前

regionserver上的region個(gè)數(shù)有關(guān)系,如果region個(gè)數(shù)等于1,

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

這種切分策略對(duì)于大集群中的大表、小表會(huì)比

IncreasingToUpperBoundRegionSplitPolicy更加友好,小表不會(huì)再產(chǎn)生大量

的小region,而是適可而止。

4)KeyPrefixRegionSplitPo1icy

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

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

在進(jìn)行regionsplit的時(shí)候會(huì)分到相同的region中。

5)DelimitedKeyPrefixRegionSplitPolicy

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

userid_eventtype_eventid,指定的delimiter為_(kāi),則split的的時(shí)候會(huì)確

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

6)DisabledRegionSplitPolicy

不啟用自動(dòng)拆分,需要指定手動(dòng)拆分

4.2RegionSplitPolicy的應(yīng)用

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

略。

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

<property>

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

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

licy</value>

</property>

2)通過(guò)JavaAPI為單獨(dú)的表指定Region拆分策略

HTab1eDescriptortableDesc=newHTableDescriptor(^testl'1);

tableDesc.setValue(HTableDescriptor.SPLIT_POLICY,

IncreasingToUpperBoundRegionSplitPolicy.class.getName());

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

admin.createTable(tableDesc);

3)通過(guò)HBaseShell為單個(gè)表指定Region拆分策略

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

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

itPolicy1}},{NAME=>*cfl

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

5.1為何要預(yù)分區(qū)

當(dāng)一個(gè)table剛被創(chuàng)建的時(shí)候,Hbase默認(rèn)的分配一個(gè)region給

table。也就是說(shuō)這個(gè)時(shí)候,所有的讀寫(xiě)請(qǐng)求都會(huì)訪問(wèn)到同一個(gè)

regionServer的同一個(gè)region中,這個(gè)時(shí)候就達(dá)不到負(fù)載均衡的效果

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

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

多個(gè)regiono

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

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

?方便集群容災(zāi)調(diào)度region

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

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

5.2手動(dòng)指定預(yù)分區(qū)

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

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

vimsplit,txt

文件內(nèi)容

aaa

bbb

ccc

ddd

執(zhí)行

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

第6節(jié)Region合并

6.1Region合并說(shuō)明

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

6.2如何進(jìn)行Region合并

通過(guò)Merge類(lèi)冷合并Region

?需要先關(guān)閉hbase集群

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

?student,,1593244870695.10c2df60e567e73523a633f20866b4b5.

?student,1000,1593244870695.0a4c3ff30a98f79ff6cle4cc927b3d0d

這里通過(guò)org.apache,hadoop.hbase.util.Merge類(lèi)來(lái)實(shí)現(xiàn),不需要進(jìn)

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

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

student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59.\

student,aaa,1595256696737.ld53d6clce0clbed269bl6b6514131d0.

通過(guò)online_merge熱合并Region

不需要關(guān)閉hbase集群,在線進(jìn)行合并

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

hash值就是Region名稱(chēng)的最后那段在兩個(gè).之間的字符串部分。

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

student,,1587392159085.9ca8689901008946793b8d5fa5898e06.\

student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.

需要進(jìn)入hbaseshell:

merge_region

'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'

成功后觀察界面

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

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

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

<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{

〃獲取一個(gè)配置文件對(duì)象

conf=HBaseConfiguration.create();

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

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

〃通過(guò)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對(duì)象用來(lái)創(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{

〃需要獲取一個(gè)table對(duì)象

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

〃準(zhǔn)備put對(duì)象

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

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

Bytes.toBytes(,fbeijingM));

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

worker,put(put);

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

〃關(guān)閉table對(duì)象

worker,close();

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

}

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

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

?Test

publicvoiddeleteDataOthrowslOException{

〃需要獲取一個(gè)table對(duì)象

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

〃準(zhǔn)備delete對(duì)象,傳入rowkey

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

〃執(zhí)行刪除

worker,delete(delete);

〃關(guān)閉table對(duì)象

worker,close0;

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

查詢(xún)某個(gè)列族數(shù)據(jù)

〃查詢(xún)數(shù)據(jù)

?Test

publicvoidgetDataOthrowslOException(

〃準(zhǔn)備table對(duì)象

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

〃準(zhǔn)備get對(duì)象,傳入rowkey

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

〃指定查詢(xún)某個(gè)列族或者列

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

〃執(zhí)行查詢(xún)

finalResultresult=worker,get(get);

〃獲取到result中所有cell對(duì)象

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();

通過(guò)Scan全表掃描

〃全表掃描

?Test

publicvoidscanDataOthrowslOException{

〃準(zhǔn)備table對(duì)象

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

〃準(zhǔn)備scan對(duì)象

finalScanscan=newScan();

〃執(zhí)行掃描

finalResultScannerresultScanner=worker.getScanner(scan);

for(Resultresult:resultScanner){

〃獲取到result中所有cell對(duì)象

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

通過(guò)startRowKey和endRo

溫馨提示

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

評(píng)論

0/150

提交評(píng)論