Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HBase跨版本数据迁移总结

HBase跨版本数据迁移总结

原创
作者头像
王亮
修改于 2017-08-22 06:53:02
修改于 2017-08-22 06:53:02
2.9K6
举报
文章被收录于专栏:王亮的专栏王亮的专栏

某客户大数据测试场景为:Solr类似画像的数据查出用户标签——通过这些标签在HBase查询详细信息。以上测试功能以及性能。

其中HBase的数据量为500G,Solr约5T。数据均需要从对方的集群人工迁移到我们自己搭建的集群。由于Solr没有在我们集群中集成,优先开始做HBase数据迁移,以下总结了HBase使用以及数据迁移遇到的各种问题以及解决方法。

一.迁移过程遇到问题以及解决

客户HBase版本:Version 0.94.15

腾讯大数据套件HBase版本:Version 1.2.1

客户私有云系统版本(测试):tlinux1.2

遇到的问题以及解决过程如下:

1.HBase运行异常现象一(date和hwclock)

HBase运行偶发不正常,出现组件停止运行的情况,看日志有说时间的差异等信息,但date查看完全一致,想到可能是硬件时间的差异问题,通过hwclock看,确实差异很大,通过hwclock -w调整后基本恢复。后确认初始化脚本中只对腾讯云环境的机器做了硬件时间同步,目前已优化。

2.HBase运行异常现象二(hostname 和/etc/resolv.conf)

HBase再次运行不正常,出现组件停止运行的情况。通过日志看如下错误

ERROR [regionserver//10.0.0.106:16020] regionserver.HRegionServer: Master passed us a different hostname to use; was=10.0.0.106, but now=host-10-0-0-106.openstacklocal

通过hostname看所有机器hostname均为内网IP,猜想可能是网络交互的时候查询什么表导致出现的不一致,查看dns解析信息如下

代码语言:txt
AI代码解释
复制
[root@10 ~]# hostname
10.0.0.106
; generated by /sbin/dhclient-script
#search openstacklocal 0.0.106
#nameserver 10.0.0.2
#nameserver 10.0.0.3

search openstacklocal的情况,猜测是虚拟机的异常行为,注释掉resolv.conf里相关search信息,停掉nscd服务后,重启HBase,再未出现这个错误,HBase运行完全正常。

3.需要支持snappy的发现与修复过程:

  • 迁移表的过程中计划使用官方的import/export工具进行,第一步需要在目标集群建表,通过desc信息在目标集群建表完成后,list可看到表,通过scan查询后,无法查询内容,查日志有如下错误: org.apache.hadoop.HBase.DoNotRetryIOException: Compression algorithm 'snappy' previously failed test. 通过google查询需要HBase支持snappy压缩算法,通过hadoop checknative发现集群默认确实不支持snappy算法(虽然安装snappyrpm
代码语言:txt
AI代码解释
复制
Native library checking:
hadoop:  true /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/lib/native/libhadoop.so
zlib:    true /lib64/libz.so.1
snappy:  false
lz4:     true revision:99
bzip2:   false
openssl: false build does not support openssl.
  • 通过手动建表的方法用以下desc信息建表后可以list查看到表信息。scan无法查看表内容,日志发现如下错误

desc信息:

代码语言:txt
AI代码解释
复制
COLUMN FAMILIES DESCRIPTION                                                                 
{NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}

错误信息:

代码语言:txt
AI代码解释
复制
org.apache.hadoop.HBase.DoNotRetryIOException: java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support
  • 在HBase-site.xml增加属性HBase.regionserver.codecs value为snappy即可,在测试集群通过该方法,HBase启动失败

  • 后确认tlinux1.2的hadoop集群上支持snappy的方法:即需要在特定系统编译hadoop相关本地库(native库)替换hadoop当前的native库,然后HBase的启动环境脚本增加hadoop主目录即可

  • 目前tlinux1.2下的hadoop的nativesnappy库有现网使用,同时需要保证这个hadoop的库可以引用到libjvm.so(jre的一个so文件)直接替换hadoop/lib下的native目录,保证已经安装snappy的rpm包,在HBase-env.sh里添加HADOOP_HOME={Hadoop安装主目录}。再hadoop checknative后发现已支持snappy。逐步全量重启HBase。
代码语言:txt
AI代码解释
复制
Native library checking:
hadoop:  true /data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/lib/native/libhadoop.so
zlib:    true /lib64/libz.so.1
snappy:  true /usr/lib64/libsnappy.so.1
lz4:     true revision:99
bzip2:   false
openssl: false build does not support openssl.

4.HBase0.9.4集群数据表到HBase1.2.1集群数据表的迁移方法

暴力迁移参考http://my.oschina.net/CainGao/blog/616502

1)找到源集群源表在hdfs上的目录位置,直接将该目录移动到目标集群HBase的表在目标集群hdfs上的表根目录下

2)暴力迁移时tableinfo信息是一个文件即.tableinfo.00000001。0.9.4的版本这个文件位于HBase表在hdfs上表目录的根目录下,而1.2.1的这个文件位于HBase表在hdfs上表目录的根目录下的./tabledesc目录下,需要手动创建这个目录并调整这个文件的位置

