转载请标明出处:http://blackwing.iteye.com/admin/blogs/2188077
数据量大的情况下,通过直接读取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