hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)
基本概念:
HBase是列簇式Key-Value存儲系統(tǒng),構(gòu)建在HDFS之上的、支持隨機插入和刪除。總結(jié)Hbase的架構(gòu)核心,就兩個字“有序” 。
磁盤的讀寫,隨機與順序,相差3個數(shù)量級(也就是300倍左右)【注意這里與存儲介質(zhì)無關(guān)】
邏輯上:
物理上:
Hbase 是由三種類型的 server 組成的的主從式(master-slave)架構(gòu):存儲結(jié)構(gòu):
rowkey
column family
Region Server的內(nèi)存主要分為兩部分
為何如此快
順序?qū)懭?#xff0c;與順序讀取,是最重要的。推數(shù)快(write):
- WAL:(Write Ahead Log) 是分布式文件系統(tǒng)上的一個文件,用于存儲新的還未被持久化存儲的數(shù)據(jù),它被用來做故障恢復(fù)。
- MemStore:(寫緩存),在內(nèi)存中存儲了新的還未被持久化到硬盤的數(shù)據(jù)。當被寫入硬盤時,數(shù)據(jù)會首先被排序,注意每個 Region 的每個 Column Family 都會有一個 MemStore。
- 視覺層面的快,內(nèi)部并未持久化:
取數(shù)快(read):
- Meta table(它其實是一張?zhí)厥獾?HBase 表),包含了集群中所有 regions 的位置信息。Zookeeper 保存了這個 Meta table 的位置
- 因為使用了LSM樹型結(jié)構(gòu)。
- 客戶端讀寫數(shù)據(jù),實際上分了兩步(強一致性保證)
- 定位:從 Meta table 獲取 rowkey 屬于哪個 Region Server 管理。
- 取數(shù):去相應(yīng)的 Region Server 讀寫數(shù)據(jù)。
內(nèi)部優(yōu)化:
RegionServer內(nèi)存碎片增多,當生存時間較長的數(shù)據(jù)從堆的老年代空間刷寫到磁盤,內(nèi)存碎片增多,連續(xù)存儲空間減少,就會產(chǎn)生內(nèi)存孔洞。
解決方案: 啟用本地memstore分配緩存區(qū)(Memstore-Local Allocation Buffers,MSLAB),也就是允許從堆中分配相同大小的對象,一旦這些對象分配并且最終被回收,就會在堆中留下固定大小的孔洞,這些孔洞可被重復(fù)利用,GC就無需使應(yīng)用程序進程停頓來回收內(nèi)存空間
2. 讀放大(read amplification),每個 MemStore 可能會有多個 HFile:
解決方案:minor compaction,HBase 會自動合并一些小的 HFile,重寫成少量更大的 HFiles,它使用歸并排序算法,將小文件合并成大文件,有效減少 HFile 的數(shù)量。
3.寫放大(Write Amplification),major compaction 會重寫所有的 HFile,會產(chǎn)生大量的硬盤 I/O 和網(wǎng)絡(luò)開銷,它會將那些遠方的數(shù)據(jù)重新移回到離 region server 節(jié)點附近的地方。
4. region分裂(split)
一開始每個 table 默認只有一個 region。當一個 region 逐漸變得很大時,它會分裂(split)成兩個子 region,每個子 region 都包含了原來 region 一半的數(shù)據(jù)。
這兩個子 region 并行地在原來這個 region server 上創(chuàng)建,這個分裂動作會被報告給 HMaster。處于負載均衡的目的,HMaster 可能會將新的 region 遷移給其它 region server。
5. 字段占用空間,盡量小:
每行數(shù)據(jù)中不同版本的cell value會重復(fù)保存【rowkey,column family,column qualifier】,數(shù)據(jù)在進行持久化到HFile文件時、讀緩存(BlockCache)、寫緩存(MemStore)都會用這幾個字段,為了節(jié)省存儲空間、內(nèi)存空間和網(wǎng)絡(luò)傳輸數(shù)據(jù)量,這幾個字段值應(yīng)盡可能短。
rowkey的設(shè)計就要在讀寫性能、數(shù)據(jù)熱點、范圍掃描之間進行取舍的藝術(shù)。
3種Block Cache方案:
1. LRUBlockCache是最初的實現(xiàn)方案,也是默認的實現(xiàn)方案。
a. 將所有數(shù)據(jù)都放入JVM Heap中,交給JVM進行管理。
b. 將內(nèi)存從邏輯上分為了三塊:single-access區(qū)、mutil-access區(qū)、in-memory區(qū),分別占到整個BlockCache大小的25%、50%、25%。
c. 一次隨機讀中,一個Block塊從HDFS中加載出來之后首先放入signle區(qū)。
d. 后續(xù)如果有多次請求訪問到這塊數(shù)據(jù)的話,就會將這塊數(shù)據(jù)移到mutil-access區(qū)。
e. 而in-memory區(qū)表示數(shù)據(jù)可以常駐內(nèi)存,一般用來存放訪問頻繁、數(shù)據(jù)量小的數(shù)據(jù),比如元數(shù)據(jù),用戶也可以在建表的時候通過設(shè)置列族屬性IN-MEMORY= true將此列族放入in-memory區(qū)。
2. SlabCache,HBase 0.92版本實現(xiàn)了第二種方案。(已廢棄)
a. SlabCache BucketCache 這兩種采用了不同機制將部分數(shù)據(jù)存儲在堆外,交給HBase自己管理
3. BucketCache, HBase 0.96之后官方提供了另一種可選方案。(阿里提供的方案)
a. 這種演變過程是因為LRUBlockCache方案中JVM垃圾回收機制經(jīng)常會導(dǎo)致程序長時間暫停,而采用堆外內(nèi)存對數(shù)據(jù)進行管理可以有效避免這種情況發(fā)生。
b. 在初始化的時候就申請了一片固定大小的內(nèi)存作為緩存,緩存淘汰不再由 JVM管理,數(shù)據(jù)Block的緩存操作只是對這片空間的訪問和覆蓋,因而大大減少了內(nèi)存碎片的出現(xiàn),降低了Full GC發(fā)生的頻率。
總結(jié)
以上是生活随笔為你收集整理的hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分类变量 哑变量矩阵 指标矩阵_不懂数据
- 下一篇: exfat分配单元大小选多少_NTFS/