目錄
正文
自 1970 年以來(lái),關(guān)系數(shù)據(jù)庫(kù)用于數(shù)據(jù)存儲(chǔ)和維護(hù)有關(guān)問(wèn)題的解決方案。大數(shù)據(jù)的出現(xiàn)后, 好多公司實(shí)現(xiàn)處理大數(shù)據(jù)并從中受益,并開(kāi)始選擇像 Hadoop 的解決方案。Hadoop 使用分 布式文件系統(tǒng),用于存儲(chǔ)大數(shù)據(jù),并使用 MapReduce 來(lái)處理。Hadoop 擅長(zhǎng)于存儲(chǔ)各種格式 的龐大的數(shù)據(jù),任意的格式甚至非結(jié)構(gòu)化的處理。
Hadoop 的限制
Hadoop 只能執(zhí)行批量處理,并且只以順序方式訪問(wèn)數(shù)據(jù)。這意味著必須搜索整個(gè)數(shù)據(jù)集, 即使是最簡(jiǎn)單的搜索工作。 當(dāng)處理結(jié)果在另一個(gè)龐大的數(shù)據(jù)集,也是按順序處理一個(gè)巨大的數(shù)據(jù)集。在這一點(diǎn)上,一個(gè) 新的解決方案,需要訪問(wèn)數(shù)據(jù)中的任何點(diǎn)(隨機(jī)訪問(wèn))單元。
Hadoop 隨機(jī)存取數(shù)據(jù)庫(kù)
應(yīng)用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存儲(chǔ)大量數(shù)據(jù)和 以隨機(jī)方式訪問(wèn)數(shù)據(jù)的數(shù)據(jù)庫(kù)。
總結(jié):
(1)海量數(shù)據(jù)量存儲(chǔ)成為瓶頸,單臺(tái)機(jī)器無(wú)法負(fù)載大量數(shù)據(jù)
(2)單臺(tái)機(jī)器 IO 讀寫請(qǐng)求成為海量數(shù)據(jù)存儲(chǔ)時(shí)候高并發(fā)大規(guī)模請(qǐng)求的瓶頸
(3)隨著數(shù)據(jù)規(guī)模越來(lái)越大,大量業(yè)務(wù)場(chǎng)景開(kāi)始考慮數(shù)據(jù)存儲(chǔ)橫向水平擴(kuò)展,使得存儲(chǔ)服 務(wù)可以增加/刪除,而目前的關(guān)系型數(shù)據(jù)庫(kù)更專注于一臺(tái)機(jī)器
HBase 是 BigTable 的開(kāi)源(源碼使用 Java 編寫)版本。是 Apache Hadoop 的數(shù)據(jù)庫(kù),是建 立在 HDFS 之上,被設(shè)計(jì)用來(lái)提供高可靠性、高性能、列存儲(chǔ)、可伸縮、多版本的 NoSQL 的分布式數(shù)據(jù)存儲(chǔ)系統(tǒng),實(shí)現(xiàn)對(duì)大型數(shù)據(jù)的實(shí)時(shí)、隨機(jī)的讀寫訪問(wèn)。
HBase 依賴于 HDFS 做底層的數(shù)據(jù)存儲(chǔ),BigTable 依賴 Google GFS 做數(shù)據(jù)存儲(chǔ)
HBase 依賴于 MapReduce 做數(shù)據(jù)計(jì)算,BigTable 依賴 Google MapReduce 做數(shù)據(jù)計(jì)算
HBase 依賴于 ZooKeeper 做服務(wù)協(xié)調(diào),BigTable 依賴 Google Chubby 做服務(wù)協(xié)調(diào)
NoSQL = NO SQL
NoSQL = Not Only SQL:會(huì)有一些把 NoSQL 數(shù)據(jù)的原生查詢語(yǔ)句封裝成 SQL,比如 HBase 就有 Phoenix 工具
NoSQL:hbase, redis, mongodb
RDBMS:mysql,oracle,sql server,db2
① 它介于 NoSQL 和 RDBMS 之間,僅能通過(guò)主鍵(rowkey)和主鍵的 range 來(lái)檢索數(shù)據(jù)
② HBase 查詢數(shù)據(jù)功能很簡(jiǎn)單,不支持 join 等復(fù)雜操作
③ 不支持復(fù)雜的事務(wù),只支持行級(jí)事務(wù)(可通過(guò) hive 支持來(lái)實(shí)現(xiàn)多表 join 等復(fù)雜操作)。
④ HBase 中支持的數(shù)據(jù)類型:byte[](底層所有數(shù)據(jù)的存儲(chǔ)都是字節(jié)數(shù)組)
⑤ 主要用來(lái)存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。
結(jié)構(gòu)化:數(shù)據(jù)結(jié)構(gòu)字段含義確定,清晰,典型的如數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)
半結(jié)構(gòu)化:具有一定結(jié)構(gòu),但語(yǔ)義不夠確定,典型的如 HTML 網(wǎng)頁(yè),有些字段是確定的(title), 有些不確定(table)
非結(jié)構(gòu)化:雜亂無(wú)章的數(shù)據(jù),很難按照一個(gè)概念去進(jìn)行抽取,無(wú)規(guī)律性
與 Hadoop 一樣,HBase 目標(biāo)主要依靠橫向擴(kuò)展,通過(guò)不斷增加廉價(jià)的商用服務(wù)器,來(lái)增加 計(jì)算和存儲(chǔ)能力。
1、大:一個(gè)表可以有上十億行,上百萬(wàn)列
2、面向列:面向列(族)的存儲(chǔ)和權(quán)限控制,列(簇)獨(dú)立檢索。
3、稀疏:對(duì)于為空(null)的列,并不占用存儲(chǔ)空間,因此,表可以設(shè)計(jì)的非常稀疏。
4、無(wú)模式:每行都有一個(gè)可排序的主鍵和任意多的列,列可以根據(jù)需要?jiǎng)討B(tài)的增加,同一 張表中不同的行可以有截然不同的列
初次接觸HBase,可能看到以下描述會(huì)懵:“基于列存儲(chǔ)”,“稀疏MAP”,“RowKey”,“ColumnFamily”。
其實(shí)沒(méi)那么高深,我們需要分兩步來(lái)理解HBase, 就能夠理解為什么HBase能夠“快速地”“分布式地”處理“大量數(shù)據(jù)”了。
1.內(nèi)存結(jié)構(gòu)
2.文件存儲(chǔ)結(jié)構(gòu)
加入我們有如下一張表
Rowkey的概念和mysql中的主鍵是完全一樣的,Hbase使用Rowkey來(lái)唯一的區(qū)分某一行的數(shù)據(jù)。
由于Hbase只支持3中查詢方式:
1、基于Rowkey的單行查詢
2、基于Rowkey的范圍掃描
3、全表掃描
因此,Rowkey對(duì)Hbase的性能影響非常大,Rowkey的設(shè)計(jì)就顯得尤為的重要。設(shè)計(jì)的時(shí)候要兼顧基于Rowkey的單行查詢也要鍵入Rowkey的范圍掃描。具體Rowkey要如何設(shè)計(jì)后續(xù)會(huì)整理相關(guān)的文章做進(jìn)一步的描述。這里大家只要有一個(gè)概念就是Rowkey的設(shè)計(jì)極為重要。
rowkey 行鍵可以是任意字符串(最大長(zhǎng)度是 64KB,實(shí)際應(yīng)用中長(zhǎng)度一般為 10-100bytes),最好是 16。在 HBase 內(nèi)部,rowkey 保存為字節(jié)數(shù)組。HBase 會(huì)對(duì)表中的數(shù)據(jù)按照 rowkey 排序 (字典順序)
列,可理解成MySQL列。
列族, HBase引入的概念。
Hbase通過(guò)列族劃分?jǐn)?shù)據(jù)的存儲(chǔ),列族下面可以包含任意多的列,實(shí)現(xiàn)靈活的數(shù)據(jù)存取。就像是家族的概念,我們知道一個(gè)家族是由于很多個(gè)的家庭組成的。列族也類似,列族是由一個(gè)一個(gè)的列組成(任意多)。
Hbase表的創(chuàng)建的時(shí)候就必須指定列族。就像關(guān)系型數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候必須指定具體的列是一樣的。
Hbase的列族不是越多越好,官方推薦的是列族最好小于或者等于3。我們使用的場(chǎng)景一般是1個(gè)列族。
TimeStamp對(duì)Hbase來(lái)說(shuō)至關(guān)重要,因?yàn)樗菍?shí)現(xiàn)Hbase多版本的關(guān)鍵。在Hbase中使用不同的timestame來(lái)標(biāo)識(shí)相同rowkey行對(duì)應(yīng)的不通版本的數(shù)據(jù)。
HBase 中通過(guò) rowkey 和 columns 確定的為一個(gè)存儲(chǔ)單元稱為 cell。每個(gè) cell 都保存著同一份 數(shù)據(jù)的多個(gè)版本。版本通過(guò)時(shí)間戳來(lái)索引。時(shí)間戳的類型是 64 位整型。時(shí)間戳可以由 hbase(在數(shù)據(jù)寫入時(shí)
自動(dòng))賦值,此時(shí)時(shí)間戳是精確到毫秒的當(dāng)前系統(tǒng)時(shí)間。時(shí)間戳也可以由 客戶顯式賦值。如果應(yīng)用程序要避免數(shù)據(jù)版本沖突,就必須自己生成具有唯一性的時(shí)間戳。 每個(gè) cell 中,不同版本的數(shù)據(jù)按照時(shí)間
倒序排序,即最新的數(shù)據(jù)排在最前面。
聯(lián)系客服