hbase snapshot跨集群复制报错

各位大大好!
    最近我们在生产上采取了从X集群将hbase表通过快照的方式复制到Y集群。但是复制的时候总是报错。我们的具体流程为:
    X集群关闭balance switch→X集群建快照→Y集群执行ExportSnapshot→Y集群disable表→Y集群restore快照→Y集群enable表→目标删除快照。
  •     表的描述为:


红利表描述.png

  •     具体用到的指令为:

  1.     hbase(main):001:0>balance_switch false
  2.     hbase(main):001:0>snapshot  'A' 'snapshotA'
  3.     hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot  ***
  4.     Y集群disable 'A'
  5.     Y集群restore  'snapshotA'
  6.     Y集群enable  'A'

  • 其中第2步和第3步总是会报错

     第一步的报错为time out exception,具体为:

createsnapshottimeout.jpg

 
     第二步的报错为 file not found exception,具体为: 

copysnopshotfilenotfoundexception.png

  •     这两个问题并不是总是会出现(目前第一个问题出现的次数已经极少了),这就很让人头疼了,希望各位大大给点思路,解决一下最近的困扰,谢谢!

已邀请:

smartZY

赞同来自: Leo

snapshot原理比较复杂,可以看下范神hbasefly上的具体的原理介绍。
   简单来说就是master收到snapshot请求,初始化一个procedure,通过zk告知RS需要做snapshot,每一个RS监听到zk变化,内部启动一个snapshot 的procedure,默认情况下还还需要再开一个flush的procedure。(可以通过snapshot 传入skip_flush来跳过flush)。master监听zk直到所有的RS的snapshot procedure完成,最后做一些收尾工作。
回到这个问题,看日志是procedure执行超时了,大概率是某一个RS执行 snapshot的procedure超时导致。解决办法我想到的有两点:
     1.skip_flush。原因:大表的flush比较耗时,尤其sata盘IO吞吐比较差劲,如果跳过flush则会大大减少snapshot的执行时间,带来的风险是最近的更新不能刷写到快照里。
     2.增大超时配置,默认是300s,但是我看你日志里显示是60s之后就超时掉了,需要你这边核对下两个参数,一个是master端的超时配置:hbase.snapshot.master.timeout.millis,这个是snapshot整体在master端的超时时间conf key。第二个是RS端 procedure配置:hbase.snapshot.region.timeout。可以再hbase-site.xml里修改上面两个配置,比如从300s增加到600s。理论上没有什么风险。
 
至于ExportSnapshot 失败的原因,我意淫下,是否是snapshot不成功,遗留的脏数据导致的?但是正常来说snapshot不成功,所有数据都会回滚,这点我也说不好。
 
有说的不对的地方有请各位大神大佬指正

要回复问题请先登录注册