15.HBase基礎(chǔ)

1. HBase介紹,Hbase是什么?

HBase -- Hadoop Database ,是一個(gè)高可靠、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng)。Hbase來(lái)源于Google的論文“Bigtable: 一個(gè)結(jié)構(gòu)化數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng)”。HBase實(shí)際上是Hadoop的一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),它的主要作用和傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)一樣存儲(chǔ)數(shù)據(jù)和檢索數(shù)據(jù)。

傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的一些問(wèn)題:
1) 傳統(tǒng)的RDBMS關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)一定量數(shù)據(jù)時(shí)沒(méi)有問(wèn)題,但是在存儲(chǔ)海量數(shù)據(jù)(PB、TB級(jí)別),傳統(tǒng)數(shù)據(jù)庫(kù)無(wú)法支撐。
2) 性能差(數(shù)據(jù)量很大時(shí))。
3) 面向行的,架構(gòu)不夠彈性,不能任意增加列。

Hbase和傳統(tǒng)數(shù)據(jù)庫(kù)的表結(jié)構(gòu)的差異(Hbase不同于傳統(tǒng)RDBMS,是面向列的):
傳統(tǒng)數(shù)據(jù)庫(kù)的表結(jié)構(gòu):


傳統(tǒng)數(shù)據(jù)庫(kù)表結(jié)構(gòu).png

hbase表結(jié)構(gòu):


hbase表結(jié)構(gòu).png

官方實(shí)例:表結(jié)構(gòu).png

2. HBase架構(gòu)設(shè)計(jì)

Hbase運(yùn)行在Hadoop文件系統(tǒng)HDFS上,是建立在HDFS上的列式存儲(chǔ)數(shù)據(jù)庫(kù)。


HBase架構(gòu).png
  1. Master:Hbase的主節(jié)點(diǎn)(集群中的某一臺(tái)服務(wù)器),協(xié)調(diào)客戶(hù)端應(yīng)用程序與RegionServer的關(guān)系,監(jiān)控和記錄元數(shù)據(jù)的變化和管理。
  2. RegionServer:是Hbase的從節(jié)點(diǎn),用region形式處理實(shí)際的表。Region是Hbase表的基礎(chǔ)單元組件,存儲(chǔ)了分布式表。Hbase集群利用Master和RegionServer來(lái)協(xié)同工作。
  3. Zookeeper:在Hbase中,選舉集群主節(jié)點(diǎn)Master,以便跟蹤可用的在線服務(wù)器,同時(shí)維護(hù)集群的元數(shù)據(jù)。一般安裝多個(gè),用于提供Master的高可用性。
  4. Clinet:使用HBase RPC機(jī)制與Master和RegionServer通信。對(duì)于管理類(lèi)操作(DDL操作)與Master通信,對(duì)于數(shù)據(jù)讀寫(xiě)類(lèi)操作與RegionServer通信。

通常情況下,Master和Hadoop的Namenode進(jìn)程運(yùn)行在同一主機(jī)上,與Datanode通信以讀寫(xiě)Hdfs,RegionServer和Hadoop的datanode運(yùn)行在同一臺(tái)主機(jī)上。

HBase具有可擴(kuò)展性的原因:

  1. 讀取hdfs的數(shù)據(jù),hdfs的擴(kuò)展可以通過(guò)datanode的增加完成;
  2. 一個(gè)表的數(shù)據(jù)分成多個(gè)區(qū)域Region,每個(gè)區(qū)域都有一個(gè)專(zhuān)門(mén)的RegionServer負(fù)責(zé)數(shù)據(jù)管理及檢索,而RegionServer像datanode一樣可以隨意增加(RegionServer運(yùn)行在Datanode的機(jī)器上,可以和datanode一樣多)。

3. HBase數(shù)據(jù)模型:

HBase不以關(guān)系設(shè)計(jì)為中心,可以根據(jù)需求隨意增加字段。每行數(shù)據(jù)提供row_key做快速索引。

HBase表結(jié)構(gòu).png

行鍵:是每個(gè)記錄的唯一鍵,它在內(nèi)存或磁盤(pán)中是以字節(jié)數(shù)組保存的,沒(méi)有數(shù)據(jù)類(lèi)型的概念。行健的設(shè)計(jì)
列族:將相同功能或類(lèi)型的列集合在一起成為列族。

