當(dāng)刪除HBase中的數(shù)據(jù)须妻,HBase會(huì)刪除存儲(chǔ)在HDFS上的數(shù)據(jù),而Hadoop的Sequence File是一個(gè)順序讀寫,批量處理的系統(tǒng)眶掌。那HBase怎么就能夠查詢到該記錄,并更新和刪除了數(shù)據(jù)呢巴碗?
答:HBase不會(huì)定位到需要?jiǎng)h除或更新的記錄進(jìn)行操作朴爬。
由于HBase底層依賴HDFS,對(duì)于HBase刪除操作來說橡淆,HBase無法在查詢到之前的數(shù)據(jù)并進(jìn)行修改召噩,只能順序讀寫,追加記錄逸爵。那HBase只能追加記錄了具滴,為了更新或刪除數(shù)據(jù),HBase會(huì)插入一條一模一樣的新的數(shù)據(jù)师倔,但是key type會(huì)標(biāo)記成Delete狀態(tài)构韵,以標(biāo)記該記錄被刪除了。在讀取的時(shí)候如果取到了是Delete趋艘,而且時(shí)間是最新的疲恢,那么這條記錄肯定是被刪掉了。
HFile的存儲(chǔ)格式如圖所示瓷胧,每一個(gè)單元格或者KeyValue在HFile中的格式如下:
row length + row key + family length + column family + column qualifier + timestamp + key type
同樣显拳,進(jìn)行更新操作的時(shí)候,也會(huì)重新插入一條新的數(shù)據(jù)來代替在原來數(shù)據(jù)上修改搓萧。新的數(shù)據(jù)的timestamp會(huì)大于老的數(shù)據(jù)杂数,這樣讀取的時(shí)候遇八,判斷時(shí)間戳就可以取出最新的數(shù)據(jù)了。
由于HBase這樣的刪除和更新機(jī)制耍休,如果后面沒有一個(gè)對(duì)于過期數(shù)據(jù)處理的機(jī)制刃永,會(huì)導(dǎo)致過期數(shù)據(jù)越來越大,因此后面的compact操作中的major compact就順便將過期的數(shù)據(jù)刪除掉了羊精。
對(duì)于標(biāo)記為刪除的數(shù)據(jù)斯够,直接刪除。對(duì)于不同時(shí)間戳的多條數(shù)據(jù)喧锦,根據(jù)其保存的最大版本數(shù)據(jù)读规,刪除過期的數(shù)據(jù)。當(dāng)然做major compact的原因不僅僅能夠刪除過期數(shù)據(jù)燃少,還有其他原因束亏,比如合并數(shù)量過多的HFile,具體機(jī)制以后再分析阵具。
參考:
http://blog.csdn.net/iam333/article/details/40431371
https://www.zhihu.com/question/21849618/answer/128580488