1. HBase數(shù)據(jù)庫(kù)介紹
HBase產(chǎn)生背景
自1970年以來(lái),關(guān)系數(shù)據(jù)庫(kù)用于數(shù)據(jù)存儲(chǔ)和維護(hù)有關(guān)問題的解決方案麻敌。大數(shù)據(jù)的出現(xiàn)后诲宇,好多公司實(shí)現(xiàn)處理大數(shù)據(jù)并從中受益,并開始選擇像Hadoop的解決方案岁歉。Hadoop使用分布式文件系統(tǒng)得运,用于存儲(chǔ)大數(shù)據(jù),并使用MapReduce來(lái)處理锅移。Hadoop擅長(zhǎng)于存儲(chǔ)各種格式的龐大的數(shù)據(jù)熔掺,任意的格式甚至非結(jié)構(gòu)化的處理。
Hadoop的特點(diǎn):
對(duì)于任意格式的龐大數(shù)據(jù)集非剃,Hadoop可以做到安全存儲(chǔ)
但是對(duì)于需要在龐大數(shù)據(jù)集做針對(duì)于單條記錄的增刪改查是做不到的置逻。
Hadoop的限制:
Hadoop只能執(zhí)行批量處理,并且只以順序方式訪問數(shù)據(jù)备绽。這意味著必須搜索整個(gè)數(shù)據(jù)集券坞,即使是最簡(jiǎn)單的搜索工作鬓催。當(dāng)處理結(jié)果在另一個(gè)龐大的數(shù)據(jù)集,也是按順序處理一個(gè)巨大的數(shù)據(jù)集报慕。在這一點(diǎn)上深浮,一個(gè)新的解決方案,需要訪問數(shù)據(jù)中的任何點(diǎn)(隨機(jī)訪問)單元眠冈。
Hive的特點(diǎn):
對(duì)于存儲(chǔ)在HDFS上的結(jié)構(gòu)化的數(shù)據(jù)飞苇,如果增加一些描述這些數(shù)據(jù)的元數(shù)據(jù)信息,那么我們可以把存儲(chǔ)在HDFS上的數(shù)據(jù)抽象成一張二維表格蜗顽,使用Hive進(jìn)行各種Insert/Select操作布卡。但是Hive還是天生不支持對(duì)于單條記錄的增刪改查,也不是設(shè)計(jì)用來(lái)做單條記錄的增刪改查的雇盖。
Hadoop隨機(jī)存取數(shù)據(jù)庫(kù)
應(yīng)用程序忿等,如HBase,Cassandra崔挖,CouchDB贸街,Dynamo 和 MongoDB 都是一些存儲(chǔ)大量數(shù)據(jù)和以隨機(jī)方式訪問數(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)景開始考慮數(shù)據(jù)存儲(chǔ)橫向水平擴(kuò)展,使得存儲(chǔ)服務(wù)可以增加/刪除脓鹃,而目前的關(guān)系型數(shù)據(jù)庫(kù)更專注于一臺(tái)機(jī)器
HBase簡(jiǎn)介
HBase 是 Hadoop Database 的簡(jiǎn)稱逸尖,Hadoop Database,是一個(gè)高可靠性瘸右、高性能娇跟、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng)太颤,利用 HBase 技術(shù)可在廉價(jià) PC Server 上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群苞俘。HBase項(xiàng)目是由 Powerset 公司的 Chad Walters 和 Jim Kelleman 在2006年末發(fā)起,根據(jù) Google 的 Chang等人發(fā)表的論文"Bigtable:A Distributed Storage System for Strctured Data"來(lái)設(shè)計(jì)的龄章。
2007年10月發(fā)布了第一個(gè)版本吃谣。
2010年5月,HBase 從 Hadoop 子項(xiàng)目升級(jí)成 Apache 頂級(jí)項(xiàng)目瓦堵。
HBase官網(wǎng)簡(jiǎn)介
官網(wǎng):http://hbase.apache.org/
1基协、Apache HBase? is the Hadoop database, a distributed, scalable, big data store.
2、Use Apache HBase? when you need random, realtime read/write access to your Big Data.
3菇用、This project's goal is the hosting of very large tables -- billions of rows X millions of columns -- atop clusters of commodity hardware.
4澜驮、Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google's Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.
HBase 是 BigTable 的開源(源碼使用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ī)的讀寫訪問趴拧。
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)
與 Hadoop 一樣,HBase 目標(biāo)主要依靠橫向擴(kuò)展屁倔,通過不斷增加廉價(jià)的商用服務(wù)器脑又,來(lái)增加計(jì)算和存儲(chǔ)能力。所以锐借,HBase 是一個(gè)通過大量廉價(jià)機(jī)器解決海量數(shù)據(jù)的高速存儲(chǔ)和讀取的分布式數(shù)據(jù)庫(kù)解決方案
HBase特點(diǎn)總結(jié)
以下五點(diǎn)是HBase這個(gè)NoSQL數(shù)據(jù)庫(kù)的要點(diǎn):
1问麸、高并發(fā),以擴(kuò)展钞翔,解決海量數(shù)據(jù)集的隨機(jī)實(shí)時(shí)增刪改查
2严卖、HBase本質(zhì)依然是Key-Value數(shù)據(jù)庫(kù),查詢數(shù)據(jù)功能很簡(jiǎn)單嗅战,不支持join等復(fù)雜操作(可通過Hive支持來(lái)實(shí)現(xiàn)多表join等復(fù)雜操作)
3妄田、不支持復(fù)雜的事務(wù)俺亮,只支持行級(jí)事務(wù)
4驮捍、HBase中支持的數(shù)據(jù)類型:byte[](底層所有數(shù)據(jù)的存儲(chǔ)都是字節(jié)數(shù)組)
5、主要用來(lái)存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)脚曾。
HBase中的表的特點(diǎn)
1东且、大:一個(gè)表可以有上十億行,上百萬(wàn)列
2本讥、面向列:列可以靈活指定珊泳,面向列(族)的存儲(chǔ)和權(quán)限控制,列(簇)獨(dú)立檢索拷沸。
3色查、稀疏:對(duì)于為空(null)的列,并不占用存儲(chǔ)空間撞芍,因此秧了,表可以設(shè)計(jì)的非常稀疏。
4序无、無(wú)嚴(yán)格模式:每行都有一個(gè)可排序的主鍵和任意多的列验毡,列可以根據(jù)需要?jiǎng)討B(tài)的增加衡创,同一張表中不同的行可以有截然不同的列
HBase特點(diǎn)總結(jié):
1、海量存儲(chǔ)
HBase適合存儲(chǔ)PB級(jí)別的海量數(shù)據(jù)晶通,在PB級(jí)別的數(shù)據(jù)以及采用廉價(jià)PC存儲(chǔ)的情況下璃氢,能在幾十到百毫秒內(nèi)返回?cái)?shù)據(jù)。這與HBase的極易擴(kuò)展性息息相關(guān)狮辽。正式因?yàn)镠Base良好的擴(kuò)展性一也,才為海量數(shù)據(jù)的存儲(chǔ)提供了便利。
2喉脖、列式存儲(chǔ)
這里的列式存儲(chǔ)其實(shí)說(shuō)的是列族存儲(chǔ)塘秦,Hbase是根據(jù)列族來(lái)存儲(chǔ)數(shù)據(jù)的。列族下面可以有非常多的列动看,列族在創(chuàng)建表的時(shí)候就必須指定尊剔。
3、極易擴(kuò)展
HBase的擴(kuò)展性主要體現(xiàn)在兩個(gè)方面菱皆,一個(gè)是基于上層處理能力(RegionServer)的擴(kuò)展须误,一個(gè)是基于存儲(chǔ)的擴(kuò)展(HDFS)。通過橫向添加RegionSever的機(jī)器仇轻,進(jìn)行水平擴(kuò)展京痢,提升HBase上層的處理能力,提升HBase服務(wù)更多Region的能力篷店。
備注:RegionServer的作用是管理region祭椰、承接業(yè)務(wù)的訪問,這個(gè)后面會(huì)詳細(xì)的介紹通過橫向添加
DataNode的機(jī)器疲陕,進(jìn)行存儲(chǔ)層擴(kuò)容方淤,提升HBase的數(shù)據(jù)存儲(chǔ)能力和提升后端存儲(chǔ)的讀寫能力。
4蹄殃、高并發(fā)
由于目前大部分使用HBase的架構(gòu)携茂,都是采用的廉價(jià)PC,因此單個(gè)IO的延遲其實(shí)并不小诅岩,一般在幾十到上百ms之間讳苦。這里說(shuō)的高并發(fā),主要是在并發(fā)的情況下吩谦,HBase的單個(gè)IO延遲下降并不多鸳谜。能獲得高并發(fā)、低延遲的服務(wù)式廷。
5咐扭、稀疏
稀疏主要是針對(duì)HBase列的靈活性,在列族中,你可以指定任意多的列草描,在列數(shù)據(jù)為空的情況下览绿,是不會(huì)占用存儲(chǔ)空間的。
HBase核心物理概念
表結(jié)構(gòu)邏輯視圖:
關(guān)于圖的標(biāo)注:
箭頭:表示索引順序
紅色數(shù)據(jù):key
黃色數(shù)據(jù):value
上圖總結(jié):
索引數(shù)據(jù)的流程:table ---> rowkey ---> column family ---> column ---> timestamp
行剿肽健(rowkey):HBase中的每張表饿敲,都會(huì)按照rowkey全局排序
列簇(Column Family):包含一組列,列在插入數(shù)據(jù)之前指定逛绵,列簇就必須在建表的時(shí)候指定
列(Column):一個(gè)列簇中會(huì)包含多個(gè)列怀各,并且可以不同
時(shí)間戳(TimeStamp):每個(gè)列的值都可以保存多個(gè)版本,使用時(shí)間戳來(lái)表示术浪,并且按照時(shí)間戳由近到遠(yuǎn)排序
理解MySQL幫助理解HBase:
1瓢对、RDBMS完全可以抽象成是一張二維表格,表由行和列組成胰苏。由行和列確定一個(gè)唯一的值
2硕蛹、HBase本質(zhì)是key-value數(shù)據(jù)庫(kù),key是行健rowkey硕并,value是所有真實(shí)key-value的集合
3法焰、HBase也可以抽象成為一張四維表格,四維分別由行健RowKey倔毙,列簇Column Family埃仪,列Column和時(shí)間戳Timestamp組成。
4陕赃、其中卵蛉,一張HBase的所有列劃分為若干個(gè)列簇 (Column Family)
行鍵(RowKey)
與NoSQL數(shù)據(jù)庫(kù)們一樣,RowKey是用來(lái)檢索記錄的主鍵么库。訪問HBase Table中的行傻丝,只有三種方式:
1、通過單個(gè)row key訪問
2廊散、通過row key的range
3桑滩、全表掃描
RowKey行鍵可以是任意字符串(最大長(zhǎng)度是64KB梧疲,實(shí)際應(yīng)用中長(zhǎng)度一般為10-100bytes)允睹,最好是16。
在HBase內(nèi)部幌氮,RowKey保存為字節(jié)數(shù)組缭受。HBase會(huì)對(duì)表中的數(shù)據(jù)按照rowkey排序(字典順序)
存儲(chǔ)時(shí),數(shù)據(jù)按照RowKey的字典序(byte order)排序存儲(chǔ)该互。設(shè)計(jì)Key時(shí)米者,要充分排序存儲(chǔ)這個(gè)特性,將經(jīng)常一起讀取的行存儲(chǔ)放到一起。(位置相關(guān)性)
列簇(Column Family)
HBase表中的每個(gè)列蔓搞,都?xì)w屬與某個(gè)列簇胰丁。列簇是表的Schema的一部分(而列不是),必須在創(chuàng)建表的時(shí)候指定喂分。指定好了列簇就不能更改锦庸。列簇可以增加或者刪除,刪除的時(shí)候會(huì)刪除這個(gè)列簇中的所有數(shù)據(jù)列名都以列簇作為前綴蒲祈。例如 courses:history 甘萧, courses:math 都屬于courses這個(gè)列簇,訪問控制梆掸、磁盤和內(nèi)存的使用統(tǒng)計(jì)等都是在列簇層面進(jìn)行的扬卷。
列簇越多,在取一行數(shù)據(jù)時(shí)所要參與IO酸钦、搜尋的文件就越多怪得,所以,如果沒有必要卑硫,不要設(shè)置太多的列簇汇恤,官網(wǎng)推薦是小于等于3(最好就一個(gè)列簇)
時(shí)間戳(TimeStamp)
HBase 中通過 RowKey 和 Column 確定的為一個(gè)存儲(chǔ)單元稱為 Cell。每個(gè) Cell 都保存著同一份數(shù)據(jù)的多個(gè)版本拔恰。版本通過時(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ù)排在最前面夷恍。HBase在查詢的時(shí)候,默認(rèn)返回最新版本/最近的數(shù)據(jù)媳维。如果需要讀取舊版本的數(shù)據(jù)酿雪,可以指定時(shí)間戳
為了避免數(shù)據(jù)存在過多版本造成的的管理(包括存儲(chǔ)和索引)負(fù)擔(dān),HBase提供了兩種數(shù)據(jù)版本回收方式:
保存數(shù)據(jù)的最后n個(gè)版本
保存最近一段時(shí)間內(nèi)的版本(設(shè)置數(shù)據(jù)的生命周期TTL)
用戶可以針對(duì)每個(gè)列簇進(jìn)行設(shè)置侄刽。
單元格(Cell)
由 {RowKey, Column(=<Column Family> + <Qualifier>), Version} 唯一確定的單元指黎,Cell中的
數(shù)據(jù)是沒有類型的,全部是字節(jié)碼形式存儲(chǔ)
HBase應(yīng)用場(chǎng)景
1州丹、半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
對(duì)于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或雜亂無(wú)章很難按一個(gè)概念去進(jìn)行抽取的數(shù)據(jù)適合用HBase醋安。而且HBase是面向列的杂彭,HBase支持動(dòng)態(tài)增加字段
2、記錄非常稀疏
RDBMS的行有多少列是固定的吓揪,為null的列浪費(fèi)了存儲(chǔ)空間亲怠。而HBase為null的Column是不會(huì)被存儲(chǔ)的,這樣既節(jié)省了空間又提高了讀性能柠辞。
3赁炎、多版本數(shù)據(jù)
對(duì)于需要存儲(chǔ)變動(dòng)歷史記錄的數(shù)據(jù),使用HBase就再合適不過了钾腺。HBase根據(jù)Row key和Column key定位到的Value可以有任意數(shù)量的版本值徙垫。
4、超大數(shù)據(jù)量的隨機(jī)放棒、實(shí)時(shí)讀寫
當(dāng)數(shù)據(jù)量越來(lái)越大姻报,RDBMS數(shù)據(jù)庫(kù)撐不住了,就出現(xiàn)了讀寫分離策略间螟,通過一個(gè)Master專門負(fù)責(zé)寫操作吴旋,多個(gè)Slave負(fù)責(zé)讀操作,服務(wù)器成本倍增厢破。隨著壓力增加荣瑟,Master撐不住了,這時(shí)就要分庫(kù)了摩泪,把關(guān)聯(lián)不大的數(shù)據(jù)分開部署笆焰,一些join查詢不能用了,需要借助中間層见坑。隨著數(shù)據(jù)量的進(jìn)一步增加嚷掠,一個(gè)表的記錄越來(lái)越大,查詢就變得很慢荞驴,于是又得搞分表不皆,比如按ID取模分成多個(gè)表以減少單個(gè)表的記錄數(shù)。經(jīng)歷過這些事的人都知道過程是多么的折騰熊楼。采用HBase就簡(jiǎn)單了霹娄,只需要加機(jī)器即可,HBase會(huì)自動(dòng)水平切分?jǐn)U展鲫骗,跟Hadoop的無(wú)縫集成保障了其數(shù)據(jù)可靠性(HDFS)和海量數(shù)據(jù)分析的高性能(MapReduce)犬耻。
5、查詢簡(jiǎn)單
不涉及到復(fù)雜的Join查詢挎峦,基于RowKey的簡(jiǎn)單查詢或者RowKey的范圍查詢
HBase的訪問接口
1香追、Native Java API,最常規(guī)和高效的訪問方式坦胶,適合Hadoop MapReduce Job并行批處理HBase表數(shù)據(jù)
2、HBase Shell,HBase的命令行工具顿苇,最簡(jiǎn)單的接口峭咒,適合HBase管理使用
3、Thrift Gateway纪岁,利用Thrift序列化技術(shù)凑队,支持C++,PHP幔翰,Python等多種語(yǔ)言漩氨,適合其他異構(gòu)系統(tǒng)在線訪問HBase表數(shù)據(jù)
4、REST Gateway遗增,支持REST 風(fēng)格的Http API訪問HBase, 解除了語(yǔ)言限制
5叫惊、Pig,可以使用Pig Latin流式編程語(yǔ)言來(lái)操作HBase中的數(shù)據(jù)做修,和Hive類似霍狰,本質(zhì)最終也是編譯成MapReduce Job來(lái)處理HBase表數(shù)據(jù),適合做數(shù)據(jù)統(tǒng)計(jì)
6饰及、Hive蔗坯,使用Hive整合HBae,能實(shí)現(xiàn)針對(duì)單條記錄的增刪改查燎含,也能假設(shè)一個(gè)SQL客戶端宾濒,針對(duì)HBaes中的數(shù)據(jù)進(jìn)行查詢分析。
2. HBase集群結(jié)構(gòu)
系統(tǒng)架構(gòu)
HBase也是一個(gè)類似于HDFS的主從架構(gòu)體系屏箍,依托于zookeeper實(shí)現(xiàn)高可用
HBase核心角色
HMaster
HBase的主節(jié)點(diǎn)鼎兽,負(fù)責(zé)整個(gè)集群的狀態(tài)感知、負(fù)載分配铣除、負(fù)責(zé)用戶表的元數(shù)據(jù)(schema)管理(可以配置多個(gè)用來(lái)實(shí)現(xiàn)HA)谚咬,HMaster負(fù)載壓力相對(duì)于HDFS的NameNode會(huì)小很多。HBase的HMaster其實(shí)就算是宕機(jī)一段時(shí)間也可以正常對(duì)外提供服務(wù)的(要搞清楚為什么)尚粘。
RegionServer:
HBase中真正負(fù)責(zé)管理Region的服務(wù)器择卦,也就是負(fù)責(zé)為客戶端進(jìn)行表數(shù)據(jù)讀寫的服務(wù)器。每一臺(tái)RegionServer會(huì)管理很多的Region郎嫁,一個(gè)RegionServer上面管理的所有的region不屬于同一張表秉继。負(fù)責(zé)Region的Split,負(fù)責(zé)和底層的HDFS的存儲(chǔ)交互泽铛,負(fù)責(zé)StoreFile的Compact尚辑。
ZooKeeper
整個(gè)HBase中的主從節(jié)點(diǎn)協(xié)調(diào),元數(shù)據(jù)的入口盔腔,主節(jié)點(diǎn)之間的選舉杠茬,集群節(jié)點(diǎn)之間的上下線感知……都是通過ZooKeeper來(lái)實(shí)現(xiàn)
HDFS
用來(lái)存儲(chǔ)HBase的系統(tǒng)文件月褥,或者表的Region文件
Client
Client包含了訪問HBase的接口,另外Client還維護(hù)了對(duì)應(yīng)的Cache來(lái)加速HBase的訪問瓢喉,比如Cache的.META.元數(shù)據(jù)的信息宁赤。
Region
是HBase將一個(gè)表中的所有數(shù)據(jù)按照RowKey的不同范圍進(jìn)行切割的邏輯單元,每個(gè)Region負(fù)責(zé)一定范圍數(shù)據(jù)的讀寫訪問栓票。Region由RegionServer負(fù)責(zé)管理决左。HBase中的Region的概念就和HDFS中的數(shù)據(jù)塊的概念差不多,Region是HBase表切分出來(lái)的一個(gè)分片走贪。數(shù)據(jù)塊是HDFS中的一個(gè)大文件切分出來(lái)的一個(gè)分片佛猛。
3. HBase和Hive的比較
相同點(diǎn)
1、HBase和Hive都是架構(gòu)在Hadoop之上坠狡,用HDFS做底層的數(shù)據(jù)存儲(chǔ)继找,用MapReduce做數(shù)據(jù)計(jì)算
不同點(diǎn)
1、Hive是建立在Hadoop之上為了降低MapReduce編程復(fù)雜度的ETL工具擦秽。
HBase是為了彌補(bǔ)Hadoop對(duì)實(shí)時(shí)操作的缺陷
2码荔、Hive表是純邏輯表,因?yàn)镠ive的本身并不能做數(shù)據(jù)存儲(chǔ)和計(jì)算感挥,而是完全依賴Hadoop
HBase是物理表缩搅,提供了一張超大的內(nèi)存Hash表來(lái)存儲(chǔ)索引,方便查詢
3触幼、Hive是數(shù)據(jù)倉(cāng)庫(kù)工具硼瓣,需要全表掃描,就用Hive置谦,因?yàn)镠ive是文件存儲(chǔ)
HBase是數(shù)據(jù)庫(kù)堂鲤,需要索引訪問,則用HBase媒峡,因?yàn)镠Base是面向列的NoSQL數(shù)據(jù)庫(kù)
4瘟栖、Hive表中存入數(shù)據(jù)(文件)時(shí)不做校驗(yàn),屬于讀模式存儲(chǔ)系統(tǒng)
HBase表插入數(shù)據(jù)時(shí)谅阿,會(huì)和RDBMS一樣做Schema校驗(yàn)半哟,所以屬于寫模式存儲(chǔ)系統(tǒng)
5、Hive不支持單行記錄操作签餐,數(shù)據(jù)處理依靠MapReduce寓涨,操作延時(shí)高
HBase支持單行記錄的CRUD,并且是實(shí)時(shí)處理氯檐,效率比Hive高得多