在Hbase中快照實(shí)際上就是一份元信息的合集,在對(duì)表進(jìn)行快照時(shí),并不會(huì)涉及到表中實(shí)際數(shù)據(jù)的拷貝,而是僅僅拷貝關(guān)于該表的一些元數(shù)據(jù)信息。
例如組成表Region info,Descriptor描述信息以及與其對(duì)應(yīng)的HFile文件的引用等內(nèi)容。
在Hbase中不僅可以對(duì)表進(jìn)行快照操作,還可以利用快照將表恢復(fù)到之前的狀態(tài),快照可以在線或者離線操作。
注意:Hbase中的快照是基于文件系統(tǒng)級(jí)別進(jìn)行的。
實(shí)際上,利用Hbase的快照操作可以對(duì)表進(jìn)行備份。在Hbase中對(duì)于表的備份包括表復(fù)制,導(dǎo)入導(dǎo)出表或者先將表關(guān)閉之后使用Distcp分布式拷貝來(lái)復(fù)制HDFS中關(guān)于表的Hfile文件等。
對(duì)于前兩種方式,實(shí)際上調(diào)用了MapReduce來(lái)掃描整張表的數(shù)據(jù),然后將表復(fù)制出去。因?yàn)楸頂?shù)據(jù)是存放在RegionServer中的,所以需要RegionServer發(fā)生大量的I/O操作。將整張表的數(shù)據(jù)備份出去。
對(duì)于后一種方法,會(huì)將表關(guān)閉來(lái)停止所有的讀寫(xiě)操作,在實(shí)際的生產(chǎn)環(huán)境中很難實(shí)現(xiàn)。
相比之下,在Hbase使用快照機(jī)制優(yōu)勢(shì)就很明顯了,在使用快照過(guò)程中,管理員不需要拷貝整張表的數(shù)據(jù),而直接克隆表的元數(shù)據(jù)信息,因?yàn)椴簧婕按罅康腎/O操作,這對(duì)Regionerver產(chǎn)生的影響最小。
另外,也可以將快照導(dǎo)出到其他Hbase集群,導(dǎo)出操作只是帶有一些額外的集群間的邏輯數(shù)據(jù)的同步而已。
使用快照完成表的備份,是在HDFS層面進(jìn)行的,意味著HMaster和域服務(wù)器與操作無(wú)關(guān),就無(wú)需為不必要的數(shù)據(jù)創(chuàng)建緩存空間,不會(huì)涉及對(duì)整張表的掃描。
使用常規(guī)的表備份方式,因?yàn)闀?huì)創(chuàng)建大量的對(duì)象而引起GC暫停,這會(huì)對(duì)Hbase的性能造成影響,例如DataNode數(shù)據(jù)節(jié)點(diǎn)會(huì)產(chǎn)生額外的網(wǎng)絡(luò)和磁盤(pán)負(fù)載等。
對(duì)于快照來(lái)說(shuō),離線方式指的是將表Disbale掉,由Hbase Master來(lái)遍歷HDFS中的表的元數(shù)據(jù)和Hfile,從而建立引用關(guān)系。
在線方式就是在表正常訪問(wèn)的情況下,其過(guò)程類(lèi)似于Prepare和Commit兩階段的提交。
HMaster收到創(chuàng)建快照命令后,會(huì)作為Coordinator協(xié)調(diào)者從Hbase的Meta表中取出目標(biāo)表的Region和對(duì)應(yīng)的RregionServer信息,這些RegionServer就作為第二階段提交的Participant參與者,Prepare準(zhǔn)備階段會(huì)將表的Region信息做快照,并存儲(chǔ)到HDFS的臨時(shí)目錄,在Commit提交階段會(huì)將HMaster把臨時(shí)目錄改成正確的目錄。在創(chuàng)建快照的過(guò)程中,HMaster和Region server都是通過(guò)Zookeeper進(jìn)行數(shù)據(jù)共享的。
這里使用了Hbase集群,其中包含三個(gè)節(jié)點(diǎn)。在執(zhí)行Hbase快照前,需要在主節(jié)點(diǎn)上進(jìn)入Hbase的“conf”目 錄。 執(zhí) 行“vi hbasesite.xml”命令,在其配置文件中找到“”行,將其下的一行修改為“”,來(lái)啟動(dòng)Hbase的快照功能。
同理,在其他兩個(gè)節(jié)點(diǎn)上分別打開(kāi)上述配置文件,在其中添加“
然后,分別在以上節(jié)點(diǎn)的Hbase的“bin”目錄下執(zhí)行“./stop-hbase.sh” 和“./start-hbase.sh”命令,來(lái)重啟Hbase使上述配置生效。
在主節(jié)點(diǎn)上執(zhí)行“./hbase shell”命令,在控制臺(tái)中執(zhí)行“l(fā)ist”命令,查看數(shù)據(jù)庫(kù)中存在的表信息。例如執(zhí)行“scan ' product'”命令,查看“product”表的內(nèi)容。
執(zhí) 行“s n a p s h o t'product',' productsnapsh ot'” 命 令,針 對(duì) 該 表創(chuàng)建快照,快照名為“productsnapshot”。
在Linux命令行下進(jìn)入Hadoop的“bin”目錄,執(zhí)行“./hdfs dfs -ls /hbase/.hbase-snapshot”命令,查看快照文件存儲(chǔ)信息。
在其中打開(kāi)名為“productsnapshot”的目錄,在其中包含“.snapshotinfo”和“data.manifest”兩個(gè)文件,存儲(chǔ)上述快照的元數(shù)據(jù)信息。
在Hbase控制臺(tái)下執(zhí)行“l(fā)ist_snapshots”命令,可以查看快照信息,包括快照的名稱(chēng),源表以及創(chuàng)建的日期和時(shí)間等。
利用快照可以創(chuàng)建一張新的表,可以實(shí)現(xiàn)表的克隆操作,新表中的數(shù)據(jù)和創(chuàng)建快照時(shí)的表數(shù)據(jù)相同。針對(duì)克隆表的修改操作,不會(huì)影響快照以及原始表。
在Hbase控 制 臺(tái)下 執(zhí) 行“clone_snap'p r o d u c t s n a p s h o t''klproduct'”命令,可以克隆出名為“klproduct”的新表。
利用快照可以將表恢復(fù)到快照創(chuàng)建時(shí)的狀態(tài)。
注意:在恢復(fù)時(shí)需要先將將表Disable掉。
例如執(zhí)行“disable product”,“r e s t o r e_s n a p s h o t'productsnapshot'”,“enable 'product'”命令,可以將表恢復(fù)到之前的狀態(tài)。
執(zhí) 行“delete_snapshot'productsnapshot'”命令,可以刪除指定的快照。
在Hbase集群環(huán)境中,可以將某集群中的Hbase快照導(dǎo)出到另外的集群中。
為此可以先在Linux中進(jìn)入Hbase的“bin”目錄,執(zhí) 行“hbase class org.apache.hadoop.hbase.s n a p s h o t.t o o l.ExportSnapshot-snapshot productsnapshot-copy-to hdfs:///hostname:9000/hbase-mappers 16”命令,可以將名為“productsnapshot”的快照復(fù)制到名為“hostname”的集群中。