HBase
第二章:HBase的數(shù)據(jù)結(jié)構(gòu)及邏輯存儲結(jié)構(gòu)
文章目錄
前言
本文主要講解HBase存儲數(shù)據(jù)的邏輯結(jié)構(gòu)、HBase的數(shù)據(jù)模型及HBase在底層存儲數(shù)據(jù)的物理存儲結(jié)構(gòu)
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、HBase的邏輯結(jié)構(gòu)
HBase的數(shù)據(jù)模型和數(shù)據(jù)庫很類似,但底層的存儲結(jié)構(gòu)完全不同。
HBase的數(shù)據(jù)模型分為:store(相當于表)、列、Row Key(行)、(列的集合)、列族
(1)store
store就相當于一個表,由多行和多列組成,store中包含,主要用來寫數(shù)據(jù),每個store對應一個列族。
設(shè)置的主要原因是:存儲在HDFS上的數(shù)據(jù)需要按照row key 排序。而HDFS本身被設(shè)計為順序讀寫,不允許修改。這樣的話,HBase就不能夠高效的寫數(shù)據(jù),因為要寫入到HBase的數(shù)據(jù)不會被排序,這也就意味著要存入HDFS中的數(shù)據(jù)是無序的,這顯然不利于存儲數(shù)據(jù)后的數(shù)據(jù)檢索。
所以的作用是當寫入數(shù)據(jù)到store時,數(shù)據(jù)先寫到中,只有當數(shù)據(jù)量達到一定閾值,之間的時間足夠?qū)?shù)據(jù)進行排序后再統(tǒng)一寫到HDFS中。
(2)列
就是數(shù)據(jù)的一列,建表時,需要先指定列族才能創(chuàng)建列,每個列都由 (列族)和 (列限定符即列名)決定
(3)列族
包括多列,設(shè)置列族的目的是防止寬表(即有多列數(shù)據(jù)的表),即當數(shù)據(jù)列數(shù)很多是,設(shè)置列族可以大大提高檢索效率。
如:要查找一個值,先找到這個值所對應列所在的列族(在HDFS中文件的存儲是按store來分的,即文件的存儲是按列族來分的)就可以精確的找到這個列族所在的文件進行檢索。
(4)Row Key
代表一行數(shù)據(jù),一列數(shù)據(jù)的唯一標識。Row Key的排序是逐位排的,即先比較第一位,若比出大小則不用對后面的進行比較,若第一位未比出大小,則要繼續(xù)順位比較下去,直到比較出來為止(注:若這一位為空則比0小)。
如: (5)
的作用是防止高表,即防止數(shù)據(jù)行數(shù)過多,可以將數(shù)據(jù)量大的表切分為多個
二、使用步驟
1.物理存儲結(jié)構(gòu)圖示:
即為HBase底層存儲數(shù)據(jù)的結(jié)構(gòu)
如圖可以清晰地看到在邏輯結(jié)構(gòu)表中的每一個值對應物理存儲結(jié)構(gòu)的一行,每個值都有一些其它屬性,如:
Row Key代表列的唯一標識文件的邏輯結(jié)構(gòu)分為順序文件,用以標識該數(shù)據(jù)在這一行中;
代表這個值所在的列族;
唯一標識這個值所在的列;
Time Stamp區(qū)分不同版本的數(shù)據(jù),如當你修改這個數(shù)據(jù)后,原來的數(shù)據(jù)并不會直接被刪除,而是因為新修改的數(shù)據(jù)時間戳大于之前數(shù)據(jù)的時間戳,所以在上層顯示的就是新修改的數(shù)據(jù);
Type用于鑒別數(shù)據(jù)的類型(僅有put和out兩種)當數(shù)據(jù)被刪除時Type值為out,此時并不會顯示時間戳更小的那個值,因為此數(shù)據(jù)仍然存在,并沒有被刪除。
HBase底層使用這樣的存儲模式,可以大大提高數(shù)據(jù)的讀取效率,并且提升了數(shù)據(jù)的容錯率,因為以前的數(shù)據(jù)都沒有被刪除而是保存起來了,只不過我們看不到。
三、數(shù)據(jù)模型 (1)Name Space
命名空間,相當于MySQL的都是存放表的集合。HBase有兩個自帶的命名空間,分別是 hbase 和 ,hbase 中存放的是 HBase 內(nèi)置的表, 表是用戶默認使用的命名空間。hbase命名空間存放的都是一些系統(tǒng)配置的表,所以盡量不要對這個命名空間進行操作。
(2)
類似于關(guān)系型數(shù)據(jù)庫的表概念。不同的是,HBase 定義表時只需要聲明列族即可,不需要聲明具體的列。這意味著,往 HBase 寫入數(shù)據(jù)時,字段可以動態(tài)、按需指定即并不是指定了一個列就需要所有row key都要有這個列。因此,和關(guān)系型數(shù)據(jù)庫相比,HBase 能夠輕松應對字段變更的場景。
(3)Row
HBase 表中的每行數(shù)據(jù)都由一個 和多個 (列)組成文件的邏輯結(jié)構(gòu)分為順序文件,數(shù)據(jù)是按照 的字典順序存儲的,并且查詢數(shù)據(jù)時只能根據(jù) 進行檢索,所以 的設(shè)計十分重要。
(4)
HBase 中的每個列都由 (列族)和 (列限定符)進行限定,例如 info:name,info:age(其中info為列族,name或age為列限定符)。建表時,只需指明列族,而列限定符無需預先定義。
(5)Time Stamp
用于標識數(shù)據(jù)的不同版本(),每條數(shù)據(jù)寫入時,如果不指定時間戳,系統(tǒng)會自動為其加上該字段,其值為寫入 HBase 的時間。
(6)Cell
由{, : , time Stamp} 唯一確定的單元。cell 中的數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存貯