HBase 入門爲什麼可以這麼簡單?

一、大數據及 NoSQL 的前世今生


在大數據技術如火如荼的今天,所有大數據挖掘及分析平臺技術中作爲海量數據操作及高客戶端併發解決方案的 NoSQL 技術,特別是 HBase 想必大家都不再陌生。

一直以來傳統的關係數據庫基於全面的 ACID 保證,用於數據存儲和維護有關問題的解決方案,但是受制於越來越多的業務系統需要能適應不同種類的數據格式和數據源,經常是非結構化的或者半結構化的(如用戶訪問網站的日誌),並且又是高几個數量級的數據( TB 及 PB 規模級別),傳統關係型數據庫難免有些力不從心。

於是基於系統需求發生了巨大變化,數據技術的先驅們不得不重新設計數據庫,基於大數據的 NoSQL 的曙光就這樣出現了。

大數據及 NoSQL 的使用首先在 google、facebook 等互聯網公司,隨後是金融、電信行業,衆多 Hadoop&NoSQL 的開源大數據項目如雨後春筍般發展,被互聯網等公司用於處理海量和非結構化類型的數據。

Hbase 被設計來處理 TB 到 PB 級的數據,並針對該類海量數據和高併發訪問做了優化,作爲 Hadoop 生態系統的一部分,它依賴 Hadoop 其他組件提供的重要功能,如 DataNode 數據冗餘和 MapReduce 批處理。

二、HBase 概述

HBase 是 BigTable 的開源(源碼使用 Java 編寫)版本。是 Apache Hadoop 的數據庫,是建立在 HDFS 之上,被設計用來提供高可靠性、高性能、列存儲、可伸縮、多版本的 NoSQL 的分佈式數據存儲系統,實現對大型數據的實時、隨機的讀寫訪問。

HBase 是一個領先的 NoSQL 數據庫

三、關係型數據庫 和 非關係型數據庫的典型代表

0jwB35

四、HBase 這個 NoSQL 數據庫的要點

① 它介於 NoSQL 和 RDBMS 之間,僅能通過主鍵 (rowkey) 和主鍵的 range 來檢索數據

② HBase 查詢數據功能很簡單,不支持 join 等複雜操作

③ 不支持複雜的事務,只支持行級事務 (可通過 hive 支持來實現多表 join 等複雜操作)。

HBase 中支持的數據類型:byte[](底層所有數據的存儲都是字節數組)

五、結構化、半結構化和非結構化

結構化:數據結構字段含義確定,清晰,典型的如數據庫中的表結構。

半結構化:具有一定結構,但語義不夠確定,典型的如 HTML 網頁,有些字段是確定的 (title), 有些不確定 (table)。

非結構化:雜亂無章的數據,很難按照一個概念去進行抽取,無規律性

與 Hadoop 一樣,HBase 目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加 計算和存儲能力。

六、HBase 中的表特點

1、大:一個表可以有上十億行,上百萬列。

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

3、稀疏:對於爲空 (null) 的列,並不佔用存儲空間,因此,表可以設計的非常稀疏。

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

七、HBase 表結構邏輯視圖

初次接觸 HBase,可能看到以下描述會懵:“基於列存儲”,“稀疏 MAP”,“RowKey”,“ColumnFamily”。

其實沒那麼高深,我們需要分兩步來理解 HBase, 就能夠理解爲什麼 HBase 能夠 “快速地”“分佈式地” 處理 “大量數據” 了。

  1. 內存結構

  2. 文件存儲結構

八、名詞概念

假如我們有如下一張表 😏

1、Rowkey 的概念

Rowkey 的概念和 mysql 中的主鍵是完全一樣的,Hbase 使用 Rowkey 來唯一的區分某一行的數據。

由於 Hbase 只支持 3 種查詢方式:

1、基於 Rowkey 的單行查詢

2、基於 Rowkey 的範圍掃描

3、全表掃描

因此,Rowkey 對 Hbase 的性能影響非常大,Rowkey 的設計就顯得尤爲的重要。設計的時候要兼顧基於 Rowkey 的單行查詢也要鍵入 Rowkey 的範圍掃描。

具體 Rowkey 要如何設計後續會整理相關的文章做進一步的描述。這裏大家只要有一個概念就是 Rowkey 的設計極爲重要。

Rowkey 行鍵可以是任意字符串 (最大長度是 64KB,實際應用中長度一般爲 10-100bytes),最好是 16。在 HBase 內部,Rowkey 保存爲字節數組。

HBase 會對錶中的數據按照 Rowkey 排序 (字典順序)

2、Column 的概念

列,可理解成 MySQL 列。

3、ColumnFamily 的概念

列族, HBase 引入的概念。

HBase 通過列族劃分數據的存儲,列族下面可以包含任意多的列,實現靈活的數據存取。就像是家族的概念,我們知道一個家族是由於很多個的家庭組成的。列族也類似,列族是由一個一個的列組成(任意多)。

HBase 表的創建的時候就必須指定列族。就像關係型數據庫創建的時候必須指定具體的列是一樣的。

HBase 的列族不是越多越好,官方推薦的是列族最好小於或者等於 3。我們使用的場景一般是 1 個列族。

4、TimeStamp 的概念

TimeStamp 對 Hbase 來說至關重要,因爲它是實現 Hbase 多版本的關鍵。在 HBase 中使用不同的 TimeStamp 來標識相同 Rowkey 行對應的不同版本的數據。

HBase 中通過 Rowkey 和 Columns 確定的爲一個存儲單元稱爲 cell。每個 cell 都保存着同一份 數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64 位整型。

時間戳可以由 HBase(在數據寫入時自動) 賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由 客戶顯式賦值。如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。每個 cell 中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。

爲了避免數據存在過多版本造成的的管理 (包括存貯和索引) 負擔,HBase 提供了兩種數據版本回收方式:

保存數據的最後 n 個版本,保存最近一段時間內的版本(設置數據的生命週期 TTL)。

用戶可以針對每個列簇進行設置。

5、單元格(Cell)

由 {rowkey, column( = +), version} 唯一確定的單元。Cell 中的數據是沒有類型的,全部是字節碼形式存貯。

九、HBase 的應用場景

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/jl6MrjSMZfk7d-s7KS2Log