分布式數據庫HBase:從零開始了解列式存儲

在接觸過大量的傳統關系型數據庫后你可能會有一些新的問題: 無法整理成表格的海量數據該如何儲存? 在數據非常稀疏的情況下也必須將數據存儲成關系型數據庫嗎? 除了關系型數據庫我們是否還有別的選擇以應對Web2.0時代的海量數據?

如果你也曾經想到過這些問題, 那么HBase將是其中的一個答案, 它是非常經典的列式存儲數據庫. 本文首先介紹HBase的由來以及其與關系數據庫的區別, 其次介紹其訪問接口、數據模型、實現原理和運行機制. 即便之前沒有接觸過HBase的相關知識也不影響閱讀該文章.

請添加圖片描述

如果想了解其他的非關系型數據庫也可以查看我的博客文章:NoSQL數據庫

概述

HBase是谷歌公司BigTable的開源實現. 而BigTable是一個分布式存儲系統, 使用谷歌分布式文件系統GFS作為底層存儲, 主要用來存儲非結構化和半結構化的松散數據. HBase的目標是處理非常龐大的表, 可以通過水平擴展的方式利用廉價計算機集群處理超過10億行數據和百萬列元素組成的數據表.


GFS、HDFS、BigTable、HBase的關系:
HDFS是GFS的開源實現. HBase是BigTable的開源實現.

GFS是BigTable的底層文件系統, BigTable的數據存儲在GFS上.
HDFS是HBase的底層存儲方式. 雖然HBase可以使用本地文件系統, 但是為了提高數據可靠性一般還是會選擇HDFS作為底層存儲.


HBase和BigTable底層技術對應關系

項目BigTableHBase
文件存儲系統GFSHDFS
海量數據處理系統MapReduceHadoop MapReduce
協同服務系統ChubbyZookeeper

與傳統的數據庫相比主要區別在于:

  1. 數據類型: 關系數據庫采用關系模型, HBase則采用更加簡單的數據模型–將數據存儲為未經解釋的字符串.
  2. 數據操作: 關系數據庫通常包括豐富的操作, 涉及復雜的多表連接. HBase則不存在復雜的多表關系, 只有簡單的增刪查改.
  3. 存儲模式: 關系數據庫是基于行模式存儲的, 元組或行被連續地存儲在磁盤中. HBase是基于列存儲的.
  4. 數據索引: 關系數據庫可以針對不同列構建復雜的多個索引以提高訪問效率. HBase則只有一個索引–行鍵.
  5. 數據維護: 關系數據庫中更新操作會用新值替換舊值. HBase則會保留舊數據, 僅僅生成一個新的版本.
  6. 可伸縮性: 關系數據庫很難進行橫向擴展, 縱向擴展的空間也比較有限. HBase作為分布式數據庫可以輕易地通過增加集群中的機器數量來達到性能的伸縮.

訪問接口

HBase提供了多種訪問方式, 不同的方式適用于不同的場景.

類型特點場合
Native Java API最常規高效的訪問方式適合Hadoop MapReduce作業并行批處理HBase表數據
HBase ShellHBase的命令行工具, 最簡單的接口適合HBase管理
Thrift Gateway利用Thrift序列化技術, 支持C++, PHP, Python等多種語言適合其他異構系統訪問HBase
REST Gateway解除語言限制支持REST風格的HTTP API訪問HBase
Pig使用Pig Latin流式編程語言來處理HBase的數據適合做數據統計
Hive簡單可以用類似SQL語言的方式來訪問

數據模型

數據模型是一個數據庫產品的核心, 接下來將介紹HBase列族數據模型并闡述HBase數據庫的概念視圖和物理視圖的差異.

相關概念

HBase實際上是一個稀疏、多維、持久化存儲的映射表, 采用行鍵、列族、列限定符和時間戳進行索引, 每個值都是未經解釋的字節數組byte[].

表由行和列組成, 列被分為若干個列族

每個HBase表都由若干行組成, 每個行由行鍵(Row Key)進行標識.

訪問表中的行有3種方式:

  1. 通過單個行鍵訪問
  2. 通過行鍵區間訪問
  3. 全表掃描

行鍵可以是任意字符串(最大長度64KB, 實際應用中一般為10-100字節). 在HBase內部將行鍵保存為 字節數組, 按照行鍵的 字典序 排序. 所以在設計行鍵時可以充分考慮該特性, 將需要一起讀的行存儲在一起.