除了上邊幾個(gè)概念外,還包括以下一些:
(1)版本:Hbase中沒(méi)有Insert和Update,只有put。每put一次,就會(huì)產(chǎn)生一個(gè)版本,默認(rèn)顯示你最后一次put的內(nèi)容(最新的版本),并且保留3個(gè)版本的記錄。
(2)時(shí)間戳:表示數(shù)據(jù)插入到表中的時(shí)間。
(3)單元格:最基本的存儲(chǔ)單元,在內(nèi)部就是一個(gè)實(shí)際存儲(chǔ)的值。插入單元格數(shù)據(jù)時(shí),必須包括:rowkey + column family + column + timestamp : value。

HBase的Schema由表名和列族兩項(xiàng)組成。另外,值結(jié)合版本信息轉(zhuǎn)為字節(jié)數(shù)組存儲(chǔ)在列中。

4. HBase環(huán)境搭建:

HBase分布式環(huán)境搭建,可以參考如下網(wǎng)址:
http://hbase.apache.org/book.html
角色規(guī)劃:

HBase角色規(guī)劃.png

HBase的單機(jī)模式不會(huì)使用HDFS系統(tǒng),而是使用本地文件系統(tǒng)file://來(lái)存儲(chǔ)數(shù)據(jù)。

(1)下載hbase對(duì)應(yīng)的安裝文件,并解壓縮。

$ tar zxf hbase-0.98.6-cdh5.3.6.tar.gz -C /opt/modules/

(2)修改配置:
修改配置文件 conf/hbase-env.sh 增加Java環(huán)境變量,并且不使用HBase來(lái)管理Zookeeper:

export JAVA_HOME=/opt/modules/jdk1.7.0_67
export HBASE_MANAGES_ZK=false

修改HBase的主配置文件 conf/hbase-site.xml:

<configuration>
 <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop-senior01.pmpa.com:8020/hbase</value>
</property>
<property>
      <name>hbase.cluster.distributed</name>
      <value>true</value>
</property>
<property>
      <name>hbase.zookeeper.quorum</name>
      <value>hadoop-senior01.pmpa.com,hadoop-senior02.pmpa.com,hadoop-senior03.pmpa.com</value>
</property>
</configuration>

說(shuō)明:

  1. hdfs的8020端口,接收Client連接的RPC端口,用于獲取文件系統(tǒng)metadata信息。
  2. 配置hbase.rootdir屬性時(shí),不需要?jiǎng)?chuàng)建相應(yīng)的目錄,否則就變成了migration。

修改配置文件conf/regionservers ,添寫(xiě)regionserver的ip。

hadoop-senior01.pmpa.com
hadoop-senior02.pmpa.com
hadoop-senior03.pmpa.com

修改配置文件conf/backup-masters,添加作為backup master角色的主機(jī)IP。

hadoop-senior02.pmpa.com

將配置復(fù)制到其他兩個(gè)主機(jī)上:

$ scp -r hbase-0.98.6-cdh5.3.6/ natty@hadoop-senior02.pmpa.com:/opt/modules/
$ scp -r hbase-0.98.6-cdh5.3.6/ natty@hadoop-senior03.pmpa.com:/opt/modules/

(3)啟動(dòng)HBase,測(cè)試安裝:
首先,需要在三臺(tái)主機(jī)啟動(dòng)Zookeeper服務(wù)。

$ bin/zkServer.sh start

啟動(dòng)hadoop集群的各個(gè)角色:

$ sbin/start-dfs.sh
$ sbin/start-yarn.sh 
$ sbin/mr-jobhistory-daemon.sh start historyserver

在啟動(dòng)HBase之前,一定確保沒(méi)有HBase進(jìn)程(例如:HMaster, HRegionServer, HQuorumPeer)存在,否則會(huì)出問(wèn)題。使用腳本bin/start-hbase.sh來(lái)啟動(dòng)Hbase。

$ bin/start-hbase.sh 

當(dāng)然,也可以分角色啟動(dòng)HBase,分別單獨(dú)啟動(dòng)master和regionserver,啟動(dòng)方法如下:

$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver

查看進(jìn)程是否存在:
senior01的進(jìn)程角色(Master、Regionserver):

2957 QuorumPeerMain
3203 DataNode
3730 HMaster
3450 NodeManager
4120 Jps
3090 NameNode
3822 HRegionServer

senior02的進(jìn)程角色(Backup Master、Regionserver):

3113 HMaster
2400 QuorumPeerMain
3281 Jps
2504 ResourceManager
2606 NodeManager
3043 HRegionServer

senior03的進(jìn)程角色(Regionserver):

