HBase簡介

thamsyangsw發表於2014-03-18

參考  http://hbase.apache.org/book.html#_architecture

Architecture

65. Overview

65.1. NoSQL?

HBase是一種"NoSQL"資料庫。“NoSQL”一般指的是非關係型資料庫,我們知道,關係型資料庫支援SQL,也就是說HBase不支援SQL。非關係型資料庫有許多種,BerkeleyDB是一種本地非關係型資料庫,然而,HBase是分散式資料庫。從技術上來講,HBase更像是“Data Store”,而不是“Data Base”,因為它缺少許多關係型資料庫的特性,比如:列型別、輔助索引、觸發器、查詢語言等等。(PS:意思是,從技術的角度講,HBase更像一個資料儲存,而不像資料庫)

HBase叢集擴充套件通過增加RegionServer來實現。如果一個叢集從10擴充套件到20個RegionServer,那麼,不僅僅是儲存容量增加一倍,連處理能力也會增加一倍。對於關係型資料庫而言,也可以用scale做到這樣,但是需要指出的是,這需要特別的硬體和儲存裝置。HBase特性如下:

  • 強一致性讀寫:HBase不是一個“最終一致性”的資料儲存。這使得它更適合高速度的聚集任務。
  • 自動分割槽:HBase的表通過region被分佈在叢集中,而region是自動拆分並重新分佈資料行的。
  • 自動RegionServer容災
  • Hadoop/HDFS整合:HBase支援HDFS作為它的分散式檔案系統
  • MapReduce:HBase支援通過MapReduce基於HBase作為資料來源的大量的並行處理
  • Java Client API:HBase支援通過Java API程式設計的方式來訪問
  • Thrift/REST API:HBase也支援Thrift和REST這樣的非Java的客戶端
  • Block Cache and Bloom Filters
  • Operational Management:HBase提供web介面

65.2. When Should I Use HBase?

並不是所有的問題都適合用HBase

第一、確保你有足夠的資料。如果你有數以億計的資料行,那麼HBase是一個不錯的選擇。如果你只有數千或者百萬的資料,那麼使用傳統的關係型資料庫可能更好,因為事實上你的這些資料可能只需要一個或者兩個節點就能處理得完,這樣的話叢集中的其它的節點就處於空閒狀態。

第二、確保你不需要用到關係型資料庫的特性(比如:固定型別的列、輔助索引、事務、查詢語言等等)。基於關係型資料庫構建的應用不能通過簡單的改變JDBC驅動來傳輸到HBase中。從RDBMS到HBase是完全相反的兩套設計。

第三、確保你有足夠的硬體。因為當DataNode數量小於5的時候HDFS將不能正常工作了。

65.3. What Is The Difference Between HBase and Hadoop/HDFS?

HDFS是一個分散式的檔案系統,適合儲存大檔案,但它不能提供快速的個性化的在檔案中查詢。HBase是構建於HDFS基礎之上的,並且它支援對大表的中的記錄進行快速查詢和更新。HBase內部將資料存放在HDFS中被索引的“StoreFiles”上以供快速查詢。

69. Master

HMaster是Master Server的一個實現。Master Server負責監視叢集中所有的RegionServer例項,並且它也是所有後設資料改變的一個對外介面。在分散式叢集中,典型的Master執行在NameNode那臺機器上。

69.3. Interface

HMasterInterface介面是操作後設資料的主要介面,提供以下操作:

  • Table (createTable, modifyTable, removeTable, enable, disable)
  • ColumnFamily (addColumn, modifyColumn, removeColumn)
  • Region (move, assign, unassign)

70. RegionServer

HRegionServer是RegionServer的實現,它負責服務並管理regions。在分散式叢集中,一個RegionServer通常執行在一個DataNode上。

70.1. Interface

HRegionRegionInterface既包含資料的操作也包含region維護的操作

  • Data (get, put, delete, next, etc.)
  • Region (splitRegion, compactRegion, etc.)

70.5. RegionServer Splitting Implementation

region server處理寫請求,它們被累積在記憶體中一個叫memstore的地方。一旦memstore檔案滿了,內容將被寫到磁碟上作為store file。這個事件叫做memstore flush。隨著store file的不斷累積,RegionServer將合併它們成大檔案,以減少store file的數量。在每次重新整理或者合併以後,region中資料的數量會發生改變。RegionServer根據切分策略來檢視是否region太大了或者應該被切分。

邏輯上,region切分的操作很簡單。找一個合適的位置,將region中的資料切分成兩個新的region。然而,這個處理的過程並不簡單。當切分發生的時候,資料並不是立刻被重寫到這個心建立的女兒region上。

 

 

71. Regions

73. HDFS

Data Model

在HBase中,資料被儲存在表中,有行和列。這些術語和關係型資料有一些重疊,當然這不是一個很好的類比,但是它對我們思考HBase的表示一個多維的map很有幫助。

Table

  由多行組成