列族

HBase中一個表被分為多個列族, 列族是最基本的訪問控制單元. 表中的每個列都必須屬于一個列族, 我們可以將其理解為 把列按照需求分到不同的組中, 就如同整理文件到不同的文件夾中去.

為什么要這么做?

  1. 控制權限. 我們通過列族可以實現權限的控制, 例如某些應用只可以修改某些數據.
  2. 獲得更高的壓縮率. 同一個列族中的所有數據都屬于同一種數據類型, 著通常意味著更高的壓縮率.

缺點

  1. 列族數量不可太多. HBase的一些缺陷導致列族只能有幾十個.
  2. 不能頻繁修改.
列限定符

列族中的數據是通過列限定符來定位的. 列限定符無需事先定義, 也沒有數據類型, 總被視為字節數組byte[].

單元格

在HBase的表中, 通過行、列和列限定符可以確定一個"單元格(Cell)". 單元格中存儲的數據沒有數據類型, 總被視為字節數組byte[].

每個單元格中可以保留一個數據的多個版本, 每個版本對應一個不同的時間戳.

時間戳

每個單元格都保留了同一個數據的多個版本, 這些版本采用時間戳進行索引. 事實上每一次對于一個單元格執行的操作(增刪改)時, HBase都會自動生成并存儲一個時間戳, 通常這個時間戳是64位整型. 當然, 這個時間戳也可以由用戶自己賦值, 用以避免應用程序中出現數據版本沖突.

一個單元格中的不同版本的數據是以時間戳降序排序的, 以便于讀到最新的數據版本.

我認為下面的一張圖可以很好地表述上面的5個概念. 類比于關系數據庫, 行鍵就是主鍵行號, 列限定符就是列名, 列族就是列名組成小組的組名, 單元格就是具體存儲數據的格子, 時間戳則標識了一個單元格中不同時間的數據版本.

請添加圖片描述

一個HBase數據模型的實例

數據坐標

相較于我們所熟悉的關系數據庫, HBase無法僅使用行號和列號確定一個數據. 在HBase中, 我們需要: 行鍵、列族、列限定符和時間戳 這4個東西來確定一個數據.

[行鍵, 列族, 列限定符, 時間戳]被稱為是HBase的坐標, 可以通過這個坐標來直接訪問數據. 在這種層面上講, HBase也可以被視為一個鍵值數據庫.

概念視圖

在HBase的概念視圖中, 一個表是一個稀疏、多維的映射關系.

時間戳列族 contents列族 anchor
com.cnn.wwwt5anchor:cnnsi.com="CNN"
t4anchor:my.look.ca="CNN.com"
com.cnn.wwwt3contents:html="xxxx"
t2contents:html="xxxx"
t1contents:html="xxxx"

上表存儲了一個網頁的頁面內容(html代碼)和一些反向連接. contents中存儲的是網頁內容, anchor中存儲的是反向連接. 不過有幾個地方需要額外注意:

  1. 行鍵. 行鍵采用的是url的倒序, 因為HBase的行鍵采用字典倒序排列, 這樣可以使得相同的網頁都保存在相鄰的位置
  2. 每個行都包含了相同的列族, 即便有些列族不需要存儲數據(為空)

物理視圖

列族 contents

時間戳列族 contents
com.cnn.wwwt3contents:html="xxxx"
t2contents:html="xxxx"
t1contents:html="xxxx"

列族 anchor

時間戳列族 anchor
com.cnn.wwwt5anchor:cnnsi.com="CNN"
t4anchor:my.look.ca="CNN.com"

我們可以輕易發現, 在物理的存儲層面上來看HBase采用了基于列的存儲方式, 而不是傳統關系數據庫那樣基于行來存儲. 這也是HBase與傳統關系數據庫間的重要區別.

與概念視圖的不同

  1. 列族的分開存放. 可以看到contents和anchor兩個列族被分開存放.
  2. 不存在空值. 在概念視圖中有些列是空的, 但是在物理視圖中這些值根本不會被存儲.

總結

行式數據庫使用 NSM(N-ary Storage Model) 存儲模型, 將一個元組(或行)連續地存儲在磁盤頁中. 數據被一行一行地儲存, 寫完第一行再寫第二行. 在讀取數據時需要從磁盤中順序掃描每個元組的完整內容. 顯然, 如果每個元組只有少量屬性的值對查詢有用時, NSM模型會浪費許多磁盤空間.

