一授帕、介紹
1.hbase是一個(gè)高緯度同木,面向列,高性能跛十,高可靠的分布式實(shí)時(shí)數(shù)據(jù)庫(kù)
2.hbase是一個(gè)nosql數(shù)據(jù)庫(kù)彤路,可以存儲(chǔ)結(jié)構(gòu)化,半結(jié)構(gòu)化芥映,非結(jié)構(gòu)化的數(shù)據(jù)
二洲尊、數(shù)據(jù)模型
高維數(shù)據(jù)庫(kù),4個(gè)維度確定一個(gè)單元格
數(shù)據(jù)存儲(chǔ)的格式是字節(jié)數(shù)組
1.rowkey
? ? 唯一確定一行數(shù)據(jù)
? ? 最多64kb
? ? 按字典排序
2.列族
? ? 創(chuàng)建表的時(shí)候定義
? ? 一個(gè)列族可以有多個(gè)列
? ? 一個(gè)列族的數(shù)據(jù)放到同一個(gè)目錄下
3.列名
? ? 動(dòng)態(tài)添加
? ? 每一行的列的個(gè)數(shù)和名稱可以不同
4.版本號(hào)
? ? 一般用時(shí)間戳來(lái)充當(dāng)版本號(hào)
? ? 默認(rèn)是降序排序的奈偏,自動(dòng)獲取最新版本
? ? 每個(gè)單元格可以有多個(gè)版本
三坞嘀、架構(gòu)
1.zookeeper
? ? 監(jiān)控regionserver的上下線信息,通知master
? ? 存儲(chǔ)region的尋址入口(表的增刪改查等dml操作不通過(guò)master來(lái)操作)
? ? 保存hbase的元數(shù)據(jù)信息
? ? 保證集群中只有一個(gè)可用的master
2.master
? ? 若發(fā)現(xiàn)失效的regionserver(由zookeeper告知)惊来,會(huì)移動(dòng)這臺(tái)regionserver的region到其他機(jī)器上
? ? master管理表的創(chuàng)建姆吭,刪除,修改唁盏、重命名等ddl操作
? ? 負(fù)責(zé)集群的負(fù)載均衡
? ? 給regionserver分配region
3.regionserver
????切分過(guò)大的region
????負(fù)責(zé)region的io讀寫(xiě)請(qǐng)求? ??
4.region
? ? 對(duì)應(yīng)的是一張表中的一段連續(xù)的數(shù)據(jù)
? ? 默認(rèn)一個(gè)region對(duì)應(yīng)一張表
? ? 隨著表的數(shù)據(jù)越來(lái)越多内狸,region分裂成2個(gè),后面會(huì)不斷分裂
5.hlog
? ????存放操作日志厘擂,數(shù)據(jù)存放是首先將操作日志放入hlog中昆淡,保證以后regionserver失效時(shí),hbase能將其恢復(fù)
6.store
? ? 一個(gè)store中由一個(gè)memstore和0-多個(gè)storefile
? ? 一個(gè)store對(duì)應(yīng)一個(gè)列族
7.memstore和storefile
? ? 數(shù)據(jù)存放的時(shí)候首先會(huì)寫(xiě)入到memstore內(nèi)存緩沖區(qū)中刽严,達(dá)到memstore的閾值128M的時(shí)候會(huì)溢寫(xiě)到storefile中昂灵,最后storefile會(huì)以hfile的形式存入hdfs中
8.compact
? ? 小合并:挑一些文件比較小的進(jìn)行合并,只挑一部分文件合并
? ? 大合并:將所有的storefile文件進(jìn)行合并
? ? 在合并的時(shí)候會(huì)從磁盤層面刪除數(shù)據(jù)
四舞萄、API
1.put
????可以批量插入眨补,List<Put>
2.get
????可以批量獲取,List<Get>
3.scan(重要)
? ? 把握rowkey時(shí)字典排序的原則
4.delete
? ? 刪除數(shù)據(jù)的時(shí)候倒脓,只會(huì)標(biāo)記一個(gè)刪除狀態(tài)的表示撑螺,并不會(huì)馬上刪除數(shù)據(jù)
五、過(guò)濾器
1.pagefilter
2.valuefilter
3.singlecolumnvaluefilter
4.keyonlyfilter
5.prefixfilter
六崎弃、protobuf
? ? 1.一個(gè)第三方插件甘晤,可以產(chǎn)生java類代碼,里面由序列化和反序列化的方法
? ? 2.可以將多個(gè)字段的數(shù)據(jù)饲做,合并成一個(gè)字段线婚,然后通過(guò)序列化存儲(chǔ)到hbase的一個(gè)字段中,節(jié)省磁盤空間
七盆均、性能優(yōu)化
1.預(yù)分區(qū)
? ? 提前分區(qū),減少split分區(qū)對(duì)集群的性能影響
? ? 數(shù)據(jù)遷移
2.熱點(diǎn)問(wèn)題
? ? 由于rowkey設(shè)計(jì)不合理導(dǎo)致的客戶端的讀寫(xiě)請(qǐng)求只會(huì)訪問(wèn)小部分的region,其他大部分的region訪問(wèn)不到,負(fù)載不均衡
? ? 解決:重新設(shè)計(jì)rowkey,取反,取hash,取模
? ? 無(wú)論是hash還取反,都會(huì)打散數(shù)據(jù),后期查詢的時(shí)候就不能通過(guò)scan方法遍歷數(shù)據(jù)
3.列族
? ? 一張表列族的個(gè)數(shù)一般不超過(guò)兩個(gè),當(dāng)一個(gè)store中的memstore發(fā)生溢寫(xiě)的時(shí)候,相鄰的memstore也會(huì)發(fā)生溢寫(xiě),這樣對(duì)集群的io消耗比較大
4.blockcache
? ? 查詢數(shù)據(jù)的時(shí)候,首先查詢memstore,在查詢blockcache,最后查看storefile中的文件
? ? 當(dāng)從磁盤文件查出數(shù)據(jù)后,就會(huì)放入到blockcache中
? ? blockcache數(shù)據(jù)隊(duì)列的三個(gè)級(jí)別:第一次查詢到的數(shù)據(jù)會(huì)放入single,多次查詢到的數(shù)據(jù)存放到multi中,除非手動(dòng)指明某些數(shù)據(jù)放入到in-memory中,否者數(shù)據(jù)不會(huì)存放到這個(gè)級(jí)別中
5.compact
? ? 小合并:有多種因素決定,最少三個(gè)符合條件的文件,最多10個(gè)文件,文件不能太大,大于某個(gè)參數(shù),合并的時(shí)候,優(yōu)先選擇創(chuàng)建時(shí)間比較早的文件
? ? 大合并:所有的文件都合并,io消耗大,默認(rèn)7天,優(yōu)化:關(guān)閉自動(dòng)合并,改成手動(dòng)合并