Row

  HBase中的行由一個row key和一個或多個列組成。Rows在儲存的時候按照row key的字典序儲存。正因為如此,row key的設計就顯得非常重要。基於這一點,相關連的行相互之間存在附近。通常,row key是一個網站的域名。如果你的row key是域名,你應該以倒置的方式儲存它們(比如:org.apache.www,org.apache.mail,org.apache.jira等等)。這樣的話,所有的apache域名在表中是相近的位置,而不是被子域名的第一部分分開。

Column

  HBase中的列由一個列簇和一個列修飾符組成,它們之間用冒號分隔(:)

Column Family

  列簇由一系列的列和它們的值組成,這是基於效能考慮的。每一個列簇都有一系列的儲存屬性,比如:是否它們的值應該被快取到記憶體中,它們的資料怎樣被壓縮,它們的row key怎樣被編碼,等等。表中的每一行都有相同的列簇,即使一個給定的行在給定的列簇上沒有儲存任何資料。

Column Qualifier

  一個列修飾符被新增到列簇中為了給指定的資料片段提供索引。假設,給定的列簇是content,那麼,一個列修飾符可能是content:html,其它的還有可能是content:pdf。雖然,列簇在表建立的時候就固定了,但是列修飾符是不確定的,而且不同的行可能有不通的列修飾符。

Cell

Timestamp

  一個timestamp被寫在每個value的旁邊,它是一個value的版本修飾符。預設的,timestamp代表資料被RegionServer寫入的時間,你也可以在寫資料的時候指定一個不同的timestamp值

20. Conceptual View

在這個例子中,有一個表叫“webtable”,它包含兩行資料(com.cnn.www和com.example.www)和三個列簇(contents,anchor,people)。對於第一行(com.cnn.www),anchor包含兩列(anchor:cssnsi.com,anchor:my.look.ca),contents包含一列(contents:html)。row key為“com.cnn.www”的行有5個版本,而row key為“com.example.www”的行有1個版本。contents:html列包含整個網站的HTML。

在這個表格中的空的單元格並不佔用空間

下圖是一個模擬,目的在於解釋說明上面我們所說的,便於我們理解:

21. Physical View

雖然,在概念上,表看起來像是一行一行的,但物理上,它們是按照列簇被儲存的。一個新的列修飾符可以在任意時刻被新增到列簇中。

在前面的概念檢視中的空的單元格是不被儲存的。因此,請求contents:html列並且timestamp為t8將返回沒有值。然而,如果不指定timestamp,那麼某個列的大部分值都會被返回。如果指定多個版本,只有找到的第一個會被返回,因為資料是按照timestamp降序儲存的。

22. Namespace

一個名稱空間是表的一個邏輯分組

23. Table

24. Row

行按照row key字典升序儲存

25. Column Family

Columns in Apache HBase are grouped into column families.

列簇中所有的列成員都有相同的字首。例如,列courses:history和courses:math都是courses這個列簇的成員。用冒號分隔列簇和列修飾符。列簇字首必須由可以列印輸出的字元組成。列修飾符可以由任意位元組組成。列簇必須在表被定義的時候就宣告好,因此列就不需要在表建立的時候定義了,並且可以隨時新增。

物理上,所有的列簇成員被儲存在一起。

26. Cells

A {row, column, version} tuple exactly specifies a cell in HBase.

27. Data Model Operations

資料模型有4個主要操作,分別是Get、Put、Scan和Delete。這些操作是應用在表上的。

27.1. Get

返回指定行的屬性

27.2. Put

新增新的行到表中,或者更新已經存在的行

27.3. Scans

掃描特定屬性的多行

27.4. Delete

從表中刪除一行

28. Versions

在HBase中,{row,column,version}可以確定一個單元格。當行和列被壓縮成位元組的時候,版本用long型別指定。在HBase中,版本以降序儲存,所以,最近的值總是最先被發現。

29. Sort Order

對於所有的資料模型操作,HBase以資料被儲存時的順序返回。首先按行排序,其次按列簇,再其次按列修飾符,最後是timestamp。(PS:前是三個是字典升序,最後一個timestamp是降序)

30. Column Metadata

不儲存列的後設資料,因此,HBase可以支援每一行有許多列,行與行之間可以有多種不同的列。

31. Joins

HBase不直接join操作,至少不支援關係型資料庫那種join。在HBase中,讀取資料通過Get和Scan。

33. Schema Creation

34. Table Schema Rules Of Thumb

  • regions的大小在10~50GB之間
  • cells的大小不超過10MB
  • 典型的,每個表的列簇在1~3個之間。HBase的表不應該被設計成模仿關係型資料庫的表
  • 一個有1~2個列簇的表所擁有的regions大約在50~100個左右
  • 保持你的列簇名字儘可能的短

50. HBase as a MapReduce Job Data Source and Data Sink

HBase可以作為MapReduce作業的資料來源。對於讀寫HBase的MapReduce作業,建議使用TableMapper和TableReducer。

如果你執行HBase作為資料來源的MapReduce作業,你需要在配置檔案中指定表和列名。

當你從HBase讀取資料的時候,TableInputFormat請求regions的列表並且作為一個map。

 

54. HBase MapReduce Examples

 

相關文章