列式數據庫采用 DSM(Decomposition Storage Model) 存儲模型, 將關系進行垂直分解, 以列為單位存儲, 每個列單獨存儲. 該方法最小化了無用的I/O.

行式存儲主要適合于小批量的數據處理, 比如聯機事務處理. 列式數據庫主要適用于批量數據處理和即席查詢(Ad-Hoc Query). 列式數據庫的優點是: 降低I/O開銷, 支持大量用戶并發查詢, 數據處理速度比傳統方法快100倍, 并且具有更高的數據壓縮比.

如果嚴格從關系數據庫的角度來看, HBase并不是一個列式存儲的數據庫, 畢竟它是以列族為單位進行分解的, 而不是每個列都單獨存儲. 但是HBase借鑒和利用了磁盤上這種列存的格式, 所以某種角度上來說它可以被視為列式數據庫. 常用的商業化列式數據庫有: Sybase IQ, Verticad等.

如果想要更深入地了解HBase的實現原理, 架構以及運行機制, 可以閱讀我的博客: 分布式數據庫HBase

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40444.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++: 左值引用和右值引用

目錄 概念: 理解: 左值引用,右值引用 左值引用能否給右值取別名? 右值引用能否給左值取別名? 引用的意義是什么? 左值和右值對自定義類型有什么區別嗎? move的妙用! 沒有優化…

LLMs之CriticGPT:CriticGPT的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之CriticGPT:CriticGPT的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 CriticGPT的簡介 1、簡介 2、CriticGPT的方法 2.1、CriticGPT的訓練方法 2.2、CriticGPT的批評生成方法 3、局限性 4、后續步驟 CriticGPT的安裝和使用方法 CriticGPT的案例應用…

“proxy_pass“ directive is duplicate

后面發現是nginx.conf里面proxy pass這里有兩個,注釋其中一個并重新運行即可!

AI并不是開發者的敵人,而是幫助他們實現更高效工作的得力助手。

AI是在幫助開發者還是取代他們? 在軟件開發領域,生成式人工智能(AIGC)正在改變開發者的工作方式。無論是代碼生成、錯誤檢測還是自動化測試,AI工具正在成為開發者的得力助手。然而,這也引發了對開發者職業前…

基于主流SpringBoot進行JavaWeb開發的學習路線

目錄 一、學習路線 (1)第一部分(Web前端開發的技術棧) (2)第二部分(Web后端開發) 二、學習之后必備的技能 三、學習Web開發的基礎與未來的收獲 學完這一類知識目標:…

Mybatis-01 原理