2422 QuorumPeerMain
3202 Jps
2561 SecondaryNameNode
3037 HRegionServer
2666 NodeManager
2828 JobHistoryServer
2486 DataNode

至此,HBase的分布式模式搭建完成。

5. HBase Shell 基本使用:

(1)在啟動(dòng)了HBase之后,輸入$ bin/hbase 可以獲得很多參數(shù):

  shell           Run the HBase shell
  hbck            Run the hbase 'fsck' tool
  hlog            Write-ahead-log analyzer
  hfile           Store file analyzer
  zkcli           Run the ZooKeeper shell
  upgrade         Upgrade hbase
  master          Run an HBase HMaster node
  regionserver    Run an HBase HRegionServer node
  zookeeper       Run a Zookeeper server
  rest            Run an HBase REST server
  thrift          Run the HBase Thrift server
  thrift2         Run the HBase Thrift2 server
  clean           Run the HBase clean up script
  classpath       Dump hbase CLASSPATH
  mapredcp        Dump CLASSPATH entries required by mapreduce
  pe              Run PerformanceEvaluation
  ltt             Run LoadTestTool
  version         Print the version
  CLASSNAME       Run the class named CLASSNAME

其中,shell參數(shù)可以進(jìn)入hbase 的shell命令行界面。
hlog參數(shù)很重要,可以分析和查看hbase的日志。預(yù)先寫(xiě)日志(二進(jìn)制日志文件),在客戶(hù)端往HBase寫(xiě)操作前記錄日志。HBase與傳統(tǒng)數(shù)據(jù)庫(kù)有很大區(qū)別,寫(xiě)操作遠(yuǎn)遠(yuǎn)多于讀操作(W:R約等于10:1)。同時(shí), write-ahead log也可以防止寫(xiě)丟失。

(2)啟動(dòng)HBase的shell命令行:

$ bin/hbase shell

bin/hbase 命令有很多選項(xiàng),直接輸入命令 bin/hbase 可以查看所有選項(xiàng)的幫助。例如,查看hbase版本:

$ bin/hbase version

HBase的命令行模式不支持退格鍵,輸入了錯(cuò)的命令后無(wú)法修改,所以需要首先解決這個(gè)問(wèn)題。我使用的SecureCRT終端,下面是SecureCRT的解決方案:
選項(xiàng) --> 會(huì)話選項(xiàng) -->終端 --> 仿真 --> 終端項(xiàng)選擇“Linux”
做了上述配置后,可以使用 Ctrl+刪除鍵(backspace) 在HBase shell中做退格操作。
(3)hbase shell命令:
HBase中沒(méi)有數(shù)據(jù)庫(kù)的概念,只有命名空間(相當(dāng)于數(shù)據(jù)庫(kù)的概念)。

  • 使用help命令查看命令幫助(有命令 和 命令組 的概念):
hbase(main):001:0> help
  • 如果要查看create命令如何使用(查看其它命令幫助也一樣),直接在shell命令行中輸入 create:
hbase(main):002:0> create

從給出的幫助信息可以找到: hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5} 。其中ns1是命名空間、t1是表名、f1是列族名(可以聲明多個(gè)列族,每個(gè)大括號(hào)內(nèi)是一個(gè)列族的信息)。

  • 創(chuàng)建user表、user1表;并查看所有的表(使用list):
hbase(main):003:0> create 'user','info'
hbase(main):004:0> create 'user1',{NAME => 'info1',VERSIONS => 5}
hbase(main):005:0> list

創(chuàng)建完表之后,從下圖可以看到:每個(gè)HBase的表,在HDFS上對(duì)應(yīng)一個(gè)目錄。


HBase表在HDFS上的位置.png

在創(chuàng)建表時(shí)我沒(méi)有指定namespace,默認(rèn)會(huì)放在default 命名空間上。hbase命名空間是保存元數(shù)據(jù)信息的namespace。

  • 查看表的信息:
hbase(main):006:0> describe 'user1'
  • 向表中插入數(shù)據(jù),使用put命令:
hbase(main):007:0> put
hbase(main):009:0> put 'user','10001','info:name', 'Jackson'
hbase(main):010:0> put 'user','10001','info:age','31'
hbase(main):011:0> put 'user','10001','info:sex','male'
hbase(main):012:0> put 'user','10001','info:address','beijing'
hbase(main):016:0> put 'user','10002','info:name', 'Lucy'
hbase(main):017:0> put 'user','10002','info:sex', 'female'
hbase(main):018:0> put 'user','10003','info:name', 'Honda'

