hbase数据迁移到另一集群上
通常我们都会有将hbase表数据迁到另一个hbase表中业务需要,这种不要着急,我选择一种最适合的方式,因为每种方式处理的数据量、对集群的压力都是有差异的
总的划分可以分为命令行和API两种方式,本人记录以下几种命令方式,有错误之处请指正,本篇也仅是自己一些行为记录
hbase数据 导出 导入;
----------------------使用命令-------------------------1
从一个HBase上把数据export到HDFS生产文件a,再把这个文件a上传到要导入的集群上,使用import导入到数据库中,注意数据库中的表名是否存在
hbase org.apache.hadoop.hbase.mapreduce.Driver export t_gps_std_20190225 hdfs:///tmp/zyr/t_gps_std_20190225
hbase org.apache.hadoop.hbase.mapreduce.Driver import t_gps_std_20190225 hdfs:///tmp/hbasedatabak/part-m-00000
--------------带参数的方式--------------------------2
-D hbase.mapreduce.scan.row.start=<ROWSTART>
-D hbase.mapreduce.scan.row.stop=<ROWSTOP>
Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]
hbase org.apache.hadoop.hbase.mapreduce.Driver export -D hbase.mapreduce.scan.row.start=0 -D hbase.mapreduce.scan.row.stop=1000?* t_gps_sq_20190424 hdfs:///tmp/zyr/t_gps_sq_20190424_
hbase org.apache.hadoop.hbase.mapreduce.Driver export -D hbase.mapreduce.scan.row.start=\xAD\x5C\xAC\xF6w -D hbase.mapreduce.scan.row.stop=\xAD\x5C\xAD1\xFF?* t_gps_sq_20190424 hdfs:///tmp/zyr/t_gps_sq_20190424___
HBase表快照
--------------HBase表快照功能--------------------------3
HBase快照允许管理员不拷贝数据,而直接克隆一张表,这对域服务器产生的影响最小。将快照导出至其他集群不会直接影响到任何服务器
1.开启快照功能,在hbase-site.xml文件中添加如下配置项:
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
2.命令操作
在hbase shell中使用 clone_snapshot,delete_snapshot, list_snapshots, restore_snapshot, snapshot命令。
snapshot: 为某表创建快照 ,例如 snapshot ‘harve_role’,'20180108-harve_role'
list_snapshots:查看快照列表
list_snapshots 'map.*' : 查找以map开头的snapshot
delete_snapshot:删除快照,例如 delete_snapshot '20180108-harve_role'
clone_snapshot:基于快照,clone一个新表。例如 clone_snapshot '20180108-harve_role', ‘harve_role2’
restore_snapshot:基于快照恢复表 例如:disable ‘harve_role’ restore_snapshot '20180108-harve_role'
工具ExportSnapshot:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t_fault_20200327 -copy-to hdfs://mine:8020/hbase/ -mappers 16
执行该命令后,在mine:9000的hdfs中会把t_fault_20200327文件夹copy到/hbase/.hbase-snapshot文件下,进入mine这个hbase集群,执行list_snapshots会看到有一个快照: t_fault_20200327,通过命令clone_snapshot可以把该快照copy成一个新的表,不用提前创建表,新表的region个数等信息完全与快照保持一致。
在使用snapshot把一个集群的数据copy到新集群后,应用程序开启双写,然后可以使用Export工具把快照与双写之间的数据导入到新集群,从而实现数据迁移,为保障数据不丢失,Export导出时指定的时间范围可以适当放宽。
具体操作如下:
(1)创建snapshot
snapshot 'tableName', ‘snapshotName'
(2)迁移snapshot
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot snapshot_src_table \
-copy-fromhdfs://analye6/hbase\
-copy-tohdfs://mine:8020/hbase\
-mappers 20 \
-bandwidth 1024
这种方式用于将快照表迁移到另外一个集群的时候使用,使用MR进行数据的拷贝,速度很快,使用的时候记得设置好bandwidth参数,以免由于网络打满导致的线上业务故障。
(3)恢复snapshot
restore_snapshot ‘snapshotName’
备注:这种方式需要对表进行过disable才能进行restore_snapshot的操作,如果这个还在写入数据,则需要采用bulkload的方式导入。
(4)将snapshot使用bulkload的方式导入
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 \
hdfs://analye6/hbase/archive/datapath/tablename/filename tablename
备注1:这种方式需要将所有的文件进行遍历并全部通过bulkload导入,上面的只是一个文件的导入,这种方式不需要disable表。
备注2:上面的操作1、3、4都是在hbase shell中执行。
Hbase数据迁移之bulkload
与HBase原生Client API和Mapreduce任务(快照、导入命令都基于MR)相比,“Bulk Loading”方法直接生成HFile算是一种比较高效便捷的方法。
BulkLoad将数据批量导入HBase中。支持通过命令行和API两种操作方式,下面注意记录本人使用命令方式
1、数据准备
准备StoreFile存储格式的文件,通过下面任意一个方式都可得到,
1)自己Mapreduce得到
2)如果测试可以copy一个hbase表的文件
操作步骤:
需要导入hbase表的数据保存到hdfs文件系统中,文件 --> hdfs
在hbase中建表,create 'tablename','familyname'
2、导入数据到hbase表里
ImportTsv命令,该命令是把tsv文件转成hfile文件再导入表中,通常在使用该命令时注意列族,文件大小划分等参数设置,
直接导入表中: hadoop jar /opt/cloudera/parcels/CDH/jars/hbase-server-1.0.0-cdh5.4.0.jar importtsv \-Dimporttsv.separator="," \-Dhbase.hregion.max.filesize=20971520 \-Dimporttsv.columns=HBASE_ROW_KEY,familyname:cellname tablename \/test/test.cvs 或者 导入到hfile文件中 export HBASE_HOME=/opt/hbase export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.0.0-cdh5.4.0.jar importtsv \ -Dimporttsv.separator="," \ -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age tablename \ -Dimporttsv.bulk.output=/test/bulkload/outputdir \/test/bulkload/simple1.cvs
CompleteBulkLoad命令,该命令将importtsv或HFileOutputFormat的结果文件导入到某张表中
示例: hadoop jar hbase-VERSION.jar completebulkload [-c /path/to/hbase/config/hbase-site.xml] /myfile mytable 实例: hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=64 /file tablename 或者 sudo -u hbase hadoop jar $HBASE_HOME/hbase-server-1.2.0-cdh5.15.1.jar completebulkload -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 /file tablename
使用中出现错误记录
(1)找不到jar包时处理:导入环境
export HBASE_HOME=/opt/hbase export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` 或者CDH版本使用 export HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH/lib/hbase/lib/*
(2)目录结构
保存目录格式符合 **/列族名/hfile 规则,仅仅适合一次对单列族组织成HFile文件
(3)文件权限
sudo hdfs hdfs dfs chown hbase:hbase /test/hfile/f0
hdfs dfs chmod 711 /test/hfile/f0
(4)文件个数太多
错误:Trying to load more than 32 hfiles to one family of one region
执行命令时带参数一次性导入多个文件,默认是32个
-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024
3、查看导入的数据
scan 't1', {COLUMNS => ['f0'], LIMIT => 10}
4、小结
importtsv工具的使用场景较为广泛,适应于用户有时希望自己编程生成数据,或以其它格式导入数据,importtsv须要在导入前确定每条数据column维度。须要对工具改造时查看ImportTsv.java和HFileOutputFormat的javaDoc文档。
completebulkload工具同样可以编程化实现,需要查看LoadIncrementalHFiles类