3) 修改复制过来的表目录文件的属主信息

4) 重启HBase的所有组件

5) 此时登录HBaseshell已经可以通过list查看到迁移过来的表,但scan等操作会失败

6) 通过HBase hbck -fixMeta修复meta信息;HBase hbck -fixAssignments 修复分区。这两个步骤的操作过程中注意观察日志是否有异常,实践中首次尝试此方法有大量错误,发现错误内容为snappy相关,支持snappy后,查看表信息,表内容正常,随机选取表内容对比也正常,可认为此种方法迁移成功。

7) 通过import/export的方法迁移时需要在目标集群手动创建目标表,查看源集群的表结构如下:

import/export参考地址

代码语言:txt
AI代码解释
复制
COLUMN FAMILIES DESCRIPTION                                                                  {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}

通过该desc信息创建新表时出现如下错误:

Unknown argument ignored for column family A: ENCODE_ON_DISK

手动测试只要加这个参数ENCODE_ON_DISK去建表一定会出现这个错误,建表会成功,但表信息里没有这个字段了。经过look查代码发现这个字段在新版本已经废弃,但客户的老集群是版本需要这个字段,通过import的方法无法正常写入、通过步骤6)的暴力迁移成功后(暴力迁移成功兼容了这个字段),查看表的desc信息如下:

代码语言:txt
AI代码解释
复制
COLUMN FAMILIES DESCRIPTION                                                                  {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}

老集群表结构

代码语言:txt
AI代码解释
复制
COLUMN FAMILIES DESCRIPTION                                                                 {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR
EVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}                       
{NAME => 'D', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '2147483647', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TT
L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}

可以看到关于ENCODE_ON_DISK字段在新老版本的定义方法有差异,故我们测试在新集群使用上面的desc信息建表后,再通过import方法导入到HBase。结果依然没有数据写入,可以断定这个参数ENCODE_ON_DISK在HBase1.2.1中完全废弃,新版本采用了一个整字段来包裹这个信息。当老集群有参数时,官方import/export方法在HBase0.9.8到HBase1.2.1直接迁移暂时不可用。

二.后续