一. JDBC式編程 在 jdbc 編程中,我們最常用的是 PreparedStatement 式的編程,我們看下面這個例子; Connection conn null; PreparedStatement ps null; ResultSet rs null;try {// 1. 注冊驅動Class.forName("com.mysql.jdbc.Drive…

Sping源碼總覽

源碼地址:https://github.com/spring-projects/spring-framework 倉庫地址:https://gitcode.net/qq_42665745/spring/-/tree/master 文章目錄如下: 實現一個簡單的Bean容器Bean 的定義、注冊、獲取Bean有參構造實例化Bean屬性注入資源加載器…

C++11使用std::future和std::promise實現線程同步和異步通信

std::future 和 std::promise 是 C11 引入的標準庫特性,用于實現線程間的異步通信和同步。它們提供了一種機制,使一個線程能夠生成一個值或異常,并讓另一個線程獲取這個值或異常。 (線程A中設置結果) std::promise 用于設置異步操作的結果(線…

【Jupyter Notebook與Git完美融合】在Notebook中駕馭版本控制的藝術

標題:【Jupyter Notebook與Git完美融合】在Notebook中駕馭版本控制的藝術 Jupyter Notebook是一個流行的開源Web應用程序,允許用戶創建和共享包含實時代碼、方程、可視化和解釋性文本的文檔。而Git是一個廣泛使用的分布式版本控制系統,用于跟…

關于C#在WPF中如何使用“抽屜”控件

關于C#在WPF中如何使用“抽屜”控件 1.前提準備2.XAML代碼3.對應的C#代碼4.顯示效果1.前提準備 需要引用MaterialDesign控件庫,關于如何引用,請參照文章——關于C#如何引用MaterialDesign控件庫 2.XAML代碼 <Window x:Class="MaterialDesign_Test.MainWindow"…

化身成羊:關于羊的詞群探析

在西方的神話故事中&#xff0c;像主神宙斯&#xff0c;或者基督教義中的上帝&#xff0c;通常都有化身成羊的形象。 那為什么會這樣呢&#xff1f; 一、什么是神話(myth)&#xff1f; 神話&#xff0c;正式的用詞是 mythology&#xff1a; mythology n.神話&#xff1b;神話…

Http接口RestSharp中StatusCode返回0, 但服務器或本地postman獲取應答正常(C#)

我的本地和其他服務器用同一段代碼都可以訪問&#xff1a; 原代碼&#xff1a; RestClient client new RestClient(url); client.Timeout -1; RestRequest request new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer " acc…

Echarts中的折線圖,多個Y軸集中在左側(在Vue中使用多個Y軸的折線圖)

簡述&#xff1a;在 ECharts 中&#xff0c;創建一個帶有多個 Y 軸的折線圖&#xff0c;并且將這些 Y 軸都集中顯示在圖表的左側&#xff0c;可以通過合理配置 yAxis 和 series 的屬性來實現。簡單記錄 一. 函數代碼 drawCarNumEcs() {// 初始化echarts圖表,并綁定到id為"…

網絡安全設備——探針

網絡安全設備探針是一種專門用于網絡安全領域的工具&#xff0c;它通過對網絡流量進行監控和分析&#xff0c;幫助發現和防止網絡攻擊。以下是對網絡安全設備探針的詳細解釋&#xff1a; 定義與功能 定義&#xff1a;網絡安全設備探針是一種設備或軟件&#xff0c;它通過捕獲…

【docker】運行階段遇到的問題

目錄 1、查詢docker 下掛載了哪些工具 2、docker中的簡單命令 3、實際場景應用&#xff08;redis&#xff09; 目前工作中僅用到了redis,所以沒有太多經驗可以交流&#xff0c;暫時僅將我目前遇到的進行發布。還請見諒。 1、查詢docker 下掛載了哪些工具 docker ps -a 或者…

Vue組件如何“傳話”?這里有個小秘訣!

?&#x1f308;個人主頁&#xff1a;前端青山 &#x1f525;系列專欄&#xff1a;vue篇 &#x1f516;人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來vue篇專欄內容:vue-組件通信 目錄 Vue組件通信 &#xff08;1&#xff09; props / $emit 1. 父組件向子組件傳…

適合職場小白的待辦事項管理方法和工具

剛入職場那會兒&#xff0c;我每天都像只無頭蒼蠅&#xff0c;忙得團團轉卻效率低下。待辦事項像潮水般涌來&#xff0c;會議、報告、客戶跟進……每一項都像是懸在頭頂的利劍&#xff0c;讓我焦慮不堪。我深知&#xff0c;管理好待辦事項是職場生存的必修課&#xff0c;但該如…

內衣洗衣機哪個牌子好用?傾力推薦四大熱門產品,質量放心

在當今社會&#xff0c;內衣洗衣機已經成為每個家庭必不可少的家電之一。但由于市場上的內衣洗衣機品牌和型號繁多&#xff0c;對于消費者來說&#xff0c;選擇一款實用、性價比高的內衣洗衣機是非常重要的。那么&#xff0c;內衣褲洗衣機哪個品牌最好&#xff1f;接下來我將會…

框架為我們做了什么?

1. SpringBoot 1.1 web服務器 Spring Boot 的 web 服務器原理主要基于其嵌入式服務器的概念&#xff0c;這意味著它內嵌了一個 web 服務器&#xff0c;無需部署到外部服務器上。Spring Boot 內嵌了如 Tomcat、Jetty 或 Undertow 等 servlet 容器。 1.2 servlet Servlet&…

【鴻蒙學習筆記】創建自定義組件

官方文檔&#xff1a;創建自定義組件 目錄標題 自定義組件的基本結構&#xff11;?struct 自定義組件名 {...}&#xff20;ComponentEntry &#xff11;? &#xff12;? &#xff13;? &#xff14;? &#xff15;? &#xff16;? &#xff17;? &#xff18;? &…