日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《HBase权威指南》学习总结

發(fā)布時(shí)間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《HBase权威指南》学习总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Hbase學(xué)習(xí)總結(jié)

1.HBase概述及部分存儲(chǔ)知識(shí)概述:

架構(gòu)簡介:

簡述: Hbase基于hadoop的HDFS系統(tǒng),其文件存儲(chǔ)都是存儲(chǔ)在HDFS上的。由上圖看到HBase主要處理兩種文件:一種是預(yù)寫日志(Write-Ahead Log,WAL)即圖中的HLog。另一種文件是實(shí)際的數(shù)據(jù)文件HFile(HFile本事就是HDFS的文件,文件格式遵循HBase可導(dǎo)入的格式)。預(yù)寫日志W(wǎng)AL是可開關(guān)的,器主要保障數(shù)據(jù)的穩(wěn)定性。當(dāng)機(jī)器結(jié)點(diǎn)掛掉,可以通過回放日志達(dá)到數(shù)據(jù)恢復(fù)的目的。
HBase中最核心的HRegion模塊如下圖:


簡述:上圖就是HRegionServer的具體的系統(tǒng)的架構(gòu)。具體的關(guān)系一目了然。各個(gè)部件的主要功能如下: HMaster:
HMaster沒有單點(diǎn)問題,HBase中可以啟動(dòng)多個(gè)HMaster,通過Zookeeper的Master Election機(jī)制保證總有一個(gè)Master在運(yùn)行,主要負(fù)責(zé)Table和Region的管理工作:
(1)管理用戶對表的增刪改查操作
(2)管理HRegionServer的負(fù)載均衡,調(diào)整Region分布
(3)Region Split后,負(fù)責(zé)新Region的分布
(4)在HRegionServer停機(jī)后,負(fù)責(zé)失效HRegionServer上Region遷移

Client:
(1)使用HBase RPC機(jī)制與HMaster和HRegionServer進(jìn)行通信
(2)Client與HMaster進(jìn)行通信進(jìn)行管理類操作
(3)Client與HRegionServer進(jìn)行數(shù)據(jù)讀寫類操作

Zookeeper:
(1)Zookeeper Quorum存儲(chǔ)-ROOT-表地址、HMaster地址
(2)HRegionServer把自己以Ephedral方式注冊到Zookeeper中,HMaster隨時(shí)感知各個(gè)HRegionServer的健康狀況
(4)Zookeeper避免HMaster單點(diǎn)問題 ps:HRegionServer管理一些列HRegion對象;每個(gè)HRegion對應(yīng)的Table中一個(gè)Region,HRegion有多個(gè)HStore組成;每個(gè)HStore對應(yīng)Table中一個(gè)Column Family的存儲(chǔ);

2.存儲(chǔ)架構(gòu):