查看put命令幫助得到put的語(yǔ)法:hbase> put 't1', 'r1', 'c1', 'value' t1:表名;r1:行鍵;c1:列名;'value' 是值。

  • 下面查看數(shù)據(jù),可以使用get和scan兩個(gè)命令:
hbase(main):013:0> get 'user','10001'
hbase(main):014:0> scan 'user'
hbase(main):023:0> scan 'user', {COLUMNS => ['info:name','info:age']}
hbase(main):025:0> scan 'user', {STARTROW=>'10001',STOPROW=>'10002'}

get命令一般根據(jù)行鍵獲取單條結(jié)果。
scan命令是范圍掃描,查看整個(gè)表。同時(shí),可以在scan命令中限定范圍來(lái)查找,STARTROW、STOPROW選項(xiàng)是很常用的,這兩個(gè)選項(xiàng)需要注意的一點(diǎn)是,這個(gè)區(qū)間是左閉右開(kāi)的,也就是“[ STARTROW,STOPROW )”,這點(diǎn)需要注意。
在scan數(shù)據(jù)時(shí),可以通過(guò)STARTROW=> 和ENDROW=>來(lái)指定范圍檢索,而且支持正則表達(dá)式(前綴匹配)。

  • 刪除表,在刪除(drop)前需要先禁用(disable)該表:
hbase(main):027:0> disable 'user1'
hbase(main):028:0> drop 'user1'
  • 刪除表中的數(shù)據(jù)(這里新做了一張表user2,并添加了一些數(shù)據(jù)來(lái)做測(cè)試):
    測(cè)試數(shù)據(jù)如下:
ROW        COLUMN+CELL                                                                                      
 01           column=info:name, timestamp=1493743972426, value=zhangsan                  
 02           column=info:name, timestamp=1493743985575, value=lisi       
 02           column=info:sex, timestamp=1493744013788, value=male        
 03           column=info:name, timestamp=1493743996438, value=wangwu

1.刪除行中的某個(gè)列值:

hbase(main):036:0> delete 'user2','02','info:sex'

上邊命令刪除了行健為02的數(shù)據(jù)行的 info:sex列。
2.刪除整行:

hbase(main):040:0> deleteall 'user2','03'

3.清空表:

hbase(main):043:0> truncate 'user2'
Truncating 'user2' table (it may take a while):
 - Disabling table...
 - Dropping table...
 - Creating table...
0 row(s) in 2.0170 seconds
  • 創(chuàng)建命名空間:
hbase(main):043:0> create namespace 'ns1'
hbase(main):043:0> create table 'ns1:table1','info'
hbase(main):043:0> list
hbase(main):043:0> list_namespace 'ns1'
hbase(main):043:0> list_namespace_tables 'ns1'

HBase的命名空間類(lèi)似于RDBMS中的數(shù)據(jù)庫(kù)的概念,可以在命名空間下創(chuàng)建表和管理表。每個(gè)命名空間對(duì)應(yīng)于HDFS上的一個(gè)目錄,這個(gè)命名空間下的表的數(shù)據(jù)也存在這個(gè)目錄下。
上邊命令create namespace新建了一個(gè)命名空間ns1, 在ns1空間下創(chuàng)建一個(gè)有一個(gè)列族info的表table1。下面列出某個(gè)命名空間下的所有表。
默認(rèn)情況,有2個(gè)命名空間,分別是default和HBase。默認(rèn)建的表都在default空間,HBase空間是系統(tǒng)命名空間。HBase空間下有2張表,一個(gè)是meta表(用來(lái)存儲(chǔ)元數(shù)據(jù),用戶(hù)表region的相關(guān)信息),一個(gè)是namespace表(用來(lái)存儲(chǔ)命名空間)。

6. HBase表的物理模型:

1. HBase存儲(chǔ)結(jié)構(gòu):

HBase是按照列存儲(chǔ)的,每個(gè)Column Family存儲(chǔ)在單獨(dú)的一個(gè)HDFS文件上。表格中的行按照Rowkey字典序進(jìn)行排列,表格在行的方向上被分隔為多個(gè)Region(按行進(jìn)行分隔)

按列存儲(chǔ),按行分隔成多個(gè)Region.png

HBase有一個(gè)典型的應(yīng)用場(chǎng)景:查詢(xún)歷史訂單。訂單數(shù)據(jù)是海量的,使用RDBMS會(huì)非常緩慢。例如查詢(xún)近10天的訂單,使用HBase能完美解決。
一般地,HBase表并不多但都是很大的表(不是數(shù)據(jù)量大,而是大寬表,列可以任意添加)。

