专栏首页我是攻城师Hadoop+Hbase集群数据迁移问题

Hadoop+Hbase集群数据迁移问题

数据迁移或备份是任何一个公司都有可能到遇到的一件事,有关hbase数据迁移,官网也给出了几种方案,这里比较推荐使用hadoop distcp这种方式迁移。比较适合大数据量或者跨版本集群之间的数据迁移服务。 版本 Hadoop2.7.1 Hbase0.98.12 今天在迁移同版本的hbase数据时,在使用Hadoop distcp时发现下图的一个问题:

这个错误时,是由于源文件的大小与目标文件大小不一致造成的,出现这个问题的原因不明确,然后在网上google查找类似错误,发现没有一样的例子,有的都是 关于crc文件校验和不匹配的问题,而上述错误,则是文件大小不一致,重试3次之后,都是类似错误,所以试着去hadoop的官网文档找答案,发现官网文档distcp里面 有个update的参数,官网解释如下:

什么意思呢? 意思是如果再拷贝过程中,源文件和目标文件出现大小,块大小或者是校验和不一致的情况,会强制使用源文件替换目标文件,不到万不得己的 时候不要使用,使用这个需要谨慎,因为它可能会改变目标路径。 举个例子: 假设现在有A集群数据要迁移到B集群数据,并且Hbase的结构目录保持一致: A集群数据迁移的目录如下:

Java代码

  1. /data/01/a
  2. /data/01/b
  3. /data/01/c
  4. /data/01/d
  5. /data/01/e

理想情况下,B集群迁移过去的目录是跟A集群的目录一致:

Java代码

  1. /data/01/a
  2. /data/01/b
  3. /data/01/c
  4. /data/01/d
  5. /data/01/e

但由于使用了-update之后,很有可能变成下面的目录结构:

Java代码

  1. /data/01
  2. /data/a
  3. /data/b
  4. /data/c
  5. /data/d
  6. /data/e

出现这种情况,在update的文档已经描述了,因为使用这个命令时,会强制保留源文件的任何信息包括路径, 这样以来才能100%保证拷贝过来的数据是不能发生任何变化的,虽然目录错位了,但是数据正确,可以通过 一个小窍门解决这个问题,在拷贝的时候,如果已经知道某个job会出现这种情况,就提前将其目录的路径填写 完整,这样就不用再手动移动文件到正确的目录里面了。比如原来我的迁移命令是这样的:

Java代码

  1. hadoop distcp hdfs://10.0.0.100:8020/hbase/data/default/ETLDB hdfs://10.0.0.101:8020/hbase/data/default

可以正确迁移数据,但如果使用了update后,应该使用下面的路径,注意目标路径上加了表名,如果不存在,如果提前创建下

Java代码

  1. hadoop distcp -update hdfs://10.0.0.100:8020/hbase/data/default/ETLDB hdfs://10.0.0.101:8020/hbase/data/default/ETLDB

试想一个,如果你的hbase表有10000多个region,那么则意味着,你需要处理这10000个错位的目录到正确的目录里面, 虽然写个脚本也能自动化处理,但是这样的耗时也挺长,而且谁能保证,脚本不会出现问题,所以不推荐事后修补的方式。 迁移完成之后,启动hbase集群服务,并执行如下的两个命令,恢复元数据,否则hbase集群不会识别新迁移过来的表:

Java代码

  1. ./hbase hbck -fix
  2. ./hbase hbck -repairHoles

总结: (1)出现问题,不用紧张,可以先google找类似异常,如果没有则需要多看官网的distcp文档参数的介绍,注意文档的版本和你的hadoop的版本需要一致,否则有些参数可能已经废弃,过时,或者不支持。 (2)如果distcp一个很大的目录时,出现 xxx file not exist 的IO异常,可以试着减少拷贝的文件目录数量,如果还是不能通过,则需要回到1方式查找问题,大部分情况下,我们拷贝一个很少数量的目录时,是不容易出现问题的。 参考文档: http://hadoop.apache.org/docs/r2.7.1/hadoop-distcp/DistCp.html

本文分享自微信公众号 - 我是攻城师(woshigcs),作者:散仙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何使用scala+spark读写hbase?

    我是攻城师
  • 8 个你可能不知道的 Docker 知识

    我是攻城师
  • 为什么要用Docker?

    我是攻城师
  • Python+Lucene

    pylucene让Python可以调用Lucene API实现搜索,这个项目紧跟Lucene的步调,对用惯了Python的同学来说是个福音。 pylucen...

    py3study
  • 详解Android 获取手机中微信聊天记录方法

    首先我们要知道,微信的聊天记录一般是不提供给我们获取的,所以一般情况下我们手机没root的话就拿不到了。就算是root后的手机,想要获取微信的EnMicroMs...

    砸漏
  • linux+python+django环境搭建+建立服务

    最近自己在搞linux+python+django服务简单的整理下自己得环境搭建与建立服务,启动服务,

    测试小兵
  • python 实现多维数组(array)排序

    以上这篇python 实现多维数组(array)排序就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • [Keras实用技巧]·错误Sequential has no attribution “validation_data”解决

    错误描述:Sequential has no attribution “validation_data”

    小宋是呢
  • Python终端输出打印彩色字体的方法

    一  实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。    转义序列是以ESC开头,即用\033来完成(ESC的A...

    用户1214487
  • 特征锦囊:如何把“年龄”字段按照我们的阈值分段?

    我们在进行特征处理的时候,也有的时候会遇到一些变量,比如说年龄,然后我们想要按照我们想要的阈值进行分类,比如说低于18岁的作为一类,18-30岁的作为一类,那么...

    Sam Gor

扫码关注云+社区

领取腾讯云代金券