新聞中心
大數(shù)據(jù)之Hbase
在上篇主要分析了Hadoop的有關(guān)概念,詳見大數(shù)據(jù)系列
這節(jié)主要來看下Hbase數(shù)據(jù)庫(kù)。
先來看官網(wǎng)給出的概念:
HBase(Hadoop Database):Apache HBase? is the Hadoop database, a distributed, scalable, big data store.
主要由以下幾點(diǎn):
1.the Hadoop database:HBase是基于Hadoop的數(shù)據(jù)庫(kù),所以跟Hadoop是有強(qiáng)依賴關(guān)系的,而實(shí)際上,我們的HBase底層是要依賴于HDFS的,我們HBase上的數(shù)據(jù),其實(shí)就是存放在HDFS上。
2.a distributed:是一個(gè)分布式的,HBase結(jié)構(gòu)也是主從結(jié)構(gòu),類似于HDFS的主從結(jié)構(gòu),主從結(jié)構(gòu)有利于對(duì)表、對(duì)數(shù)據(jù)進(jìn)行處理。
3.scalable:可擴(kuò)展的,自然而然,HBase的數(shù)據(jù)存儲(chǔ)在HDFS上,HDFS可以部署在廉價(jià)的機(jī)器上,而且理論上可以無限擴(kuò)展。所以,HBase其實(shí)是具有這個(gè)特點(diǎn)的。
4.big data store:大數(shù)據(jù)量的存儲(chǔ),說明HBase可以存儲(chǔ)很大的數(shù)據(jù)量,一張表可以達(dá)到數(shù)百萬列,數(shù)十億行,而傳統(tǒng)數(shù)據(jù)庫(kù),在達(dá)到上百萬行的時(shí)候,就要考慮進(jìn)行讀寫分離、分庫(kù)分表等操作。
Hbase產(chǎn)生的背景
假如,要開發(fā)一個(gè)網(wǎng)站,開發(fā)完成后要將這個(gè)項(xiàng)目打包到服務(wù)器上去執(zhí)行,而在網(wǎng)站運(yùn)行之前,應(yīng)該先在服務(wù)器上裝好數(shù)據(jù)庫(kù)如:MySQL、Redis、Oracle等等。
我們的網(wǎng)站程序里面,我們的數(shù)據(jù)是以表的形式來存儲(chǔ)和讀取的,而這些表,就是我們數(shù)據(jù)類型里面的結(jié)構(gòu)化數(shù)據(jù)。如果沒有數(shù)據(jù)庫(kù),其實(shí)網(wǎng)站程序相關(guān)的數(shù)據(jù)也是可以存放在服務(wù)器系統(tǒng)上的,只是,會(huì)發(fā)現(xiàn)特別麻煩,如果直接存到Linux,你可以通過簡(jiǎn)單的Select語句檢索出你想要的數(shù)據(jù)嗎?你能簡(jiǎn)單地用一句Update就修改里面相關(guān)條件的內(nèi)容嗎?你能夠通過簡(jiǎn)單的聚合函數(shù)就做一些簡(jiǎn)單的分析嗎?明顯是不太容易操作的,當(dāng)然也還有很多原因,只是簡(jiǎn)單地列舉一下。
現(xiàn)在回到我們的大數(shù)據(jù)相關(guān)知識(shí)。到目前為止,我們已經(jīng)學(xué)過了HDFS,是一個(gè)分布式文件系統(tǒng),我們的數(shù)據(jù)可以存放到我們的HDFS上。但是,如果我們要對(duì)數(shù)據(jù)進(jìn)行一些快速查詢、聚合分析等操作的時(shí)候,也一樣是非常困難的,這點(diǎn)跟我們上面分析的場(chǎng)景相類似。
HDFS與Hbase場(chǎng)景分析
1.HDFS不適合大量小文件的存儲(chǔ)。因?yàn)樗鎯?chǔ)的元數(shù)據(jù)是在Namenode所在的機(jī)器內(nèi)存中的,HDFS中的每個(gè)文件、目錄、數(shù)據(jù)塊占用150個(gè)字節(jié)左右,
如果存放1百萬的文件則至少需要消耗300MB內(nèi)存,當(dāng)然如果是幾十個(gè)億,例如10億,這個(gè)時(shí)候的內(nèi)存就顯得非常局限了,當(dāng)然,這也是相對(duì)的,如果是幾萬個(gè)小文件,那當(dāng)然就沒有問題。
2.適合用于高吞吐量的訪問,而不適合低延遲訪問,它做不到低延遲訪問,操作時(shí)不是簡(jiǎn)單地在本地就可以實(shí)現(xiàn),是需要聯(lián)系多臺(tái)服務(wù)器的,索引等等也是一個(gè)限制。所以,**為了提高HDFS的性能,這里邊就有了一個(gè)原則:盡可能地去移動(dòng)計(jì)算而不是移動(dòng)數(shù)據(jù)。**在吞吐量很大的時(shí)候,計(jì)算就相對(duì)更小,此時(shí)當(dāng)然是移動(dòng)計(jì)算程序去其他節(jié)點(diǎn)會(huì)更節(jié)省資源。
3.適合流式數(shù)據(jù)訪問,一個(gè)文件只能被一個(gè)用戶寫,不支持隨機(jī)寫入,只能在文件末尾append進(jìn)去,或者直接覆蓋掉。此外,用戶最好就是在訪問的時(shí)候,盡量減少斷開連接、建立連接的操作,因?yàn)榇瞬僮饕彩切枰男阅艿模詈镁褪亲龅揭淮谓⒘诉B接,一直訪問、操作就好。流式數(shù)據(jù)訪問,可以理解為就是一直都在訪問,即一直都連接。
4.適合用于一次寫入,多次讀取,而且不適應(yīng)用于低時(shí)間的訪問。在進(jìn)行寫文件的時(shí)候需要涉及到多臺(tái)服務(wù)器,那就存放RPC、數(shù)據(jù)傳輸?shù)炔僮?,非常消耗性能,所以最好就是存好在HDFS了就最好不要亂動(dòng)了。而且有一點(diǎn),HDFS的讀取是按順序讀取的,不利于檢索。
Hbase場(chǎng)景分析
1、有利于處理各種類型的數(shù)據(jù),如結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化或者非半結(jié)構(gòu)數(shù)據(jù)。
2、HBase是以稀疏的結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,數(shù)據(jù)是按列進(jìn)行存儲(chǔ)的,如果某一行的這一列沒有數(shù)據(jù),則不占用空間。
3、HBase支持多版本存儲(chǔ),默認(rèn)是只存儲(chǔ)一個(gè)版本,但是可以設(shè)置存多個(gè)版本,這個(gè)版本的索引是時(shí)間戳。
4、HBase支持隨機(jī)讀寫,而HDFS只支持追加或者覆蓋。
到目前為止,簡(jiǎn)單總結(jié)一下HBase的產(chǎn)生背景,HDFS與HBase都是用來存儲(chǔ)數(shù)據(jù)的,而HBase的出現(xiàn),主要也是為了做一些HDFS做不到的。
Hbase的存儲(chǔ)結(jié)構(gòu)
先來看一下百度百科里面的一句話:
HBase – Hadoop Database,是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PCServer上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群。
——來自百度百科
高可靠性、高性能、可伸縮我們此處不做敘述,主要開一下面向列這一特性。傳統(tǒng)的數(shù)據(jù)庫(kù),比如說MySQL、Oracle,這些數(shù)據(jù)庫(kù)都是按行存儲(chǔ)的,而這里的HBase,是按列進(jìn)行存儲(chǔ)的。
行存儲(chǔ)是數(shù)據(jù)按行的方式存儲(chǔ)在底層文件中,通常,每一行會(huì)自動(dòng)的分配一個(gè)固定的空間。假如在上圖:數(shù)據(jù)庫(kù)里沒有存儲(chǔ)我的Phone和Address,只存儲(chǔ)了我的ID和Name,那么沒存的這兩個(gè)字段Phone和Address也在占用空間。如果是Hbase的話,對(duì)于沒有的信息,他是可以為空的,并且不占用空間。
優(yōu)點(diǎn)是:利于增加,修改,整行記錄等操作,也有利于整行數(shù)據(jù)的讀取。
缺點(diǎn)是:?jiǎn)瘟胁樵儠r(shí),會(huì)讀取一些不必要的數(shù)據(jù),例如:查找出數(shù)據(jù)庫(kù)里面所有人的名字,則需要將所有數(shù)據(jù)都讀取出來,然后將名字這一列檢索出來。
再來看列存儲(chǔ):
數(shù)據(jù)以列為單位,列是按照文件夾這樣的方式存儲(chǔ)的,所以此時(shí)如果要在讀取Name這一列,就可以直接讀取Name之一列就行,無關(guān)的數(shù)據(jù)不用讀就行了。如果Address某一個(gè)人的信息不知道,就可以把它為空,并且也不占用空間。
列存儲(chǔ)的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):有利于面向單列數(shù)據(jù)的讀取、統(tǒng)計(jì)等操作。
缺點(diǎn):整行讀取時(shí),可能需要多次I/O操作。
Hbase表的結(jié)構(gòu)
HBase 邏輯結(jié)構(gòu)
HBase 物理結(jié)構(gòu)
數(shù)據(jù)模型:
Name Space
命名空間,類似于關(guān)系型數(shù)據(jù)庫(kù)的 DatabBase 概念,每個(gè)命名空間下有多個(gè)表。HBase 有兩個(gè)自帶的命名空間,分別是 hbase 和 default,hbase 中存放的是 HBase 內(nèi)置的表,default 表是用戶默認(rèn)使用的命名空間。Region
類似于關(guān)系型數(shù)據(jù)庫(kù)的表概念。不同的是,HBase 定義表時(shí)只需要聲明列族即可,不需要聲明具體的列。這意味著,往 HBase 寫入數(shù)據(jù)時(shí),字段可以動(dòng)態(tài)、按需指定。因此,和關(guān)系型數(shù)據(jù)庫(kù)相比,HBase 能夠輕松應(yīng)對(duì)字段變更的場(chǎng)景。Row
HBase 表中的每行數(shù)據(jù)都由一個(gè) RowKey 和多個(gè) Column(列)組成,數(shù)據(jù)是按照 RowKey 的字典順序存儲(chǔ)的,并且查詢數(shù)據(jù)時(shí)只能根據(jù) RowKey 進(jìn)行檢索,所以 RowKey 的設(shè)計(jì)十分重要。Column
HBase 中的每個(gè)列都由 Column Family (列族)和 Column Qualifier(列限定符)進(jìn)行限定,例如 info:name,info:age。建表時(shí),只需指明列族,而列限定符無需預(yù)先定義。Time Stamp
用于標(biāo)識(shí)數(shù)據(jù)的不同版本(version),每條數(shù)據(jù)寫入時(shí),如果不指定時(shí)間戳,系統(tǒng)會(huì)自動(dòng)為其加上該字段,其值為寫入 HBase 的時(shí)間。Cell
由{rowkey, column Family:column Qualifier, time Stamp}唯一確定的單元。cell 中的數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存儲(chǔ)。
開始演示:
需要注意,開啟Hbase需要提前搭建好Hadoop環(huán)境和Zookeeper集群(因?yàn)镠base是利用zookeeper來管理的,后續(xù)會(huì)具體介紹)。關(guān)于Hbase集群,Hadoop的搭建以及Zookeeper的環(huán)境具體請(qǐng)看:
Hbase搭建
Hadoop搭建
Zookeeper搭建
如圖,確保三個(gè)節(jié)點(diǎn)集群服務(wù)都能正常啟動(dòng):
3臺(tái)服務(wù)都要分別去啟動(dòng)zookeeper,可以看出zookeeper有一個(gè)功能,master節(jié)點(diǎn)的zookeeper的Mode為:follower;slave1節(jié)點(diǎn)的zookeeper的Mode為:leader;slave2節(jié)點(diǎn)的zookeeper的Mode為:follower;這是zookeeper的選舉機(jī)制,選舉有特定的算法。
然后在master節(jié)點(diǎn)開啟Hbase集群:
start-hbase.sh
hbase shell
list命令就理解為Mysql中的show databases;
在這里意為:查看所有的表
常用的一些命令:
list :查看所有的表
create ‘表名’,‘列族名’ :建表
put ‘表名’,‘Rowkey’,‘列族名:列名’,‘值’ :添加數(shù)據(jù),修改數(shù)據(jù)(Hbase中修改的語法就是直接put他會(huì)覆蓋上一條數(shù)據(jù))
deleteadd ‘表名’,‘Rowkey’:刪除一行數(shù)據(jù)
scan ‘表名’:掃描表的數(shù)據(jù)
get ‘表名’,‘Rowkey’:查看相關(guān)的Rowkey的數(shù)據(jù)
desc ‘表名’:查看建表的詳細(xì)結(jié)構(gòu)
當(dāng)然命令不止這些,后續(xù)還有一些過濾的命令,會(huì)慢慢介紹~~
hbase(main):002:0>create 't2','bi'
0 row(s) in 2.5620 seconds
=>Hbase::Table - t2
hbase(main):003:0>list
TABLE
t01_yuan
t02_student
t04
t1
t2
5 row(s) in 0.0340 seconds
=>["t01_yuan", "t02_student", "t04", "t1", "t2"]
hbase(main):004:0>put 't2','1001','bi:a0','yhh'
0 row(s) in 0.2120 seconds
hbase(main):005:0>put 't2','1002','bi:a1','24'
0 row(s) in 0.0130 seconds
hbase(main):006:0>put 't2','1003','bi:a2','male'
0 row(s) in 0.0150 seconds
hbase(main):007:0>scan 't2'
ROW COLUMN+CELL
1001 column=bi:a0, timestamp=1671084250140, value=yhh
1002 column=bi:a1, timestamp=1671084265430, value=24
1003 column=bi:a2, timestamp=1671084274616, value=male
3 row(s) in 0.0460 seconds
hbase(main):008:0>desc 't2'
Table t2 is ENABLED
t2
COLUMN FAMILIES DESCRIPTION
{NAME =>'bi', BLOOMFILTER =>'ROW', VERSIONS =>'1', IN_MEMORY =>'false', KEEP_DELETED_CELLS =>'FALSE', DATA_BLOCK_ENCODING =>'NONE', TTL =>'FOREVER', COMPRESSION =>'NONE', MIN_
VERSIONS =>'0', BLOCKCACHE =>'true', BLOCKSIZE =>'65536', REPLICATION_SCOPE =>'0'}
1 row(s) in 0.0630 seconds
hbase(main):009:0>put 't2','1001','bi:a1','wu2'
0 row(s) in 0.0150 seconds
hbase(main):010:0>put 't2','1001','bi:a2','130123'
0 row(s) in 0.0120 seconds
hbase(main):011:0>get 't2','1001'
COLUMN CELL
bi:a0 timestamp=1671084250140, value=yhh
bi:a1 timestamp=1671084458981, value=wu2
bi:a2 timestamp=1671084466096, value=130123
3 row(s) in 0.0310 seconds
提示:在添加數(shù)據(jù)的時(shí)候,也就是put時(shí),列族后邊的列名是動(dòng)態(tài)指定的,也就是說在建表時(shí),只需聲明出列族就行。
例如上圖中的a1,a2…
Rowkey的設(shè)計(jì)
長(zhǎng)度原則,唯一原則,排序原則,散列原則
如圖:
當(dāng)用Hbase插入數(shù)據(jù)的時(shí)候,順序他會(huì)自己根據(jù)指定的算法去排序。
而這個(gè)時(shí)候來看Mysql,他根本不會(huì)給你排序,就直接候補(bǔ):
Rowkey的設(shè)計(jì)關(guān)鍵是非常有必要的。比如現(xiàn)在有這么一個(gè)案例:
第1個(gè)模板:證件更新。
第2個(gè)模板:新卡提醒。
就拿以上兩個(gè)模板來說,怎樣去合理的設(shè)計(jì)Rowkey呢,當(dāng)然這得需要根據(jù)具體的業(yè)務(wù)場(chǎng)景來定。
比如,當(dāng)我想查第1個(gè)模板的時(shí)候,我就得想,他叫證件更新,那么我得需要拿到證件號(hào)然后在拼接上模板的名字:Rowkey=證件號(hào)+模板名字,就是:1301231。
當(dāng)我想查第2個(gè)模板的時(shí)候,我就得想,他叫新卡提醒,那么我得需要拿到證件號(hào)然后在拿上它的卡號(hào)最后在拼接上模板的名字:Rowkey=證件號(hào)+卡號(hào)+模板名字,就是:1301232432。
hbase(main):017:0>scan 't2'
ROW COLUMN+CELL
1001 column=bi:a0, timestamp=1671084250140, value=yhh
1001 column=bi:a1, timestamp=1671084458981, value=wu2
1001 column=bi:a2, timestamp=1671084466096, value=130123
1002 column=bi:a1, timestamp=1671084265430, value=24
1003 column=bi:a2, timestamp=1671084274616, value=male
1301231 column=bi:a0, timestamp=1671085427440, value=yuan
1301232 column=bi:a1, timestamp=1671085471158, value=yuan12
1301232432 column=bi:a0, timestamp=1671085446523, value=sdsd
6 row(s) in 0.0330 seconds
這樣我把上圖中的1301231和1301232432都存到了數(shù)據(jù)庫(kù)中。為了區(qū)別下,我又添加了一條1301232,他自己追加到了1301231后邊,并沒有在1301232432下邊。
這就符合了它的排序原則。
由于時(shí)間問題,本篇介紹的會(huì)有點(diǎn)倉(cāng)促,不足之處,敬請(qǐng)指出,下期會(huì)繼續(xù)介紹~~~
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:【大數(shù)據(jù)之Hbase】-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://ef60e0e.cn/article/djieis.html