天天看點

好程式員大資料學習路線hbase快速入門

好程式員大資料學習路線hbase快速入門Hbase簡介

1.Hbase是什麼

好程式員大資料學習路線hbase快速入門

Apache HBase是Hadoop資料庫,一個分布式的、可伸縮的大資料存儲。

當您需要對大資料進行随機的、實時的讀/寫通路時,請使用Apache HBase。這個項目的目标是在商品硬體的叢集上托管非常大的表——數十億行百萬列的列。Apache HBase是一個開源的、分布式的、版本化的、非關系的資料庫,它模仿了Google的Bigtable:一個結構化資料的分布式存儲系統,就像Bigtable利用Google檔案系統提供的分布式資料存儲一樣,Apache HBase在Hadoop和HDFS上提供了類似于bigtable的功能

1).Hbase的特點

大:一個表可以有數十億行,上百萬列;

無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動态的增加,同一張表中不同的行可以有截然不同的列;

面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;

稀疏:對于空(null)的列,并不占用存儲空間,表可以設計的非常稀疏;

資料多版本:每個單元中的資料可以有多個版本,預設情況下版本号自動配置設定,是單元格插入時的時間戳;

資料類型單一:Hbase中的資料都是字元串,沒有類型。

2).Hbase與關系型資料庫的對比

好程式員大資料學習路線hbase快速入門

傳統行式資料庫:

資料是按行存儲的

沒有索引的查詢使用大量I/O

建立索引和物化視圖需要花費大量時間和資源

面向查詢的需求,資料庫必須被大量膨脹才能滿足性能要求

列式資料庫:

資料是按列存儲-每一列單獨存放

資料即是索引

指通路查詢涉及的列-大量降低系統I/O

每一列由一個線索來處理-查詢的并發處理

 資料類型一緻,資料特征相似-高效壓縮

3).Hbase與HDFS的對比

好程式員大資料學習路線hbase快速入門

兩者都具有良好的容錯性和擴充性,都可以擴充到成百上千個節點;

HDFS适合批處理場景

不支援資料随機查找

不适合增量資料處理

不支援資料更新

2.Hbase的體系結構

好程式員大資料學習路線hbase快速入門

1).Client

 HBase Client使用HBase的RPC機制與HMaster和HRegionServer進行通信,對于管理類操作,Client與HMaster進行RPC;對于資料讀寫類操作,Client與HRegionServer進行RPC。

2).Zookeeper

 Zookeeper Quorum中除了存儲了-ROOT-表的位址和HMaster的位址,HRegionServer也會把自己以Ephemeral方式注冊到 Zookeeper中,使得HMaster可以随時感覺到各個HRegionServer的健康狀态。此外,Zookeeper也避免了HMaster的單點問題。

3).Hmaster

  • 管理使用者對Table的增、删、改、查操作;
  • 管理HRegion Server的負載均衡,調整Region分布;
  • 在Region Split後,負責新Region的配置設定;
  • 在HRegion Server停機後,負責失效HRegion Server 上的Regions遷移。

4).Region

好程式員大資料學習路線hbase快速入門

 當表的大小超過設定值的時候,HBase會自動地将表劃分為不同的區域,每個區域包含所有行的一個子集。對使用者來說,每個表是一堆資料的集合,靠主鍵來區分。從實體上來說,一張表被拆分成了多塊,每一塊就是一個Region。我們用表名+開始/結束主鍵,來區分每一個Region,一個Region會儲存一個表裡面某段連續的資料,從開始主鍵到結束主鍵,一張完整的表格是儲存在多個Region上面。

5).HRegion Server

 所有的資料庫資料一般是儲存在Hadoop HDFS分布式檔案系統上面,使用者通過一系列HRegion Server擷取這些資料,一台機器上面一般隻運作一個HRegion Server,且每一個區段的HRegion也隻會被一個HRegion Server維護。下面是HRegion Server資料存儲關系圖。

好程式員大資料學習路線hbase快速入門

 HRegion Server主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBase中最核心的子產品。

 HRegion Server内部管理了一系列HRegion對象,每個HRegion對應了Table中的一個Region,Region中由多個Store組成。每個Store對應了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,是以最好将具備共同IO特性的column放在一個Column Family中,這樣最高效。

  Store存儲是HBase存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,使用者寫入的資料首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實作是HFile), 當StoreFile檔案數量增長到一定門檻值,會觸發Compact合并操作,将多個StoreFiles合并成一個StoreFile,合并過程中會進行版本合并和資料删除,是以可以看出HBase其實隻有增加資料,所有的更新和删除操作都是在後續的compact過程中進行的,這使得使用者的寫操作隻要進入記憶體中就可以立即傳回,保證了HBase I/O的高性能。當StoreFiles Compact後,會逐漸形成越來越大的StoreFile,當單個StoreFile大小超過一定門檻值後,會觸發Split操作,同時把目前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster配置設定到相應的HRegionServer 上,使得原先1個Region的壓力得以分流到2個Region上。下圖描述了Compaction和Split的過程。