在HBase0.9.8集群上建表设置ENCODE_ON_DISK=false(默认为true),在HBase1.2.1上不带ENCODE_ON_DISK建表,使用export/import方法迁移测试研究其他HBase数据跨集群(版本差异,网络不通)迁移方法。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
6 条评论
热度
最新
[hdfs@cdh4 ~]$ hbase hbck -repair2018-06-15 10:08:04,360 INFO [main] Configuration.deprecation: fs.default.name is deprecated. Instead, use fs.defaultFSHBaseFsck command line options: -repair出现这个问题 如何解决呢?网上资料好少
[hdfs@cdh4 ~]$ hbase hbck -repair2018-06-15 10:08:04,360 INFO [main] Configuration.deprecation: fs.default.name is deprecated. Instead, use fs.defaultFSHBaseFsck command line options: -repair出现这个问题 如何解决呢?网上资料好少
回复回复点赞举报
感谢分享
感谢分享
回复回复点赞举报
可以保持运行状态的迁移吗
可以保持运行状态的迁移吗
回复回复点赞举报
每次迁移心惊胆战
每次迁移心惊胆战
回复回复点赞举报
暴力迁移并不容易,唉,还好有作者给的总结,谢谢!
暴力迁移并不容易,唉,还好有作者给的总结,谢谢!
回复回复点赞举报
太棒了,终于让我找到了,满满的干货,赶快充充电。
太棒了,终于让我找到了,满满的干货,赶快充充电。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
pinpoint 修改hbase表TTL值
缘起 Pinpoint接入业务监控后数据量大涨,平均每天Hbase数据增量20G左右,数据量太大,需要对数据进行定期清理,否则监控可用性降低,由于之前环境是由docker-compose部署,查到hbase可以修改表的ttl来清理数据,目前进入pinpoint-hbase容器操作,如果能在hbase表格生成时就修改ttl效果会更佳,该方法需要熟悉docker-compose里面pinpoint-web及pinpoint-hbase部署方法,后期跟进
三杯水Plus
2019/05/13
2.3K0
hbase查看表结构_HBase语法「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说hbase查看表结构_HBase语法「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/06/13
6.6K0
hbase查看表结构_HBase语法「建议收藏」
Hbase-2.0.0_03_Hbase数据模型
HBase中的一行由一个行键和一个或多个列组成,列的值与这些列相关联。存储行时,按行键按字母顺序排列。因此,行键的设计非常重要。目标是以这样一种方式存储数据,即相关的行彼此接近。常见的行键模式是网站域。如果您的行键是域,您可能应该反向存储它们(org.apache.www, org.apache.mail, org.apache.jira)。这样,所有Apache域都在表中彼此接近,而不是基于子域的第一个字母展开。
踏歌行
2020/10/15
1.8K0
Hbase-2.0.0_03_Hbase数据模型
hbase数据同步工具—HashTable/SyncTable
HashTable/SyncTable是一个同步hbase表数据的工具,其通过过程分为两步,这两步都是mapreduce job。和CopyTable工具一样,他也可以用来在同一个或者不同的集群之间同步部分或者全部的表数据。只不过,相比CopyTable来说,本工具在同步不同集群之间的表数据时表现更好。它不是复制某个区间范围的表数据,而是首先在源集群执行HashTable基于源数据表生成哈希序列,然后在目标集群执行SyncTable基于源数据表、源数据表生成的哈希序列、目标表、目标表生成的哈希序列,对两个表生成的哈希序列进行对比,从而找出缺失的数据。那么在同步的时候就只需要同步缺失的数据就可以了,这可以极大减少带宽和数据传输。
从大数据到人工智能
2022/01/19
1.6K0
15分钟熟悉HBase Shell命令
下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', '列名称1','列名称2','列名称N' 添加记录       put '表名称', '行名称', '列名称:', '值' 查看记录 get '表名称', '行名称' 查看表中的记录总数 count  '表名称' 删除记录 delete  '表名' ,'行
汤高
2018/01/11
2.7K0
Hbase多版本的读写(Shell&Java API版)
Hbase是基于HDFS的NOsql数据库,它很多地方跟数据库差不多,也有很多不同的地方。这里就不一一列举了,不过Hbase有个版本控制的特性,这个特性在很多场景下都会发挥很大的作用。本篇就介绍下基于Shell和Java API的Hbase多版本的读写。 为了更好的理解多版本,我们可以把普通的数据存储理解成二维空间,提供了rowkey,列族,列几个存储的维度。那么版本则相当于二维空间升华到了三维空间,多了时间维度的概念。如果按照默认的操作,当前的时间戳就是版本号,每个数据都可以保留多个版本的数据。你可
用户1154259
2018/01/17
2.8K0
hbase数据清理 原
上面是基本的操作,如果你的表已经很满,满到几乎快把hadoop撑爆的时候,上面的方法是慢慢删除的方法,下面是具体的解释:
domain0
2018/08/02
2.2K0
HBase 分布式数据库
在5、6年前,我们就希望能用分布式存储和分布式数据库来替代集中存储,觉得分布式廉价,而且高可靠。
birdskyws
2018/09/12
2.3K0
HBase 分布式数据库
hadoop 1.1.2和 hive 0.10 和hbase 0.94.9整合
  今天弄了一下hive0.10和hbase0.94.9整合,需要设置的并不多,但是也遇到了一些问题。   1.复制jar包   拷贝hbase-0.94.9.jar,zookeeper-3.4.5.jar,protobuf-java-2.4.0a.jar到hive/lib下,删掉lib下面旧版的jar包。   拷贝hbase-0.94.9.jar到所有hadoop节点的lib文件夹下面,拷贝hbase/confi的hbase-site.xml文件拷贝到所有的hadoop节点conf文件夹下。   2.修改