HBase的存儲(chǔ)系統(tǒng)簡單描述一下,HBase和BigTable(BigTable的論文如下:http://box.cloud.taobao.com/file/downloadFile.htm?shareLink=1G0bDlGn)一樣,都是基于LSM樹的系統(tǒng)。
下面簡述一下LSM樹:
在LSM樹系統(tǒng)中:輸入數(shù)據(jù)首先被存儲(chǔ)在日志文件,這些文件內(nèi)的數(shù)據(jù)完全有序。當(dāng)有日志文件被修改時(shí),對應(yīng)的更新會(huì)被保存在內(nèi)存中來加速查詢。從宏觀上來說,LSM樹原理是把一個(gè)大樹拆分成N棵小樹,它首先寫入內(nèi)存中,對著小樹越來越大,內(nèi)存中的小樹會(huì)flush到磁盤中,磁盤定期可以做merge操作,合并成一棵大樹,以優(yōu)化讀性能。
附稿:
BigTable論文中關(guān)鍵信息總結(jié):

2.1 Bigtable是一個(gè)分布式的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)系統(tǒng),他被設(shè)計(jì)用來處理海量數(shù)據(jù):通常是分布在數(shù)千臺(tái)普通服務(wù)器上的PB級數(shù)據(jù)。<br> 2.2 列族:列關(guān)鍵字組成的集合叫做“列族”,列族是訪問控制的基本單位。存放在同一列族下的所有數(shù)據(jù)通常都屬于同一個(gè)類型(我們可以把同一個(gè)列族下的數(shù)據(jù)壓縮在一起)。<br> 2.3 列族創(chuàng)建后,其中的任何一個(gè)列關(guān)鍵字都可以存放數(shù)據(jù)。根據(jù)我們的設(shè)計(jì)意圖,一張表中的列族不能太多(最多幾百個(gè)),并且列族在運(yùn)行期間很少改變。與之對應(yīng)的,一張表可以由無限多個(gè)列。<br> 2.4 時(shí)間戳:在BigTable中,表的每個(gè)數(shù)據(jù)項(xiàng)都可以包含同一份數(shù)據(jù)的不同版本;不同版本的數(shù)據(jù)通過時(shí)間戳來索引。BigTable時(shí)間戳的類型是64位整型。BigTable可以給時(shí)間戳賦值,用來表示精確到毫秒的“實(shí)時(shí)”時(shí)間;用戶程序也可以給時(shí)間賦值。如果應(yīng)用程序需要避免數(shù)據(jù)版本沖突,那么必須自己生成具有唯一性的時(shí)間戳。數(shù)據(jù)項(xiàng)中,不同版本的數(shù)據(jù)按照時(shí)間戳倒敘排序,及最新的數(shù)據(jù)排在最前面。<br> 2.5 BigTable支持單行上的事物處理,利用這個(gè)功能,用戶可以對存在一個(gè)行關(guān)鍵字下的數(shù)據(jù)進(jìn)行原子性的讀-寫-更新 操作。雖然BigTable提供了一個(gè)允許用戶跨行批量寫入的數(shù)據(jù)的接口,但是,BigTable目前還不支持通用的跨行事物處理。<br> 2.6 BigTable是建立在其他的幾個(gè)Google基礎(chǔ)構(gòu)件上的。BigTable使用Google的分布式文件系統(tǒng)(GFS)存儲(chǔ)日志文件和數(shù)據(jù)文件。<br> 2.7 BigTable內(nèi)部存儲(chǔ)數(shù)據(jù)的文件是Google SSTable格式的。SSTable是一個(gè)持久化的、排序的、不可更改的Map結(jié)構(gòu),而Map是一個(gè)key-value映射數(shù)據(jù)結(jié)構(gòu),key和value的值都是任意的Byte串。 2.8 BigTable還依賴一個(gè)高可用的,序列化的分布式鎖組件,叫做Chubby。(對應(yīng)apache的zookeeper)。<br> 2.9 Bigtable包括了三個(gè)主要的組件:鏈接到客戶程序中的庫、一個(gè)Master服務(wù)器和多個(gè)Tablet服務(wù)器。針對系統(tǒng)工作負(fù)載的變化情況,BigTable可以動(dòng)態(tài)的向集群中添加(或者刪除)Tablet服務(wù)器。<br> 2.10 Bloom過濾器(又叫:布隆過濾器):它實(shí)際上是一個(gè)很長的二進(jìn)制矢量和隨機(jī)映射函數(shù)。布隆過濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的有點(diǎn)是空間效率和查詢時(shí)間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難。<br>

