zoukankan      html  css  js  c++  java
  • 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=xADx5CxACxF6w -D hbase.mapreduce.scan.row.stop=xADx5CxAD1xFF?* 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类

  • 相关阅读:
    关于@Mapper和@Repository的一点小理解
    记一下数据库的多表查询
    移动端时间控件 HTML5+ 的 pickDate 和 MUI 的 dtpicker 的使用与对比
    即时搜索:对于ios自带输入法输入中文时多次触发input事件的处理
    thead固定,tbody高度超出时滚动的实现方法
    数字位数不够,进行前补零的JS最简实现方案
    hbuilder ios 打包失败,无法导入p12证书的解决方案
    通过jQuery获取容器尺寸的方法height()、innerHeight()、outerHeight()的区别总结
    通过js添加的DOM节点的click事件绑定不上的解决方案以及IOS下click事件委派失效的解决方案
    vue.js项目构建——构建方式:vue-cli脚手架
  • 原文地址:https://www.cnblogs.com/zyanrong/p/10846042.html
Copyright © 2011-2022 走看看