天天看点

解决直接读HFile时因表数据写入而导致文件目录变化问题

转载请标明出处: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

继续阅读