2. HBase如何來(lái)劃分Region?

HBase提供了兩種方式來(lái)劃分Region。
第一種方式,在創(chuàng)建表的時(shí)候劃定范圍。請(qǐng)看下例:
在HBase shell中,查看create命令的幫助,可以看到這樣一個(gè)實(shí)例:

create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']

SPLITS關(guān)鍵字會(huì)按照RowKey劃分五個(gè)Region。rowkey在0到10的數(shù)據(jù)在region1,rowkey在10到20的在region2,依此類(lèi)推。
第二種方式,按照閾值自動(dòng)劃分。請(qǐng)看下例:
根據(jù)閾值自動(dòng)劃分。Region按大小分割,每個(gè)表開(kāi)始只有一個(gè)Region,隨著數(shù)據(jù)增多,當(dāng)增大到一個(gè)閾值時(shí),Region就等分成2個(gè)新Region(出現(xiàn)新的Region),之后出現(xiàn)越來(lái)越多Region。

邏輯架構(gòu).png

如上圖,表A按照行被劃分成相等的4個(gè)Region,RegionServer管理Region。每個(gè)RegionServer可以管理不同表格的Region,而且每個(gè)RegionServer管理的Region數(shù)量是相同的。
當(dāng)要讀取region3的數(shù)據(jù)時(shí),就是RegionServer86來(lái)提供服務(wù),但是region3的數(shù)據(jù)塊不一定在RegionServer86上,因?yàn)閿?shù)據(jù)塊的存儲(chǔ)單位是block(HDFS概念),可能存儲(chǔ)在多個(gè)datanode上。上圖中,類(lèi)似Region4和RegionServer367的對(duì)應(yīng)關(guān)系稱(chēng)為元數(shù)據(jù),存儲(chǔ)在Zookeeper中。

Paste_Image.png

Region是HBase中分布式存儲(chǔ)和負(fù)載均衡的最小單元,但是不是存儲(chǔ)的最小單元(底層存儲(chǔ))。

  • Region由一個(gè)或多個(gè)Store組成,每個(gè)Store保存一個(gè)Column Family列族。
  • 每個(gè)Store又由有一個(gè)memStore0到多個(gè)StoreFile組成。
  • memStore存儲(chǔ)在內(nèi)存中,StoreFile存儲(chǔ)在HDFS上。
  • 每個(gè)Region還包含一個(gè)HLog(預(yù)寫(xiě)式日志W(wǎng)rite-Ahead-Log,當(dāng)存儲(chǔ)數(shù)據(jù)時(shí)只有把數(shù)據(jù)寫(xiě)入WAL和每個(gè)Store中的memStore才算成功)
Region元素.png

3.HBase處理單點(diǎn)故障:

以上邊的圖為例,RegionServer367發(fā)生了宕機(jī)情況,將進(jìn)行以下流程:
Zookeeper實(shí)時(shí)監(jiān)控RegionServer,發(fā)現(xiàn)RegionServer367宕機(jī)。通知Master,Master會(huì)重新指派RegionServer7來(lái)管理原來(lái)RegionServer367管理的Regions。

7.HBase數(shù)據(jù)讀寫(xiě)流程:

1. HBase檢索流程

下圖是HBase數(shù)據(jù)的檢索流程圖:


HBase檢索流程.png

讀取數(shù)據(jù)流程:
(1)客戶(hù)端(Client)需要訪問(wèn)Zookeeper集群,獲得元數(shù)據(jù)信息(表信息,每張表的Region信息,StartKey、EndKey)。
(2)Client找到Region對(duì)應(yīng)的 RegionServer。這個(gè)信息存在hbase:meta中(Region和RegionServer的對(duì)應(yīng)關(guān)系,也就是某個(gè)Region由哪個(gè)RegionServer來(lái)管理,存在hbase:meta表中)
(3)RegionServer響應(yīng)客戶(hù)端請(qǐng)求。

Region對(duì)應(yīng)于哪個(gè)RegionServer服務(wù)器,這個(gè)信息在元數(shù)據(jù)表中存儲(chǔ)。打開(kāi)HBase的管理頁(yè)面(60010端口):


HBase管理頁(yè)面.png

在Tables一欄中,有“User Tables” 和 “Catalog Tables”,查看后者:


Tables信息.png

