HBase表数据倾斜治理_读取export snapshot并bulkload到不同结构hbase表中
1.SnapshotScanMR方法读取hbase快照的两种使用场景
前文我们提到snapshot的主要作用就是帮助我们在扫描HBase表数据时绕过RegionServer直接从HDFS中读取Hfile文件数据,减轻RegionServer的压力。
实际上SnapshotScanMR可以读取的快照有两种:
- 读取本地hbase集群上的快照。
- 读取从其他hbase集群上export到本地的快照。
1.1读取本地快照
hbase库中存储的表快照,也就是在hbase shell中通过命令list_snapshots可以查到的快照表,它们的快照文件是存储在hbase默认文件夹中的。
可以在hbase-site.xml文件中如下配置hbase默认文件夹:
1 | <property> |
程序在创建HBaseConfiguration对象时自动加载该参数,initTableSnapshotMapperJob方法会到该目录下去寻找快照文件。
1.2读取export快照
从其他hbase集群中使用export导出的快照时,hbase客户端会把快照文件指向的数据文件也一并导出。使用initTableSnapshotMapperJob方法同样可以直接读取这种快照文件,不过必须在代码中将hbase.rootdir设置为快照文件的存储路径,或者将快照文件和数据文件移动到hbase默认文件夹下。
tips:将export导出的快照文件和数据文件放到hbase默认文件夹下,如果版本等信息一致,可以使用命令list_snapshots查到该快照表。
2.应用实例
2.1export快照文件
快照文件具体结构会在后续博文中进行介绍。
1 | E:\HBase\hbase\bin>hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot "fellowshell_snapshot" -copy-to hdfs://localhost:9005/exportSnapshot |
语法说明:
1 | hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 快照名 -copy-to 目标文件夹 |
export日志如下,可以看出导出过程实际上也是一个MR任务:
1 | SLF4J: Class path contains multiple SLF4J bindings. |
2.2在新hbase集群中建表
1 | hbase(main):017:0> create "exportSnapshotReverse","d" |
2.3创建mapper类
1 | public class ReverseMapper extends TableMapper<ImmutableBytesWritable, Put> { |
2.4创建driver类
1 | public class ExportReverseDriver { |
2.5重点回顾
2.5.1 hbase.rootdir
通过conf.set("hbase.rootdir", "hdfs://localhost:9005/exportSnapshot")将hbase.rootdir设置为存储export快照文件的文件夹。
但是要注意此程序后续还需不需要使用该参数,如果还需要使用则需注意避免影响hbase系统的文件目录结构。
2.5.2 initTableSnapshotMapperJob方法tmp参数
initTableSnapshotMapperJob方法会在添加的tmp目录下创建临时文件夹,用来存放在hbase客户端本地临时创建的region,该方法先根据快照文件和数据文件在该文件夹中重建快照表的region,然后再scan扫描这些region获取数据。
创建tmp文件夹时:
- 如果输入参数tmp没有指定文件系统,如
/testpath,则tmp文件夹目录为fs.defaultFS+“/testpath”; - 如果指定了文件系统,如
hdfs://localhost:9005/testpath,则tmp文件加就是该参数值。
扫描读取数据时:
- 从fs.defaultFS目录往下去寻找该快照表的region。
如果我们没有在core-site.xml文件中设置所以在配置fs.defaultFS,则默认fs.defaultFS为本地文件系统file:///,同时我们也可以在代码中通过conf.set("fs.defaultFS", hdfsRoot)来重新配置fs.defaultFS。
总之无论如何配置fs.defaultFS和tmp参数时,一定要保证创建tmp文件夹和扫描读取tmp文件夹的路径是在同一个文件系统中。