3.WAL:WAL是標(biāo)準(zhǔn)的Hadoop SequenceFile,并且存儲(chǔ)了HLogKey實(shí)例。這些鍵包括序列號和實(shí)際數(shù)據(jù),所以在服務(wù)器崩潰時(shí)可以回滾還沒有持久化的數(shù)據(jù)。
ps:一旦數(shù)據(jù)被寫入WAL中,數(shù)據(jù)就會(huì)被放到MemStore中。同時(shí)還會(huì)檢查Memstore是否已經(jīng)滿了,如果滿了,就會(huì)被請求刷寫到磁盤中去。
4.Table&Region:(1)Table隨著記錄增多不斷變大,會(huì)自動(dòng)分裂成多份Splits,成為Regions。(2)一個(gè)region由[startkey,endkey)表示。(3)不同region會(huì)被Master分配給相應(yīng)的RegionServer進(jìn)行管理。
5.數(shù)據(jù)訪問結(jié)構(gòu):
?首先會(huì)有zookeeperfile獲取-ROOT-結(jié)點(diǎn)的地址,-ROOT-是一張?zhí)厥獾谋?#xff0c;并且只會(huì)存在一個(gè)Region上,記錄著.META.表的位置,.META.用戶表的region信息,.META.本身可以橫跨多個(gè)Region。客戶請求獲取地址信息的過程,就是這樣一個(gè)樹狀結(jié)構(gòu),逐級請求。
6.HBase的一個(gè)特殊的功能是,能為一個(gè)單元格(一個(gè)特定列的值)存儲(chǔ)多個(gè)版本的數(shù)據(jù)。這是通過每個(gè)版本使用一個(gè)時(shí)間戳。并且按照降序存儲(chǔ)來實(shí)現(xiàn)的。每個(gè)時(shí)間戳是一個(gè)長整型值,以毫秒為單位。