岑玉海
2018/02/28
7860
HBase数据定义
HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用;
用户9615083
2022/12/25
1.2K0
HBase Shell常用Shell命令
scan的用法很多,参数,过滤条件可以很多,各种组合, 在此不列举过多的例子,参考 help 'scan'
CoderJed
2018/09/13
10.1K1
HBase Shell常用Shell命令
hbase 单机安装部署
这个困扰了很长时间,之前使用cdh版本的,各种报错各种出问题,最终换成了不是cdh版本的。
全栈程序员站长
2022/08/09
6760
hbase 单机安装部署
HBase基本数据操作详解 转
http://blog.csdn.net/u010967382/article/details/37878701
stys35
2019/03/05
9910
一篇文章入门Hbase
HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库,为横向发展类型数据库,提供快速随机访问海量结构化数据,它是Hadoop生态系统,提供对数据的随机实时读/写访问,是Hadoop文件系统的一部分,利用了Hadoop的文件系统(HDFS)提供的容错能力。
王知无-import_bigdata
2019/05/13
7460
一篇文章入门Hbase
Hbase-2.0.0_02_常用操作
主要是常用的hbase shell命令,包括表的创建与删除,表数据的增删查【hbase没有修改】;以及hbase的导出与导入。
踏歌行
2020/10/15
7810
HBase2.2.x 学习笔记
如果指定了 family或者 qualifier则删除的是部分字段,否则是删除整行
前Thoughtworks-杨焱
2021/12/07
4100
Hive与Hbase整合
https://blog.csdn.net/qq_33689414/article/details/80328665
Hongten
2019/02/25
7150
Hbase常用Shell命令
status 查看系统状态 hbase(main):010:0> status 1 active master, 0 backup masters, 4 servers, 0 dead, 6.5000 average load version 查看版本号 hbase(main):011:0> version 1.2.0-cdh5.7.2, rUnknown, Fri Jul 22 12:20:40 PDT 2016 table_help 查看提示信息 hbase(main):012:0> table_hel
用户1154259
2018/01/17
1.4K0
Hadoop基础教程-第10章 HBase:Hadoop数据库(10.5 HBase Shell)(草稿)
第10章 HBase:Hadoop数据库 10.5 HBase Shell 10.5.1 官方快速入门教程 http://hbase.apache.org/book.html#quickstart P
程裕强
2018/01/02
2.2K0
Hadoop基础教程-第10章 HBase:Hadoop数据库(10.5 HBase Shell)(草稿)
如何使用HBase快照实现跨集群全量与增量数据迁移
我们常常会碰到需要迁移HBase数据的场景,当一个HBase集群运行较长时间后,往往数据量都会很大,HBase集群往往支撑的都是线上的业务,不像跑批的Hive/Spark集群,不能随便停机。HBase默认提供import/export方法支持备份和还原,而且支持增量,但是因为是使用HBase的API导出和还原数据,对RegionServer的压力会很大,往往会影响旧集群的在线业务。
Fayson
2018/03/29
4.4K0
如何使用HBase快照实现跨集群全量与增量数据迁移
相关推荐
pinpoint 修改hbase表TTL值
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档