簡(jiǎn)介
HBase 是一個(gè)基于HDFS 的面向列的分布式數(shù)據(jù)庫,屬于非關(guān)系型數(shù)據(jù)庫的一種浓瞪。
HBase 本質(zhì)上只有插入操作股耽,更新和刪除都是使用插入方式完成的,這是由其底層 HDFS 的流式訪問特性(一次寫入纠拔、多次讀取)決定的泛豪。
HBase在更新時(shí)總會(huì)插入一個(gè)帶時(shí)間戳的新行稠诲,而刪除時(shí)則插入一個(gè)帶有刪除標(biāo)記的新行侦鹏。每次插入都有一個(gè)時(shí)間戳的標(biāo)記,每次都是一個(gè)新的版本臀叙,Hbase會(huì)保留一定數(shù)據(jù)的版本(自行設(shè)置)略水。如果查詢時(shí)提供時(shí)間戳則返回距離該時(shí)間最近的版本,否則返回離現(xiàn)在最近的版本劝萤。
一渊涝、 HBase體系結(jié)構(gòu)
HBase采用Master/slaves 的主從服務(wù)器結(jié)構(gòu),由一個(gè)HMaste服務(wù)器和多個(gè)HRegion Server服務(wù)器組成稳其,所有的服務(wù)器都通過Zoo Keeper協(xié)調(diào)并處理運(yùn)行期間遇到的錯(cuò)誤驶赏。
HMaster負(fù)責(zé)管理所有的HRegion Server,各HRegion Server負(fù)責(zé)存儲(chǔ)許多HRegion既鞠,每一個(gè)HRegion是對(duì)HBase邏輯表的分塊煤傍。
1. HRegion
HBase使用表存儲(chǔ)數(shù)據(jù),表由行和列組成嘱蛋。但是當(dāng)表超過設(shè)定值大小時(shí)蚯姆,Hbase會(huì)自動(dòng)將表劃分不同的區(qū)域,每個(gè)區(qū)域被稱為HRegion洒敏。
HRegion是集群上分布式存儲(chǔ)和負(fù)責(zé)均衡的最小單位龄恋,類似于HDFS中文件與文件塊的概念。
一個(gè)HRegion保存一個(gè)表中連續(xù)的數(shù)據(jù)凶伙,通過表名及主鍵來區(qū)分每一個(gè)HRegion郭毕。
最開始一個(gè)表只有一個(gè)HRegion,隨著HRegion增大函荣,超出設(shè)定閾值显押,會(huì)分裂成兩個(gè)大小基本相同的HRegion,稱為HRegion分裂傻挂。
每個(gè)HRegion由HStore組成乘碑,HStore由兩部分組成:Mem Store和Store File,用戶寫入的數(shù)據(jù)首先放入Mem Store金拒,當(dāng)Mem Store滿了以后再刷入Store File兽肤。
Store File 是 HBase的最小存儲(chǔ)單位,底層最終由HFile實(shí)現(xiàn)绪抛。HFile是鍵值對(duì)數(shù)據(jù)存儲(chǔ)的格式资铡,實(shí)質(zhì)是HDFS的二進(jìn)制文件。
2. HRegion Server
HRegion Server負(fù)責(zé)響應(yīng)客戶端IO請(qǐng)求幢码,向HDFS中讀寫數(shù)據(jù)笤休,一臺(tái)機(jī)器上只運(yùn)行一個(gè)HRegion Server。HRegion Server包含兩個(gè)部分:HLog 和 HRegion蛤育。
HLog用于存儲(chǔ)數(shù)據(jù)日志宛官,實(shí)質(zhì)是HDFS的Sequence File。到達(dá)HRegion的寫操作首先追加到日志中瓦糕,才被加入到內(nèi)存中的Mem Store底洗。
HLog 主要用于故障恢復(fù),如果HRegion所在主機(jī)發(fā)生故障咕娄,那么所維護(hù)的HRegion會(huì)被重新分配至新的主機(jī)上亥揖,新的HRegion Server 在加載HRegion時(shí),可通過Hlog恢復(fù)數(shù)據(jù)圣勒。
3. HMaster
HMaster主要任務(wù)是告訴每個(gè)HRegion Server需要維護(hù)哪些HRegion费变。在Hbase中可以啟動(dòng)多個(gè)HMaster,通過ZooKeeper的Master選舉機(jī)制來保證系統(tǒng)中總會(huì)有一個(gè)HMaster在運(yùn)行圣贸。
HMaster包括以下功能:
1. 管理用戶對(duì)表的增改查操作
2. 管理HRegion的負(fù)責(zé)均衡挚歧,調(diào)整HRegion分布
3. 在HRegion分裂后,負(fù)責(zé)HRegion分配
4. 在HRegion Server停機(jī)后吁峻,負(fù)責(zé)失效HRegion Server上的HRegion遷移
4. zoo keeper
Zoo keeper 是存儲(chǔ)HBase -ROOT-表和.META.表的位置滑负,這是HBase中兩張?zhí)厥獾谋怼7Q為根數(shù)據(jù)表(-ROOT-)和元數(shù)據(jù)表(.META.)用含。
元數(shù)據(jù)表記錄普通用戶表的HRegion標(biāo)識(shí)符信息矮慕,每個(gè)HRgion的標(biāo)識(shí)符為:表名+開始主鍵+唯一ID。
隨著用戶表的HRegion的分裂啄骇,.META.表的信息也會(huì)增加痴鳄,并且還可能被分割為幾個(gè)HRegion,此時(shí)可以用一個(gè)-ROOT-表來保存META的HRegion信息缸夹,而-ROOT-表是不能被分割的痪寻,也就是-ROOT-表只有一個(gè)HRegion。
那么客戶端(Client)在訪問用戶數(shù)據(jù)前需要先訪問Zoo Keeper明未,然后訪問-ROOT-表槽华,接著訪問.META.表,最后才能找到用戶數(shù)據(jù)所在位置進(jìn)行訪問趟妥。
二猫态、 HBase數(shù)據(jù)模型
1. 數(shù)據(jù)模型
- 表(Table):是一種稀疏表(不存儲(chǔ)數(shù)據(jù)為NULL的數(shù)據(jù)),表的索引是行關(guān)鍵字披摄、列關(guān)鍵字亲雪、時(shí)間戳
- 行關(guān)鍵字(Row Key):行的主鍵,唯一標(biāo)識(shí)一行數(shù)據(jù)疚膊,也稱為行鍵义辕。
表中的行根據(jù)行鍵進(jìn)行字典排序,所有對(duì)表的訪問都要通過表的行鍵寓盗。
在創(chuàng)建表時(shí)灌砖,行鍵不用也不能預(yù)先定義璧函,而對(duì)表數(shù)據(jù)進(jìn)行操作時(shí)必須指定行鍵,行鍵在添加數(shù)據(jù)時(shí)首次被確定基显。 - 列族(Column Family):行中的列被分為列族蘸吓。
同一個(gè)列族的所有成員具有相同的列族前綴。例如[course:math]和[course:art]都是列族[course]的成員撩幽。
一個(gè)表的列族必須在創(chuàng)建表時(shí)預(yù)先定義库继,列族名稱不能包含ASCII控制字符(編號(hào)0~31+127)和冒號(hào)(:)。 - 列關(guān)鍵字(Column Key):也稱列鍵窜醉。 格式為:[Family:qualifier]宪萄。
family 是列族名,用于表示列族前綴榨惰。qualifier是列修飾符拜英,表示列族中的一個(gè)成員,列族成員可以在隨后按需拓展琅催。 - 存儲(chǔ)單元(Cell): 在HBase中聊记,值是作為一個(gè)單元保存在系統(tǒng)中的。
要定位一個(gè)單元恢暖,需要用[行鍵+列鍵+時(shí)間戳] 3個(gè)要素排监。 - 時(shí)間戳(Timestamp):插入單元格時(shí)間,默認(rèn)為單元格的版本號(hào)杰捂。
2. 概念圖
在傳統(tǒng)數(shù)據(jù)庫中舆床,只能通過表的主鍵和唯一字段定位到某一條數(shù)據(jù)。
如上表所示:
主鍵為name嫁佳,主要字段有name挨队、grade、math蒿往、art盛垦。
由于主鍵唯一標(biāo)識(shí)了一行記錄,所以我們很容易按姓名查詢某位同學(xué)的成績瓤漏。
那么思考以下幾個(gè)問題:
- 如果新增一門課程腾夯,在不修改表結(jié)構(gòu)的情況下,能保存成績么蔬充?
- 如果有同學(xué)參加補(bǔ)考蝶俱,怎么保存兩次成績。
- 如果同學(xué)只參加一門考試饥漫,其他課程都沒有成績榨呆。我們能保存只有成績的課程來節(jié)省存儲(chǔ)空間么?
HBase的數(shù)據(jù)模型就能完美解決以上問題庸队。
- 可以通過[行鍵+時(shí)間戳+列族]來訪問具體的值(單元)积蜻。
- 對(duì)表操作必須指定行鍵和列鍵闯割,每次操作都會(huì)增加一條數(shù)據(jù)并會(huì)自動(dòng)生成時(shí)間戳。從上到下倒序排列竿拆,不必由用戶管理纽谒。
- 每次只針對(duì)一個(gè)列鍵操作。且列修飾符可以為空如输。
eg. 在t4時(shí)刻,客戶端添加[jason] 的[grade]為[2]央勒。
類似操作為:先找到行鍵[jason]不见,然后指定列鍵并賦值[grade:=2]。這里的列族修飾符可以為空崔步。前面提到過列族修飾符可以由任意字符組成稳吮。
現(xiàn)在基于HBase回答前面的問題:
- 如果jason新增英語科目成績,那么指定行鍵[jason]井濒,列鍵[source:english]灶似,以及值(英語成績)即可。
- 如果jason 參加數(shù)學(xué)補(bǔ)考瑞你,那么直接指定行鍵[jason]酪惭,列鍵[source:math],以及值(數(shù)學(xué)補(bǔ)考成績)即可者甲。
- 前面說過HBase是稀疏的存儲(chǔ)設(shè)計(jì)春感。其實(shí)概覽圖中空白部分是不會(huì)實(shí)際被存儲(chǔ)的。
3. 物理結(jié)構(gòu)
如圖所示:
HBase 就是這樣一個(gè)基于列的映射數(shù)據(jù)庫虏缸,他只能表示簡(jiǎn)單的鍵值映射關(guān)系鲫懒。
4.HBase數(shù)據(jù)特點(diǎn)
- 數(shù)據(jù)類型: 只有簡(jiǎn)單的字符串類型。(傳統(tǒng)SQL有多種數(shù)據(jù)類型)
- 數(shù)據(jù)操作:只有簡(jiǎn)單的插入刽辙、查詢窥岩、刪除、清空等操作宰缤,表和表之間是分離的颂翼,沒有復(fù)雜的表和表之間的關(guān)系。(傳統(tǒng)SQL有多種連接操作)
- 存儲(chǔ)模式:基于列的存儲(chǔ)慨灭。每個(gè)列族由幾個(gè)文件保存疚鲤,不同列族的文件是分離的。(傳統(tǒng)SQL是基于表格結(jié)構(gòu)和行模式存儲(chǔ))
- 數(shù)據(jù)維護(hù): 只是簡(jiǎn)單的插入了新數(shù)據(jù)缘挑,它的舊版本會(huì)保留(傳統(tǒng)SQL是替換修改操作)
- 可伸縮: 分布式數(shù)據(jù)庫集歇。能夠輕松的增加和減少硬件數(shù)量,并且對(duì)錯(cuò)誤兼容性較高语淘。(傳統(tǒng)SQL需要中間層才能實(shí)現(xiàn)類似功能)
本文參考與《基于 Hadoop 與 Spark 的大數(shù)據(jù)開發(fā)實(shí)戰(zhàn)》