2.客戶端API:

  • Hbase客戶端簡單的CRUD操作:
    (1) put方法,一類作用于單行,另一類作用于多行。 ps:當(dāng)每一次不指定時(shí)間戳調(diào)用Put類的add方法時(shí),Put實(shí)例會(huì)使用來自構(gòu)造函數(shù)的可選的時(shí)間戳參數(shù)(也稱作ts),如果用戶在構(gòu)造Put實(shí)例時(shí)也沒有時(shí)間指定時(shí)間戳,則時(shí)間戳將會(huì)有Region服務(wù)器設(shè)定。
    (2) 原子性的put操作(compare-and-set):

    接口實(shí)例: boolean checkAndPut(byte[] row,byte[] family,byte[] qualifier,byte[] value,Put put) throws IOException

    (3) get方法:
    I.get方法分為兩類,一類是一次獲取一行數(shù)據(jù);另一類是一次獲取多行數(shù)據(jù)。獲取數(shù)據(jù)時(shí)可以獲取一個(gè)或多個(gè)列族的數(shù)據(jù),也可以指定獲取的列族內(nèi)數(shù)據(jù)的特定的列。或者指定時(shí)間戳范圍或者版本數(shù)目進(jìn)行查詢。
    II.獲取多行數(shù)據(jù)get方法的方法簽名如下:

    Result[] get(List<Get> gets) throws IOException

    ps:用戶可以一次請求獲取多行數(shù)據(jù)。它允許用戶快速高效地從遠(yuǎn)程服務(wù)器獲取相關(guān)的或完全隨機(jī)的多行數(shù)據(jù)。
    (4) exists方法通過RPC驗(yàn)證請求的數(shù)據(jù)是否存在,但不會(huì)從遠(yuǎn)程服務(wù)器返回請求的數(shù)據(jù),只返回一個(gè)布爾值表示這個(gè)結(jié)果。

    方法簽名如下: boolean exists(Get get) throws IOException

    ps:用戶通過這種方法只能避免網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)拈_銷,不過需要檢查或頻繁檢查一個(gè)比較大的列時(shí),這種方法還是十分實(shí)用的。 (5) Delete 方法:
    Delete方法可以刪除一列中特定的版本,一列中全部版本,給定版本或更舊的版本,刪除整個(gè)列族,或者刪除列族中所有列的給定版本或更舊的版本。
    另外和Put方法類似,也可以刪除一個(gè)Delete列表對象:
    接口如下:

    void delete(List<Delete> deletes) throws IOException

    (5) 原子性操作 compare-and-delete:
    方法簽名如下:

    boolean checkAndDelete(byte[] row,byte[] family,byte[] qualifier,byte[] value,Delete delete) throws IOException

    (6) 批量操作:
    上面總結(jié)了對Hbase單行的操作,Hbase還提供了批量操作的接口,可以對多行進(jìn)行操作,并且可以實(shí)現(xiàn)多行的Put,Get或Delete操作。
    方法簽名如下:

    void batch(List<Row> actions,Object[] results) throws IOException,InterruptedException Object[] batch(List<Row> actions) throws IOException,InterruptedException

    (7) 數(shù)據(jù)掃描 Scan:
    顧名思義Scan操作能掃描遍歷Hbase數(shù)據(jù)庫中的數(shù)據(jù),掃描器的獲取通過 HTable.getScanner()獲取,此方法返回真正的掃描器實(shí)例的同時(shí),用戶也可以使用它迭代獲取數(shù)據(jù),方法簽名如下:

    ResultScanner getScanner(Scan scan) throws IOException ResultScanner getScanner(byte[] family) throws IOException ResultScanner getScanner(byte[] family,byte[] qualifier) throws IOException

    同時(shí)Scan類擁有以下構(gòu)造器:

    Scan() Scan(byte[] startRow,Filter filter) Scan(byte[] startRow) Scan(byte[] startRow,byte[] stopRow)

    (8) ResultScanner:
    掃描操作一次可能請求大量的行,如果全部返回可能占用大量的內(nèi)存和帶寬,ResultScanner把掃描操作轉(zhuǎn)換為類似get操作,將每一行數(shù)據(jù)封裝成一個(gè)Result實(shí)例。
    ResultScanner的一些方法如下:

    Result next() throws IOException Result[] next(int nbRows) throws IOException void close()

    2.過濾器:
    Hbase過濾器(filter)提供了非常強(qiáng)大的特性來幫助用戶提高其處理表中數(shù)據(jù)的效率。用戶不僅可以使用Hbase中預(yù)定義好的過濾器,而且可以實(shí)現(xiàn)自定義的過濾器。
    Get和Scan兩個(gè)類都支持過濾器,理由如下:這類對象不能對行鍵、列名或列值進(jìn)行過濾,但是通過過濾器可以達(dá)到這個(gè)目的。除了Hbase內(nèi)置的filter外,用戶可以實(shí)現(xiàn)Filter接口來自定義需求。所有過濾器都在服務(wù)器端生效,叫做謂詞下推。

  • (1)比較過濾器 CompareFilter:
    方法簽名:

    CompareFilter(CompareOp valueCompareOp,WritableByteArrayComparable valueComparator)

    用戶使用時(shí)需要傳入操作符,和待比較的值,比如大于或小于多少才從服務(wù)器端返回?cái)?shù)據(jù)。
    (2)行過濾器 RowFilter:
    方法簽名:

    RowFilter(CompareOp valueCompareOp,BinaryComparator rowkey)

    可以過濾大于、小于或等于指定行鍵的數(shù)據(jù)。
    (3)列族過濾器(FamilyFilter):
    方法簽名和行過濾器類似:

    FamilyFilter(CompareOp valueCompareOp,BinaryComparator rowkey)

    用來過濾滿足條件的列族。
    (4)值過濾器(ValueFilter):
    方法簽名:

    ValueFilter(CompareOp valueCompareOp,BinaryComparator value)

    用來過濾滿足條件的列值。
    (5)參考過濾器(DependentColumnFilter):
    簡述:這個(gè)是一種特殊的過濾器,這個(gè)過濾器的比較傳入的參考值不再是指定的常量,而是相對于Hbase自身的某一行做比較。
    方法簽名如下:

    DependentColumnFilter(byte[] family,byte[] qualifiter)

    方法參數(shù)分別是參考列的列族和列名,如果某列和該列含有不同的時(shí)間戳,則被丟棄掉。
    +++ DependentColumnFilter(byte[] family,byte[] qualifiter,boolean dropDependentColumn) 這個(gè)方法和上面的方法類似,只不過增加了一個(gè)布爾值定義是否包含參考咧。 +++

    DependentColumnFilter(byte[] family,byte[] qualifiter,boolean dropDependentColumn,CompareOp valueCompareOp,WritableByteArrayComparable valueComparator)

    這個(gè)方法定義了所有列和指定列的值的比較。 這個(gè)過濾器從參數(shù)名稱上不太好理解,可以參考官網(wǎng)的wiki(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/DependentColumnFilter.html)
    (6)單列值過濾器(SingleColumnValueFilter):
    簡述:用戶針對如下情況是可以使用該過濾器:用一列的值決定是否一行數(shù)據(jù)被過濾。首先設(shè)定待檢查的列,然后設(shè)置待檢查的列的對應(yīng)值。方法簽名如下:

    SingleColumnValueFilter(byte[] family,byte[] qualifiter,CompareOp compareOp,byte[] byte[] value)

    (7)單列值排除過濾器(SingleColumnValueExcludeFilter):
    簡述:單列值排除過濾器集成自SingleColumnValueFilter,經(jīng)過拓展后提供一種略微不同的語意:參考列不被包括在結(jié)果中。
    (8)前綴過濾器(PrefixFilter):
    簡述:當(dāng)構(gòu)造當(dāng)前過濾器時(shí)傳入一個(gè)前綴,所有與前綴匹配的行都會(huì)被返回客戶端。構(gòu)造函數(shù)如下:

    public PrefixFilter(byte[] prefix)

    (9)分頁過濾器(PageFilter):
    簡述:用戶可以使用這個(gè)過濾器對結(jié)果按行分頁。當(dāng)用戶創(chuàng)建當(dāng)前過濾器實(shí)例時(shí)需要指定pagesize參數(shù),這個(gè)參數(shù)可以控制每頁返回的行數(shù)。
    實(shí)例代碼如下:

    Filter filter = new PageFilter(15)int totalRows = 0;byte[] lastRow = null;while(true) {Scan scan = new Scan();scan.setFilter(filter);if(lastRow != null) {byte[] startRow = Bytes.add(lastRow,POSTFIX);scan.setStartRow(startRow);}ResultScanner scanner = table.getScanner(scan);int localRows = 0;Result result;while((result = scanner.next()) != null) {totalRows++;lastRow = result.getRow();}scanner.close();if(localRows == 0) {break;}}

    ps:Hbase中的行鍵是按字典序排列的,因此返回的結(jié)果也是如此排序的,并且起始行是被包括在結(jié)果中的。

    (10)行鍵過濾器(KeyOnlyFilter):
    簡述:在一些應(yīng)用中只需要將結(jié)果中的KeyValue中的鍵返回,而不需要返回實(shí)際的數(shù)據(jù)。利用這個(gè)過濾器可以實(shí)現(xiàn)這個(gè)目的。

    (11)首次行鍵過濾器(FirstKeyOnlyFilter):
    簡述:這個(gè)類使用了過濾器框架提供的另一個(gè)優(yōu)化特性:他在檢查完第一列之后會(huì)通知region服務(wù)器結(jié)束對當(dāng)前列的掃描,并跳到下一行,與全表掃描相比,其性能得到了提升。
    這種過濾器通常在行數(shù)統(tǒng)計(jì)(row counter)的應(yīng)用場景中使用。具體使用參考blog:http://blog.csdn.net/liuxiaochen123/article/details/7878580?

    (12)包含結(jié)束過濾器(InclusiveStopFilter):
    簡述:掃描操作中的開始行被包含在結(jié)果中,但終止行被排除在外。使用這個(gè)過濾器是,用戶也可以將結(jié)束行包含到結(jié)果中。

    (13)時(shí)間戳過濾器(TimeStampsFilter):
    簡述:當(dāng)用戶需要在掃描結(jié)果中對版本進(jìn)行細(xì)粒度的控制時(shí),這個(gè)過濾器可以滿足需求。用戶需要傳入一個(gè)裝載了時(shí)間戳list實(shí)例。

    (14)列計(jì)數(shù)過濾器(ColumnCountGetFilter):
    簡述:用戶可以使用這個(gè)過濾器來限制每行最多取回多少列。當(dāng)一行列的列數(shù)達(dá)到設(shè)定的最大值時(shí),這個(gè)過濾器會(huì)停止這個(gè)掃描操作,所以它不太適合掃描操作,反而比較適合在get()方法中使用。

    (15)列前綴過濾器(ColumnPrefixFilter):
    簡述:類似于PrefixFilter,這個(gè)過濾器通過列名稱進(jìn)行前綴匹配過濾。用戶需要指定一個(gè)前綴來創(chuàng)建過濾器。所有與設(shè)定前綴匹配的列都會(huì)包含在結(jié)果中。

    (16)隨機(jī)行過濾器(RandomRowFilter):
    簡述:這個(gè)過濾器可以讓結(jié)果中包含隨機(jī)的行。構(gòu)造函數(shù)需要傳入?yún)?shù)chance,chance取值區(qū)間在0.0和1.0之間。其內(nèi)部實(shí)現(xiàn)原理用到了java 的 Random.nextFloat,當(dāng)chance取負(fù)數(shù)時(shí),將包含排除所有的行,但取值大于1.0時(shí),將包含所有的行。

    (17)跳轉(zhuǎn)過濾器(SkipFilter):
    簡述:這個(gè)過濾器包裝了一個(gè)用戶提供的過濾器,當(dāng)被包裝的過濾器遇到一個(gè)需要過濾的KeyValue實(shí)例時(shí),用戶可以拓展并過濾掉整行數(shù)據(jù)。換句話說,當(dāng)過濾器發(fā)現(xiàn)某一行中的一列需要過濾時(shí),那么整行數(shù)據(jù)將被過濾掉。

    (18)全匹配過濾器(WhileMatchFilter):
    簡述:當(dāng)被過濾的數(shù)據(jù)中,遇到一行不匹配時(shí),則放棄整個(gè)過濾操作。即列匹配才會(huì)繼續(xù)執(zhí)行,遇到不匹配的列則中斷執(zhí)行(估計(jì)也是性能優(yōu)化點(diǎn))。

    (19)FilterList:
    簡述:實(shí)際應(yīng)用中,用戶可能需要多個(gè)過濾器共同限制返回到客戶端的結(jié)果,FilterList(過濾器列表)提供了這項(xiàng)功能。

    (20)自定義過濾器:
    簡述:最后,用戶可能需要按各自的需求實(shí)現(xiàn)自定義過濾器。用戶可以實(shí)現(xiàn)Filter接口或者直接繼承FilterBase類,后者已經(jīng)為接口中所有成員方法提供了默認(rèn)實(shí)現(xiàn)。

    ps:過濾器設(shè)在在Scan和Get對象當(dāng)中,具體過濾器的執(zhí)行全部多事在服務(wù)端執(zhí)行,用以減少服務(wù)端和客戶端的網(wǎng)絡(luò)IO。

    3.計(jì)數(shù)器:
    Hbase內(nèi)部提供了計(jì)數(shù)器,可以用來統(tǒng)計(jì)Hbase表的一些信息,例如:用于記錄某個(gè)列值的個(gè)數(shù)。

    4.客戶端管理API:
    除了進(jìn)行數(shù)據(jù)處理的客戶端API,HBase還提供了數(shù)據(jù)描述的API,類似于傳統(tǒng)RDBMS中的DDL和DML。因?yàn)樯a(chǎn)環(huán)境,作為基于Hbase的開發(fā)人員基本無法獲取HBaseAdmin的管理權(quán)限,針對DDL和DML的API就不詳細(xì)介紹了,這部分內(nèi)容了解一下就可以了。

    3.HBase涉及的技術(shù)亮點(diǎn):

  • Hbase的一個(gè)特殊功能是,能為一個(gè)單元格(一個(gè)特定列的值)存儲(chǔ)多個(gè)版本的數(shù)據(jù)。這是通過每個(gè)版本使用一個(gè)時(shí)間戳。并且按照降序存儲(chǔ)來實(shí)現(xiàn)的。每個(gè)時(shí)間戳是一個(gè)長整型值,以毫秒為單位。
  • KeyValue實(shí)例代表了一個(gè)唯一的數(shù)據(jù)單元格,類似于一個(gè)協(xié)調(diào)系統(tǒng),該系統(tǒng)使用行鍵、列族、列限定符、時(shí)間戳指向一個(gè)單元格的值。KeyValue是Hbase在存儲(chǔ)架構(gòu)中最低層的類。
  • 行鎖:像put(),delete(),checkAndPut()這樣的修改操作是獨(dú)立執(zhí)行的,這意味著在一個(gè)串行的方式的執(zhí)行中,對于每一行必須保證行級別的操作是原子性的。region提供了一個(gè)行鎖(row lock)的特性,這個(gè)特性保證了只有一個(gè)客戶端能獲取一行數(shù)據(jù)相應(yīng)的鎖,同時(shí)對改行進(jìn)行修改。
  • Hbase作為KeyValue的結(jié)構(gòu)存儲(chǔ),以rowkey的字典序進(jìn)行排序。
  • Hbase作為一個(gè)列數(shù)據(jù)庫,其也和其他數(shù)據(jù)庫一樣,為了提高性能,再起服務(wù)端提供了一個(gè)連接池HTablePool來管理連接。
  • 事物:HBase本身也提供了事物的支持,有如下幾個(gè)項(xiàng)目用來支持HBase的事物:
    (1)事物型HBase:帶索引的事物型HBase項(xiàng)目有一些取代默認(rèn)客戶端類和服務(wù)端類的擴(kuò)展類,它們增加了跨行跨表的事物支持。在Region服務(wù)器中,更準(zhǔn)確的說,每個(gè)Region都保持了一個(gè)事物的列表。該列表是有beginTransaction()調(diào)用初始化,并且相應(yīng)的commit()調(diào)用結(jié)束。每次讀寫操作都有一個(gè)事物ID,以保護(hù)調(diào)用不受其他事物影響。
    (2)用Zookeeper來維持事物:Zookeeper也提供了一個(gè)能夠被用于實(shí)現(xiàn)兩階段提交的事務(wù)鎖解決方案。
    7.布隆過濾器(Bloom Filter):布隆過濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難。布隆過濾器的原理是Hash表,其用Hash函數(shù)將某個(gè)元素映射成位列陣中的某個(gè)點(diǎn),用以高效的識(shí)別集合是否包含這個(gè)元素。而HBase中也內(nèi)置了布隆過濾器的功能,例如可以快速的判斷某個(gè)列簇文件中是否包含某個(gè)值。
  • 8.Bulkload數(shù)據(jù)導(dǎo)入,HBase提供了Bulkload數(shù)據(jù)導(dǎo)入的方式,可以通過Hbase自帶的工具和利用其API自己寫MR的方式將HDFS文件轉(zhuǎn)換成HFILE的文件格式,其實(shí)其還是HDFS文件,不過文件格式變成了HBase的存儲(chǔ)文件,然后通過其load API就能導(dǎo)入到數(shù)據(jù)庫中。
    Hfile文件格式如下圖:

    ps:可見其存儲(chǔ)都是keyvalue的形式,還沒完全包明白暫時(shí)不詳細(xì)總結(jié)了。

    HBase內(nèi)置的用于生成HFILE的API是:org.apache.hadoop.hbase.mapreduce.ImportTsv
    具體的調(diào)用方式如下:

    $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \-Dimporttsv.bulk.output=$HFILE_PATH \-Dimporttsv.separator=$SEPARATER \-Dimporttsv.columns=$COLUMNS $TABLE_NAME $HDFS_PATH

    ps: HFILEPATH:就是生成的Hfile的存儲(chǔ)路徑。SEPATATER就是數(shù)據(jù)行的分隔符。COLUMNS就是需要導(dǎo)入的列名,這個(gè)比較講究,這個(gè)是根據(jù)HDFS的列的數(shù)據(jù)來定義的,比如寫成:HBASEROW_KEY,cf:value1,cf:value2 就表示HDFS的第一列作為ROWKEY,這個(gè)HBASEROWKEY是約定好的關(guān)鍵字,這個(gè)關(guān)鍵字放在什么位置就表示HDFS的第幾列作為rowkey,同時(shí)也就要求被轉(zhuǎn)換的HDFS文件必須某一列可以作為rowkey(可能需要預(yù)處理)。然后cf就是列族,value就是對應(yīng)的列名。

    總結(jié)

    以上是生活随笔為你收集整理的《HBase权威指南》学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。