寫(xiě)數(shù)據(jù)流程:
(1)訪問(wèn)Zookeeper集群,獲取該數(shù)據(jù)應(yīng)該寫(xiě)入哪個(gè)Region中。
(2)向region所在的Region Server發(fā)起寫(xiě)請(qǐng)求
(3)RegionServer把數(shù)據(jù)先寫(xiě)進(jìn)HLog(WAL),然后寫(xiě)入memStore(根據(jù)閾值flush到磁盤(pán)默認(rèn)128MB)
(4)當(dāng)memStore達(dá)到閾值,寫(xiě)入HFile,HFile再合并為storeFile(每個(gè)storeFile達(dá)到閾值合并,compact)
(5)當(dāng)StoreFile達(dá)到閾值,合并成新的更大的StoreFile
(6)如果當(dāng)前的Region達(dá)到閾值,當(dāng)前Region會(huì)劃分為2個(gè)新的Region(split)
有3個(gè)核心點(diǎn):flush 、compact、split

2. HBase表

HBase的表分為User Tables(用戶(hù)表) 和 Catalog Tables(系統(tǒng)自帶表)。
HBase的所有表數(shù)據(jù)都存放在HDFS的/hbase/data目錄下,該目錄下的每一個(gè)目錄是一個(gè)命名空間(類(lèi)似于RDBMS的數(shù)據(jù)庫(kù)概念),如下圖有2個(gè)命名空間(default和hbase),用戶(hù)建的表默認(rèn)存在default命名空間。


HBase表在HDFS上的存儲(chǔ)目錄.png

下邊的命令可以查看HBase上的命名空間:

hbase(main):005:0> list_namespace

查看某個(gè)命名空間下的所有的表(查看hbase命名空間下的所有表):

hbase(main):007:0> list_namespace_tables 'hbase'

查看meta表信息:

hbase(main):008:0> scan 'hbase:meta'

用戶(hù)表由Region組成,Region信息存儲(chǔ)在hbase:meta中。

8. HBase數(shù)據(jù)存儲(chǔ)

1. HBase能高速實(shí)現(xiàn)數(shù)據(jù)讀寫(xiě)源于HBase數(shù)據(jù)存儲(chǔ)

  • (讀)連接Zookeeper,從Zookeeper中找要讀的數(shù)據(jù)。需要知道Rowkey在表中region的位置。
  • 客戶(hù)端查找HRegionServer,HRegionServer管理眾多region。(通過(guò)Region和RegionServer的對(duì)應(yīng)關(guān)系查找)
  • HMaser也需要連接Zookeeper,作用是HMaster需要知道哪些HRegionServer是活動(dòng)的及位置,然后管理HRegionServer。(HRegionServer的上下線)
  • HBase內(nèi)部是把數(shù)據(jù)寫(xiě)到HDFS上的,DFS有客戶(hù)端。
  • Region中包含HLog、Store。一個(gè)列族對(duì)應(yīng)一個(gè)Store。Store中有多個(gè)MemStore及StoreFile。StoreFile是對(duì)HFile的封裝。StoreFile真正存儲(chǔ)在HDFS上。
  • 所以寫(xiě)數(shù)據(jù)時(shí)先往HLog上寫(xiě)一份,再往MemStore上寫(xiě)一份。當(dāng)MemStore達(dá)到一定大小則往StoreFile上寫(xiě)。若MemStore丟失,從HLog上恢復(fù)。
  • 讀數(shù)據(jù)時(shí)先到MemStore上讀,再到StoreFile上讀,之后合并。

2. HBase數(shù)據(jù)存儲(chǔ)

HBase的所有文件都存在HDFS上主要包括HFile(Hadoop的二進(jìn)制格式文件)和HLog File(Hadoop的Sequence File)。
HRegionServer內(nèi)部管理一系列HRegion對(duì)象,每個(gè)對(duì)象對(duì)應(yīng)table中的一個(gè)region。最好將IO特性一致的列設(shè)計(jì)為一個(gè)Column Family。

StoreFile合并.png

StoreFile在合并時(shí)同時(shí)進(jìn)行版本合并數(shù)據(jù)刪除

  • 當(dāng)StoreFiles Compact后,逐步形成越來(lái)越大的StoreFile。
  • 單個(gè)StoreFile大小超過(guò)閾值后,觸發(fā)split操作,把當(dāng)前region分成2個(gè)region,region會(huì)下線,新分出的2個(gè)孩子region會(huì)被HMaster分配到相應(yīng)的HRegionServer上,使得原先1個(gè)Region的壓力得以分流到2個(gè)Region上。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容