數據量大的情況下,通過直接讀取HFile來獲得hbase表數據性能比通過HTable讀取有優勢,但當讀取HFile時,table同時有數據寫入,那麼可能因爲split、compact等原因導致某些HFile不存在,導致任務失敗。
如果通過hdfs的snapshot快照功能,對某個table進行快照後,在讀取快照,則不會出現問題。步驟如下:
1. 把需要快照的表設置爲snapshottable
hdfs dfsadmin -allowSnapshot <path>
對應的java入口
HdfsAdmin : void allowSnapshot(Path path)
2. 生成快照
hdfs dfs -createSnapshot <path> [<snapshotName>]
對應的java入口
FileSystem : createSnapshot(Path path) 或者 createSnapshot(Path path, String snapshotName)
快照會存放在被快照目錄的隱藏文件.snapshot目錄下;創建snapshot時,需要是文件夾的owner
接下來,之間讀取.snapshot目錄下對應快照就行。
官方參考文章:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html