好程式員大資料學習路線hbase快速入門

   圖 Compaction和Split的過程

 在了解了上述HStore的基本原理後,還必須了解一下HLog的功能,因為上述的HStore在系統正常工作的前提下是沒有問題的,但是在分布式系統環境中,無法避免系統出錯或者當機,是以一旦HRegion Server意外退出,MemStore中的記憶體資料将會丢失,這就需要引入HLog了。每個HRegion Server中都有一個HLog對象,HLog是一個實作Write Ahead Log的類,在每次使用者操作寫入MemStore的同時,也會寫一份資料到HLog檔案中(HLog檔案格式見後續),HLog檔案定期會滾動出新的,并删除舊的檔案(已持久化到StoreFile中的資料)。當HRegion Server意外終止後,HMaster會通過Zookeeper感覺到,HMaster首先會處理遺留的 HLog檔案,将其中不同Region的Log資料進行拆分,分别放到相應region的目錄下,然後再将失效的region重新配置設定,領取到這些region的HRegion Server在Load Region的過程中,會發現有曆史HLog需要處理,是以會Replay HLog中的資料到MemStore中,然後flush到StoreFiles,完成資料恢複。

6).Hbase的存儲格式

 HBase中的所有資料檔案都存儲在Hadoop HDFS檔案系統上為例,主要包括上述提出的兩種檔案類型:HFile, HBase中KeyValue資料的存儲格式,HFile是Hadoop的二進制格式檔案,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile。HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,實體上是Hadoop的Sequence File。

7).ROOT表和META表

 使用者表的Regions中繼資料被存儲在.META.表中,随着Region的增多,.META.表中的資料也會增大,并分裂成多個Regions。為了定位.META.表中各個Regions的位置,把.META.表中所有Regions的中繼資料儲存在-ROOT-表中,最後由ZooKeeper記錄-ROOT-表的位置資訊。所有用戶端通路使用者資料前,需要首先通路ZooKeeper獲得-ROOT-的位置,然後通路-ROOT-表獲得.META.表的位置,最後根據.META.表中的資訊确定使用者資料存放的位置,如下圖所示。

好程式員大資料學習路線hbase快速入門

 -ROOT-表永遠不會被分割,它隻有一個Region,這樣可以保證最多需要三次跳轉就可以定位任意一個Region。為了加快通路速度,.META.表的Regions全部儲存在記憶體中。用戶端會将查詢過的位置資訊緩存起來,且緩存不會主動失效。如果用戶端根據緩存資訊還通路不到資料,則詢問隻有相關.META.表的Region伺服器,試圖擷取資料的位置,如果還是失敗,則詢問-ROOT-表相關的.META.表在哪裡。最後,如果前面的資訊全部失效,則通過ZooKeeper重新定位Region的資訊。是以如果用戶端上的緩存全部是失效,則需要進行6次網絡來回,才能定位到正确的Region。

好程式員大資料學習路線hbase快速入門

8).MapReduce On HBase

 在HBase系統上運作批處理運算,最友善和實用的模型依然是MapReduce,如下圖:

好程式員大資料學習路線hbase快速入門

 HBase Table和Region的關系,比較類似HDFS File和Block的關系,HBase提供了配套的TableInputFormat和TableOutputFormat API,可以友善的将HBase Table作為Hadoop MapReduce的Source和Sink,對于MapReduce Job應用開發人員來說,基本不需要關注HBase系統自身的細節。

3.HBase資料模型

好程式員大資料學習路線hbase快速入門

 以關系型資料的思維下會感覺,上面的表格是一個5列4行的資料表格,但是在HBase中這種了解是錯誤的,其實在HBase中上面的表格隻是一行資料;

1).Row Key:

 – 決定一行資料的唯一辨別

 – RowKey是按照字典順序排序的。

 – Row key最多隻能存儲64k的位元組資料。

2).Column Family列族(CF1、CF2、CF3) & qualifier列:

 – HBase表中的每個列都歸屬于某個列族,列族必須作為表模式(schema) 定義的一部分預先給出。如create ‘test’, ‘course’;

 – 列名以列族作為字首,每個“列族”都可以有多個列成員(column,每個列族中可以存放幾千~上千萬個列);如 CF1:q1, CF2:qw,

 新的列族成員(列)可以随後按需、動态加入,Family下面可以有多個Qualifier,是以可以簡單的了解為,HBase中的列是二級列,

 也就是說Family是第一級列,Qualifier是第二級列。兩個是父子關系。

 – 權限控制、存儲以及調優都是在列族層面進行的;

 – HBase把同一列族裡面的資料存儲在同一目錄下,由幾個檔案儲存。

 – 目前為止HBase的列族能能夠很好處理最多不超過3個列族。

3).Timestamp時間戳:

 – 在HBase每個cell存儲單元對同一份資料有多個版本,根據唯一的時間 戳來區分每個版本之間的差異,不同版本的資料按照時間倒序排序,

 最新的資料版本排在最前面。

 – 時間戳的類型是64位整型。

 – 時間戳可以由HBase(在資料寫入時自動)指派,此時時間戳是精确到毫 秒的目前系統時間。

 – 時間戳也可以由客戶顯式指派,如果應用程式要避免資料版本沖突, 就必須自己生成具有唯一性的時間戳。

4).Cell單元格:

 – 由行和列的坐标交叉決定;

 – 單元格是有版本的(由時間戳來作為版本);

 – 單元格的内容是未解析的位元組數組(Byte[]),cell中的資料是沒有類型的,全部是位元組碼形式存貯。

 • 由{row key,column(= +),version}唯一确定的單元。

4.Hbase應用介紹

  • –列族結構經常調整
  • –高并發寫入
  • –結構化資料、半結構化資料存儲
  • –Key-Value存儲
  • –有序存儲
  • –固定集合(多版本)
  • –定時删除記錄(TTL)

繼續閱讀